首页 新闻 会员 周边 捐助

请教一个DataTable导出excel的难题

0
悬赏园豆:20 [待解决问题]
在用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);             }        
}}
loveec的主页 loveec | 初学一级 | 园豆:98
提问于:2014-07-17 14:41
< >
分享
所有回答(3)
0

可以了解一下园子里的NPOI组件导出excel,比较好用。

I,Robot | 园豆:9783 (大侠五级) | 2014-07-17 14:47

嗯,我考虑用npoi,可是我也想知道为什么会出错误。是因为多线程的原因,还是excel的原因

支持(0) 反对(0) loveec | 园豆:98 (初学一级) | 2014-07-17 14:56
0

这么多代码,实在是不好看,遇到导出Excel的问题,我都是建议采用第三方的dll。比如:NPOI,EPPlus~

幻天芒 | 园豆:37205 (高人七级) | 2014-07-17 14:51
0

直接按照 .csv  格式写个后缀名为 .xls 的文本文件就行了。

Launcher | 园豆:45050 (高人七级) | 2014-07-17 14:53

你意思是改变导出excel的方式吗

支持(0) 反对(0) loveec | 园豆:98 (初学一级) | 2014-07-17 14:59

@chenxzlyd: 如果只是简单的写成表格数据的话,写 .csv 的方式最好。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-07-17 15:04

@Launcher: 因为要和别的系统对接,csv格式不行。

支持(0) 反对(0) loveec | 园豆:98 (初学一级) | 2014-07-17 15:12

@chenxzlyd: 对方如果也是使用的互操作程序集来读取的话就没问题。你可以给分测试数据让对对读读测试下。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2014-07-17 15:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册