.NET frameworkでDataTableからCSV出力がしたい
解決したいこと
Data Grid ViewのDatasourceとしてData Tableを用いています。
これをボタンクリックでCSV出力したいです。
発生している問題・エラー
CSV保存はできるのですが、中身が空で…。
ヘッダーすらできておりません。
フォイルサイズが0のままになってしまいます。
該当するソースコード
ソースコードを入力
/// <summary>
/// 買い物リストをcsvファイルとして保存する
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <param name="csvPath"></param>
/// <param name="writeHeader"></param>
private void SaveButton_Click(object sender, EventArgs e, object csvPath, object writeHeader)
{
_ = dateTimePicker.Value.ToLongDateString();
SaveFileDialog dlg = new SaveFileDialog
{
Title = "ファイルを保存する",
FileName = "ItemList.csv",
Filter = "CSV(カンマ区切り)|*.csv",
};
if (dlg.ShowDialog() == DialogResult.Cancel)
{
MessageBox.Show("キャンセルされました");
return;
}
else
{
StreamWriter streamWriter = new System.IO.StreamWriter(dlg.FileName, false, Encoding.GetEncoding("Shift_JIS"));
System.IO.StreamWriter writer = streamWriter;
var colCount = dt.Columns.Count;
int lastColIndex = colCount - 1;
if ((bool)writeHeader)
{
for (int i = 0; i < colCount; i++)
{
string field = dt.Columns[i].Caption;
field = EncloseDoubleQuotesIfNeed(field);
writer.Write(field);
if (lastColIndex > i)
{
writer.Write(',');
}
}
writer.Write("\r\n");
}
foreach (DataRow row in dt.Rows)
{
for (int i = 0; i < colCount; i++)
{
string field = row[i].ToString();
field = EncloseDoubleQuotesIfNeed(field);
writer.Write(field);
if (lastColIndex > i)
{
writer.Write(',');
}
}
//改行する
writer.Write("\r\n");
}
}
}
/// <summary>
/// 文字列をダブルクォートで囲む
/// </summary>
private string EncloseDoubleQuotesIfNeed(string field)
{
if (NeedEncloseDoubleQuotes(field))
{
return EncloseDoubleQuotes(field);
}
return field;
}
/// <summary>
/// 文字列をダブルクォートで囲む
/// </summary>
private string EncloseDoubleQuotes(string field)
{
if (field.IndexOf('"') > -1)
{
//"を""とする
field = field.Replace("\"", "\"\"");
}
return "\"" + field + "\"";
}
private bool NeedEncloseDoubleQuotes(string field)
{
return field.IndexOf('"') > -1 ||
field.IndexOf(',') > -1 ||
field.IndexOf('\r') > -1 ||
field.IndexOf('\n') > -1 ||
field.StartsWith(" ") ||
field.StartsWith("\t") ||
field.EndsWith(" ") ||
field.EndsWith("\t");
}
自分で試したこと
こちらを参照しました。