• 从DataTable高效率导出数据到Excel


    首先从数据库读取数据到DataTable,这我就不提了,大家都明白。下面直接介绍如何从DataTable高效率导出数据到Excel中的方法,代码如下:

    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();
           }
    }

    说明:

    1)上述方法中,将DataTable单元格内容写入数组后一次性赋值给Excel的Range,效率非常高,比之循环DataTable单元格逐个赋值给Excel的Cell的方法,速度快多了;

    2)上述方法中用到的彻底关闭Excel进程的方式,也值得注意。

  • 相关阅读:
    IDEA Inspections详解
    IDEA 阿里编码规范插件
    IDEA Save Actions插件
    IDEA Lombok插件
    设计模式-简单工厂模式与工厂模式
    DAO设计模式
    Jcrop+strut2+jsp实现图片剪切
    Spring的Bean的作用域
    Spring的事务机制
    windows 下 Redis 主从 读写分离
  • 原文地址:https://www.cnblogs.com/dongh/p/6909611.html
Copyright © 2020-2023  润新知