zoukankan      html  css  js  c++  java
  • 将datatable 保存为 Excel文件(高效率版本)

    原文地址:https://www.cnblogs.com/dongh/p/6909611.html

    using Microsoft.Office.Interop.Excel;
    using System.Runtime.InteropServices;

    [DllImport("User32.dll", CharSet = CharSet.Auto)]
    public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int pid);
    //函数原型;DWORD GetWindowThreadProcessld(HWND hwnd,LPDWORD lpdwProcessld);
    //参数:hWnd:窗口句柄
    //参数:lpdwProcessld:接收进程标识的32位值的地址。如果这个参数不为NULL,GetWindwThreadProcessld将进程标识拷贝到这个32位值中,否则不拷贝
    //返回值:返回值为创建窗口的线程标识。

    //dt:从数据库读取的数据;file_name:保存路径;sheet_name:表单名称
    private void DataTableToExcel(DataTable dt, string file_name, string sheet_name)
    {
           Microsoft.Office.Interop.Excel.Application Myxls = new  Microsoft.Office.Interop.Excel.Application();
           Microsoft.Office.Interop.Excel.Workbook Mywkb = Myxls.Workbooks.Add();
           Microsoft.Office.Interop.Excel.Worksheet MySht = Mywkb.ActiveSheet;
           MySht.Name = sheet_name;
           Myxls.Visible = false;
           Myxls.DisplayAlerts = false;
           try
           {
                  //写入表头
                  object[] arrHeader = new object[dt.Columns.Count];
                  for(int i = 0; i < dt.Columns.Count; i++)
                  {
                         arrHeader[i] = dt.Columns[i].ColumnName;
                  }
                  MySht.Range[Mysht.Cells[1,1], MySht.Cells[1,dt.Columns.Count]].Value2 = arrHeader;
                  //写入表体数据
                  object[,] arrBody = new object[dt.Rows.Count, dt.Columns.Count];
                  for(int i = 0; i < dt.Rows.Count; i++)
                  {
                          for(int j = 0; j < dt.Columns.Count; j++)
                          {
                                  arrBody[i,j] = dt.Rows[i][j].ToString();
                          }
                  }
                  MySht.Range[MySht.Cells[2,1], MySht.Cells[dt.Rows.Count + 1, dt.Columns.Count]].Value2 = arrBody;
                  if(Mywkb != null)
                  {
                          Mywkb.SaveAs(file_name);
                          Mywkb.Close(Type.Missing, Type.Missing, Type.Missing);
                          Mywkb = null;
                  }
           }
           catch(Exception ex)
           {
                   MessageBox.Show(ex.Message, "系统提示");
           }
           finally
           {
                    //彻底关闭Excel进程
                    if(Myxls != null)
                    {
                           Myxls.Quit();
                           try
                           {
                                  if(Myxls != null)
                                  {
                                        int pid;
                                        GetWindowThreadProcessId(new IntPtr(Myxls.Hwnd), out pid);
                                        System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(pid);
                                         p.Kill();
                                  }
                           }
                           catch(Exception ex)
                           {
                                  MessageBox.Show("结束当前EXCEL进程失败:" + ex.Message);
                           }
                           Myxls = null;
                    }
                    GC.Collect();
           }
    }

  • 相关阅读:
    .Net4.0 任务(Task)[转]
    在 Asp.NET MVC 中使用 SignalR 实现推送功能 [转]
    Quartz.net官方开发指南[转]
    配置Windows server 2008文件同步[转]
    Web 前端性能优化相关内容解析[转]
    标头“Vary:Accept-Encoding”指定方法[转]
    linux服务器的Gzip文件压缩方法[转]
    Windows下面安装和配置Solr 4.9(三)支持中文分词器
    Windows下面安装和配置MySQL(5.6.20)
    Windows下面安装和配置Solr 4.9(二)
  • 原文地址:https://www.cnblogs.com/hanje/p/10534842.html
Copyright © 2011-2022 走看看