急急急!!!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("导出失败");
}