之前寫過將CSV檔案內容轉換成ADO.NET DataTable物件,今天的需求剛好反過來,要將DataTable的內容匯出成CSV,邏輯上簡單許多,但還是PO文一篇,下回需要時比較好找。

static string Quoted(string v) {
    return "\"" + v.Replace(@"""", @"""""") + "\"";
}
 
static void SaveDataTableAsCSV(DataTable t, string csvPath)
{
    StringBuilder sb = new StringBuilder();
    List<string> l = new List<string>();
    foreach (DataColumn c in t.Columns)
        l.Add(Quoted(c.ColumnName));
    sb.AppendLine(string.Join(",", l.ToArray()));
    foreach (DataRow r in t.Rows)
    {
        l.Clear();
        for (int i = 0; i < t.Columns.Count; i++)
            l.Add(Quoted(r[i].ToString()));
        sb.AppendLine(string.Join(",", l.ToArray()));
    }
    File.WriteAllText(csvPath, sb.ToString(), Encoding.UTF8);
}

註:

  1. File.WriteAllText時要加註Encoding.UTF8以確定輸出檔案會包含BOM檔頭,Excel才能正確開啟。
  2. 測試發現,欄位內容值即使包含換行符號,也能被Excel正確解析,讓我驚喜了一下。

Comments

# by jain

這篇好用,謝謝分享!

Post a comment