# [C#]匯出 .csv
###### tags: `c#` `.csv` `Visual Studio`
> [time= 2019 11 07 ]
<br>
## 匯出
```csharp=
/// <summary>
/// 匯出 CSV
/// </summary>
/// <param name="dataTable">匯出的資料</param>
/// <param name="exportFile">匯出路徑</param>
/// <param name="encoding">文字編碼</param>
/// <param name="wirteHead">是否輸出表頭</param>
public static void exportDataAsCsvString (DataTable dataTable, string exportFile, Encoding encoding, bool writeHead = true) {
StringBuilder sb = new StringBuilder ();
if (writeHead) {
List<string> headers = new List<string> ();
for (int i = 0; i < dataTable.Columns.Count; i++) {
DataColumn column = dataTable.Columns[i];
headers.Add (column.ColumnName);
}
sb.AppendLine (string.Join (",", headers.ToArray ()));
}
for (int i = 0; i < dataTable.Rows.Count; i++) {
DataRow row = dataTable.Rows[i];
var s = string.Join (",", row.ItemArray);
sb.AppendLine (s.ToString ());
}
System.IO.File.WriteAllText (exportFile, sb.ToString (), encoding);
}
```
<br><br><br>
## 設定欄位名稱 & 排序欄位順序
* 設定欄位名稱
通常要看報表的人,會希望欄位中文,所以要特別設定欄位名稱
<br>
* 排序欄位順序 & 過濾欄位
C# 有時候從資料庫撈出的資料欄位排序順序不是按照 SQL 語法撈出來的樣子,甚至會多出一些系統的資訊欄位。這個時候就要去設定它的欄位順序和過濾不必要的欄位。
```csharp=
/// <summary>
/// 設定欄位名稱 & 排序欄位順序
/// </summary>
/// <param name="dataTable">匯出的資料</param>
/// <param name="titleColumnName">欄位順序</param>
/// <param name="setColumnName">設定爛為名稱</param>
/// <returns></returns>
public DataTable resetDataTable (DataTable dataTable, List<string> titleColumnName, List<string> setColumnName, bool wirteHead) {
#region 預設欄位名稱
if (wirteHead) {
if (setColumnName.Count == 0) {
for (int i = 0; i < titleColumnName.Count; i++) {
setColumnName.Add (""); //空值,後續自動給資料庫的欄位名稱
}
} else if (titleColumnName.Count > setColumnName.Count) {
throw new Exception ("setColumnName 的欄位有缺,請與 titleColumnName 的欄位數相同。");
}
}
#endregion
#region 刪除不想要的欄位(主要是刪除 ExtensionData 欄位)
var delColumnList = new List<string> ();
foreach (DataColumn column in dataTable.Columns) {
if (!titleColumnName.Contains (column.ColumnName)) {
delColumnList.Add (column.ColumnName);
}
}
foreach (var columnName in delColumnList) {
dataTable.Columns.Remove (columnName);
}
#endregion
for (int i = 0; i < titleColumnName.Count; i++) {
//利用 ColumnName 來排序欄位順序
dataTable.Columns[titleColumnName[i].ToString ()].SetOrdinal (i);
//設定中文欄位
if (wirteHead && !String.IsNullOrEmpty (setColumnName[i].ToString ())) {
dataTable.Columns[titleColumnName[i].ToString ()].ColumnName = setColumnName[i].ToString ();
}
}
return dataTable;
}
```
<br><br><br>
## 程式使用範例
```csharp=
static void Main (string[] args) {
var showColumnName = new List<string> {
"name",
"email",
"message"
};
var chineseColumnName = new List<string> {
"名字",
"mail",
"訊息"
};
DataTable resultDT = "你要匯出的資料表";
DataTable exportDatas = resetDataTable(resultDT, showColumnName, chineseColumnName, true);
string exportFile = "path/filname.csv";
Encoding encodingType = Encoding.UTF8;
exportDataAsCsvString(exportDatas, exportFile, encodingType, true);
}
```