DataTable 导出CSV
#region 导出事件
public void btn_Export_Click(object send, EventArgs e)
{
if (_frm.dgv_PickGoods.RowCount <= 0)
{
MessageBox.Show("没有需要导出的数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
getSearchObj();
StateBar sb = new StateBar();
sb.Show("系统正在处理,请稍等...", true);
ExportPickGoodsOrderObject rpo = null;
IOut_PickingGoodsList Proxy = SPF.Create<IOut_PickingGoodsList>("Out_PickingGoodsList_SRV");
try
{
rpo = Proxy.Select_ExportPickGoodsOrder(Out_PickingGoodsListObj);
sb.Close();
if (rpo != null)
{
if (rpo.DataSetData.Tables["Out_PickingGoodsList"].Rows.Count == 0)
{
MessageBox.Show("没有需要导出的数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
}
}
catch
{
sb.Close();
}
//导出
ExportData(rpo.DataSetData.Tables["Out_PickingGoodsList"]);
}
#endregion
#region 导出CSV文件方法
/// <summary>
/// 导出DataTable中的数据到CSV文件
/// </summary>
/// <param name="dt">DataTable</param>
public void ExportData(DataTable dt)
{
SaveFileDialog dlg = new SaveFileDialog();
// 筛选
dlg.Filter = "CSV文件(*.csv)|*.csv|文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";
//文件名
dlg.FileName = "拣货单信息导出-" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".csv";
// 使文件对话框将其当前目录还原为用户更改目录以搜索文件之前的初始值
dlg.RestoreDirectory = true;
// 是否确定导出
if (dlg.ShowDialog() == DialogResult.OK)
{
TextWriter writer = null;
try
{
string text = "";
// 使用指定编码和缓冲区大小,为指定路径上的指定文件初始化 StreamWriter 类的新实例。
// 如果该文件存在,则可以将其覆盖或向其追加。如果该文件不存在,则此构造函数将创建一个新文件。
writer = new StreamWriter(dlg.FileName, false, Encoding.Default);
//// 在第一行写入表名
//writer.WriteLine("CSV文件");
DataTable tb = dt;
// 取得列的个数
int count = tb.Columns.Count;
string[] fields = new string[count];
// 循环添加列名
for (int i = 0; i < count; i++)
{
DataColumn column = tb.Columns[i];
fields[i] = column.Caption;
}
text = string.Join(",", fields);
writer.WriteLine(text);
// 遍历行
foreach (DataRow row in tb.Rows)
{
// 给每一行添加列单元
for (int i = 0; i < count; i++)
{
if (row[i] == null)
{
fields[i] = "";
continue;
}
if (row[i] == DBNull.Value)
{
fields[i] = "";
continue;
}
string field = row[i].ToString();
// CSV格式有规定,比如,如果字段中有逗号、双引号、回车换行符、前或后置空格,
// 必须把字段用双引号扩起来,如果文本中有双引号,必须用两个双引号替换
field = field.Replace("\"", "\"\"");
if (field.IndexOf(',') >= 0)
{
fields[i] = string.Format("\"{0}\"", field);
continue;
}
if (field.IndexOf('\r') >= 0)
{
fields[i] = string.Format("\"{0}\"", field);
continue;
}
if (field.IndexOf('\n') >= 0)
{
fields[i] = string.Format("\"{0}\"", field);
continue;
}
if (field.IndexOf('\"') >= 0)
{
fields[i] = string.Format("\"{0}\"", field);
continue;
}
if (field != field.Trim())
{
fields[i] = string.Format("\"{0}\"", field);
continue;
}
fields[i] = row[i].ToString();
}
text = string.Join(",", fields);
writer.WriteLine(text);
}
MessageBox.Show("导出成功", "提示");
}
catch (Exception ex)
{
MessageBox.Show("导出失败", "提示");
return;
}
finally
{
if (writer != null)
{
writer.Close();
}
}
}
}
#endregion