如何快速将DataTable中的数据保存到Excel
遇到的问题
① 保存到Excel的时间比较长,用户体验差
② 保存失败(原因:Excel程序打开;或前一次调用Excel线程没有关闭,等)
开发环境
① 开发工具:VS2010
② .NET框架: 3.5
③调用的DLL :Microsoft.Office.Interop.Excel.dll
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200510205417339.png#pic_center)
需要在引用中“”添加引用
具体代码
private void SaveDataToExcel(DataTable dt)
{
string tempName = DateTime.Now.ToString("yyyyMMddHHmm") + ".xls"; //创建Excel的文件名字
string filePath = "";
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook wBook = null;
Microsoft.Office.Interop.Excel._Worksheet wSheet = null;
Microsoft.Office.Interop.Excel.Range range = null;
if (app == null)
{
throw new Exception("无法创建Excel对象");
}
filePath = Application.StartupPath + DateTime.Now.ToString("yyyyMMdd"); //在应用程序目录下 创建一个当前日期的文件夹
if (!Directory.Exists(filePath))
{//创建文件夹
Directory.CreateDirectory(filePath);
}
try
{
app.Visible = false;
wBook = app.Workbooks.Add(true);
wSheet = (Microsoft.Office.Interop.Excel._Worksheet)wBook.Sheets[1];
object[,] objData = new object[dt.Rows.Count + 1, dt.Columns.Count + 1];
for (int i = 0; i < dt.Columns.Count; i++)
{
//首先将数据写入到一个二维数组中
objData[0, i] = dt.Columns[i].Caption; //写入列标题
}
if (dt.Rows.Count > 0)
{
for (int i = 0; i < dt.Rows.Count; i++)
{
for (int j = 0; j < dt.Columns.Count; j++) //写入内容
{
if (dt.Rows[i][j].Equals(float.NaN))
{
objData[i + 1, j] = "-";
}
else
{
objData[i + 1, j] = dt.Rows[i][j];
}
}
}
}
string startCol = "A"; //这里关键, 计算要替换第二区域
int iCnt = (dt.Columns.Count - 1) / 26;
string endColSignal = ((iCnt == 0) ? "" : ((char)('A' + (iCnt - 1))).ToString());
string endCol = endColSignal + ((char)('A' + dt.Columns.Count - iCnt * 26 - 1)).ToString();
range = wSheet.get_Range(startCol + "1", endCol + (dt.Rows.Count + 1).ToString());
range.Value2 = objData; //给Excel中的Range整体赋值
range.EntireColumn.AutoFit(); //设定Excel列宽度自适应
range.Font.Size = 9;
range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;//居中
range.Borders.LineStyle = Microsoft.Office.Interop.Excel.XlLineStyle.xlContinuous;//设置边框
range.Borders.Weight = Microsoft.Office.Interop.Excel.XlBorderWeight.xlThin;//边框常规粗细
wSheet.get_Range(startCol + "1", endCol + "1").Font.Bold = 1; //Excel文件列名 字体设定为Bold
//设置禁止弹出保存和覆盖的询问 提示框
app.DisplayAlerts = false;
app.AlertBeforeOverwriting = false;
wSheet.SaveAs(filePath + "\\" + tempName);
wBook.Close();
}
catch (Exception ex)
{
MessageBox.Show("导出Excel出错!原因是:" + ex.Message);
}
finally
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(wBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
wBook = null;
wSheet = null;
range = null;
//app.Quit();
app = null;
GC.Collect(); //前提是:所有对象=null后才能调用此函数,然后才会结束exce在资源管理器中的进程。
}
}
这个方法可以快速将数据保存到Excel。使用的.NET框架不同,SaveAs函数可能也会不同,形参可能不一样。(PS:也可能是开发工具版本不同导致的)
wSheet.SaveAs(filePath + "\\" + tempName);
文章描述的方法是参考他人的一篇博客,具体链接后面补上。