前言
最近做了一下数据导出至Excel的模块,遇到的一些问题做一下汇总。
一、导出数据至Excel
1、注意事项
1、一定要杀进程、回收垃圾
2、Excel的列超过Z时,要进行转化。
3、设置保存Excel的时候,不弹出是否保存的窗口直接进行保存
/// <summary>
/// 导出数据至Excel,通过excel模板导出
/// </summary>
/// <param name="templatePath">模板路径</param>
/// <param name="outputPath">导出路径</param>
/// <returns></returns>
public static bool ExportExcel(string templatePath, string outputPath)
{
//判断模板路径
if (!File.Exists(templatePath))
{
OutLog.SystemLog(templatePath + "该路径下文件模板不存在,请检查!");
return false;
}
bool retResult = false;
MSExcel.Application xlApp = null;
try
{
xlApp = new MSExcel.Application();
xlApp.Visible = false;
//保存Excel的时候,不弹出是否保存的窗口直接进行保存
xlApp.DisplayAlerts = false;
MSExcel.Workbooks workBooks = xlApp.Workbooks;
//加载本地模板
MSExcel.Workbook workBook = workBooks.Add(templatePath);
//获取第4个工作表
MSExcel.Worksheet workSheet = (MSExcel.Worksheet)workBook.Worksheets[4];
//**********2.Excel的列超过Z时,要进行转化**********
byte columeStartNum = Convert.ToByte('F');
string cDay = "";
for (int i = 0; i < nCol; i++)
{
if (i <= 90 - columeStartNum)
{
cDay = ((char)(columeStartNum + i)).ToString();
}
else
{
int b = (i + columeStartNum - 91) / 26;
cDay = ((char)(65 + b)).ToString() + ((char)(65 + b + i - 21)).ToString();
}
}
//**********3.写入数据**********
cDay = "5";
Microsoft.Office.Interop.Excel.Range ct = xSheet.get_Range(cDay.ToString() + 6, Missing.Value);
ct.Value2 = "0";
//也可使用cell
// workSheet.Cells[5 , 2] = "0";//时间
//**********4.保存**********
workBook.SaveAs(outputPath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
MSExcel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing);
workBooks.Close();
retResult = true;
}
catch (Exception)
{
xlApp.Quit();
retResult = false;
}
finally
{
xlApp.Quit();
//杀进程
IntPtr t = new IntPtr(xlApp.Hwnd);
int k = 0;
GetWindowThreadProcessId(t, out k);
System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);
p.Kill();
//垃圾回收
GC.Collect();
}
return retResult;
}