在用winform将DataTable导出excel文件时 ,遇到一个难题,请教大家帮看看怎么回事:
窗体Shown的事件中调用AutoExecute是正常的,生成了excel文件。 但是此时再点击窗体上的按钮button 调用 AutoExecute()方法,代码执行到了这地方:_Workbook wbk = wbook.Add(Missing.Value);就没反应了,没报错。
public class AutoExecute
{
public void BeginUpLoad() { System.Threading.Thread SyncThread = new System.Threading.Thread(new System.Threading.ThreadStart(CreatExcel)); SyncThread.IsBackground = true; SyncThread.Start(); }
[DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
/// <summary> /// /// </summary> /// <param name="dt"></param> public bool CreatExcel(System.Data.DataTable dt) { try { if (dt == null || dt.Rows.Count == 0) { return true; }
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application(); if (app == null) { throw new Exception("创建Excel失败"); }
app.Visible = false; app.UserControl = true; app.DisplayAlerts = false;
int colCount = dt.Columns.Count; long rowCount = dt.Rows.Count; int num = 1;
Workbooks wbook = app.Workbooks;
_Workbook wbk = wbook.Add(Missing.Value);//到了这地方就没反应了,
Sheets sheet = wbk.Sheets; _Worksheet wsheet = (_Worksheet)sheet.get_Item(1);
if (wsheet == null) { return false; }
for (int i = 0; i < rowCount; i++) { for (int n = 0; n < colCount; n++) { wsheet.Cells[1, n + 1] = dt.Columns[n].ColumnName; }
for (int j = 0; j < colCount; j++) { wsheet.Cells[i + 2, j + 1] = dt.Rows[i][j].ToString(); } }
string fileName = "VIP2.xlsx";
app.ActiveWorkbook.SaveAs(Config.Path + fileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
LogOperate.WriteSuccess("导出成功" + fileName);
wbk.Close(false, Missing.Value, Missing.Value); app.Quit(); IntPtr t = new IntPtr(app.Hwnd); //杀死进程 int k = 0; GetWindowThreadProcessId(t, out k); System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k); p.Kill();
System.Runtime.InteropServices.Marshal.ReleaseComObject(wsheet); System.Runtime.InteropServices.Marshal.ReleaseComObject(wbook); System.Runtime.InteropServices.Marshal.ReleaseComObject(wbk); System.Runtime.InteropServices.Marshal.ReleaseComObject(app); GC.Collect();
return true; } catch (Exception ex) { throw new Exception("导出失败" + ex.Message); }
}}
可以了解一下园子里的NPOI组件导出excel,比较好用。
嗯,我考虑用npoi,可是我也想知道为什么会出错误。是因为多线程的原因,还是excel的原因
这么多代码,实在是不好看,遇到导出Excel的问题,我都是建议采用第三方的dll。比如:NPOI,EPPlus~
直接按照 .csv 格式写个后缀名为 .xls 的文本文件就行了。
你意思是改变导出excel的方式吗
@chenxzlyd: 如果只是简单的写成表格数据的话,写 .csv 的方式最好。
@Launcher: 因为要和别的系统对接,csv格式不行。
@chenxzlyd: 对方如果也是使用的互操作程序集来读取的话就没问题。你可以给分测试数据让对对读读测试下。