将DataTable中的数据保存到Excel

如何快速将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);

文章描述的方法是参考他人的一篇博客,具体链接后面补上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值