C# 由Datatable导出Excel遇到的问题

急急急!!!C# 由Datatable导出Excel遇到的问题


本人新手小白,由于工作需要,遇到c#从数据库中导出到Excel,在网上查阅了好多文件和代码,已经可以实现导出,但是遇到一个问题,每次运行程序并无异常,但是电脑重新启动时会默认打开一个空的Excel。
下面贴出代码,请各位大神帮忙指导一下,问题出在哪里!

// 此代码摘抄自网上,感谢网上大神分享的方法
//快速转excel的方法
 public static bool SuperToExcel(DataTable excelTable, string filename,string filePath)
        {
            Excel.Application app =new Excel.Application();
            try
            {
                app.Visible = false;
                Excel.Workbook wBook = app.Workbooks.Add(true);
                Excel.Worksheet wSheet = wBook.Sheets[1];
                wSheet.Name = filename;
                object[,] objData = new object[excelTable.Rows.Count + 1, excelTable.Columns.Count];
                //首先将数据写入到一个二维数组中  
                for (int i = 0; i < excelTable.Columns.Count; i++)
                {
                    objData[0, i] = excelTable.Columns[i].ColumnName;
                }
                if (excelTable.Rows.Count > 0)
                {    
                    for (int i = 0; i < excelTable.Rows.Count; i++)
                    {
                        for (int j = 0; j < excelTable.Columns.Count; j++)
                        {
                            if (excelTable.Rows[i][j].Equals(float.NaN))//查询过来的float.NaN
                                objData[i + 1, j] = "-";
                            //else if (String.IsNullOrEmpty(excelTable.Rows[i][j].ToString()) && excelTable.Rows[i][j].Equals(DBNull.Value))//有dbnull的数据,需要屏蔽掉——在数据源处理了
                            //    objData[i + 1, j] = excelTable.Rows[i][j];
                            else
                                objData[i + 1, j] = excelTable.Rows[i][j];
                        }
                    }
                }
                string startCol = "A";//这里关键,计算要替换的区域
                int iCnt = ((excelTable.Columns.Count - 1) / 26);//当列数是26时 不-1 会出现问题,自己试试就明白了
                string endColSignal = (iCnt == 0 ? "" : ((char)('A' + (iCnt - 1))).ToString());
                string endCol = endColSignal + ((char)('A' + excelTable.Columns.Count - iCnt * 26 - 1)).ToString();
                Microsoft.Office.Interop.Excel.Range range = wSheet.get_Range(startCol + "1", endCol + (excelTable.Rows.Count + 1).ToString());
                range.Value = objData; //给Exccel中的Range整体赋值
                range.EntireColumn.AutoFit(); //设定Excel列宽度自适应  
                wSheet.get_Range(startCol + "1", endCol + "1").Font.Bold = 1;//Excel文件列名 字体设定为Bold  
                //设置禁止弹出保存和覆盖的询问提示框   
                app.DisplayAlerts = false;
                app.AlertBeforeOverwriting = false;
                //保存工作簿 
                //wBook.Save();
                wSheet.SaveAs(filePath);
                wBook.Close();
                //保存excel文件   
                //app.Save(filePath);
                //app.SaveWorkspace(filePath);
                app.Quit();
                GC.Collect();
                return true;
            }
            catch (Exception err)//这里还有些问题,比如 对方安装的是WPS 不会提示中文错误,没有安装office 也不会弹出该错误
            {
                MessageBox.Show("导出Excel出错!错误原因:" + err.Message, "提示信息",MessageBoxButtons.OK, MessageBoxIcon.Information); 
                return false;
            }
        }

调用执行程序如下:

//创建datatable
DataTable dt = new DataTable("NewDt");
//创建自增长的ID列
DataColumn dc = dt.Columns.Add("ID", Type.GetType("System.Int32"));
dc.AutoIncrement = true;   //自动增加
dc.AutoIncrementSeed = 1;  //起始为1
dc.AutoIncrementStep = 1;  //步长为1
dc.AllowDBNull = false;    //非空
//创建其它列表
dt.Columns.Add(new DataColumn("Name", Type.GetType("System.String")));
dt.Columns.Add(new DataColumn("Age", Type.GetType("System.Int32")));
dt.Columns.Add(new DataColumn("Score", Type.GetType("System.Decimal")));
dt.Columns.Add(new DataColumn("CreateTime", Type.GetType("System.DateTime")));
//创建数据
DataRow dr = dt.NewRow();
dr["Name"] = "张三";
dr["Age"] = 28;
dr["Score"] = 85.5;
dr["CreateTime"] = DateTime.Now;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Name"] = "李四";
dr["Age"] = 24;
dr["Score"] = 72;
dr["CreateTime"] = DateTime.Now;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Name"] = "王五";
dr["Age"] = 36;
dr["Score"] = 63.5;
dr["CreateTime"] = DateTime.Now;
dt.Rows.Add(dr);
string fullPath = "";
SaveFileDialog dialog = new SaveFileDialog
{Filter = "Excel文件(*.xlsx)|*.xlsx"//设置对话框保存的文件类型,可以设置为 dialog.Filter = "Excel文件(*.xlsx)|*.xlsx"};
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)//将ok返回默认用户公共对话框
{
fullPath = dialog.FileName;//获取文件路径和文件名
}
 if (fullPath != "")
{
FileInfo fi = new FileInfo(fullPath);//创建名xlsx文件
fi.Directory.Create();
}
if (SuperToExcel(dt, "a", fullPath)) 
{
 MessageBox.Show("导出成功");
}
else
{
 MessageBox.Show("导出失败");
}
  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

Ceebic

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值