zoukankan      html  css  js  c++  java
  • 将DataTable导出到Excel

    .NET中导出Excel的方法大致有三类,一是导出文本文件(csv),或者导出符合某种格式的xml文件,例如此文介绍的Export a DataSet to Microsoft Excel without the use of COM objects;二是利用Ado.NET,没用过,据说效率不高。三是利用COM。这三类方法第三种是最自由的,可以设置Excel单元格的格式等等,几乎可以完全控制整个Excel。前两种方法适合于导出的数据对格式没有任何要求的情况。

    下面主要介绍第三种方法。首先需要加入一个引用:

    Code Snippet
    1. using Microsoft.Office.Interop.Excel;

    将Datatable导出到Excel的代码是很直观的:

    Code Snippet
    1. public static bool Export(System.Data.DataTable data, string file)
    2.         {
    3.             Application app = new Microsoft.Office.Interop.Excel.Application();
    4.             try
    5.             {
    6.                 if (app == null)
    7.                 {
    8.                     throw new Exception("new Microsoft.Office.Interop.Excel.Application() returns null");
    9.                 }
    10.                 else
    11.                 {
    12.                     Workbooks xlBooks = app.Workbooks;
    13.                     Workbook xlBook = xlBooks.Add(XlWBATemplate.xlWBATWorksheet);
    14.                     Worksheet xlSheet = xlBook.Worksheets[1] as Worksheet;
    15.                     int n=1;
    16.                     foreach (System.Data.DataColumn col in data.Columns)
    17.                     {                        
    18.                         xlSheet.Cells[1, n++] = col.ColumnName;
    19.                     }
    20.                     int row = 2;
    21.                    
    22.                     foreach (System.Data.DataRow r in data.Rows)
    23.                     {
    24.                         int column = 1;
    25.                         foreach (System.Data.DataColumn col in data.Columns)
    26.                         {
    27.                             xlSheet.Cells[row, column] = data.Rows[row-2].ItemArray[column - 1];
    28.                             column++;
    29.                         }
    30.                         row++;
    31.                     }
    32.                     object missing = System.Reflection.Missing.Value;
    33.                     xlSheet.SaveAs(file, missing, missing, missing,
    34.                             missing, missing, missing, missing, missing, missing);
    35.                      
    36.                 }                
    37.                 return true;
    38.             }
    39.             catch (Exception e)
    40.             {
    41.                 Logger.Log(e);
    42.                 
    43.                 return false;
    44.             }
    45.             finally
    46.             {
    47.                 app.Quit();
    48.                 GC.Collect();
    49.             }
    50.         }

    但是这样操作非常非常慢。在存入数据的时候不能一个一个单元格设置,可以用一个二维数组对一个Range设置,具体方法如下:

    Code Snippet
    1. Workbooks xlBooks = app.Workbooks;
    2.                     Workbook xlBook = xlBooks.Add(XlWBATemplate.xlWBATWorksheet);
    3.                     Worksheet xlSheet = xlBook.Worksheets[1] as Worksheet;
    4.                     int n=1;
    5.                     foreach (System.Data.DataColumn col in data.Columns)
    6.                     {                        
    7.                         xlSheet.Cells[1, n++] = col.ColumnName;
    8.                     }
    9.                    // int row = 2;
    10.                     int row = 0;
    11.                     object[,] arr = new object[data.Rows.Count, data.Columns.Count];
    12.  
    13.                     foreach (System.Data.DataRow r in data.Rows)
    14.                     {
    15.                         //int column = 1;
    16.                         int column = 0;
    17.                         foreach (System.Data.DataColumn col in data.Columns)
    18.                         {
    19.                             //xlSheet.Cells[row, column] = data.Rows[row-2].ItemArray[column - 1];
    20.                             arr[row, column] = data.Rows[row][column];
    21.                             column++;
    22.                         }
    23.                         row++;
    24.                     }
    25.                     Range range=(Range)xlSheet.Cells[2, 1];
    26.                     range=range.get_Resize(data.Rows.Count,data.Columns.Count);
    27.                     range.Value2= arr;
    28.                     object missing = System.Reflection.Missing.Value;
    29.                     xlSheet.SaveAs(file, missing, missing, missing,
    30.                             missing, missing, missing, missing, missing, missing);

    上面仅贴出了关键部分。

  • 相关阅读:
    zufeoj NO.1(结构体简单题)
    用链表写插入排序
    用链表写插入排序
    POJ 3468 A Simple Problem with Integers(线段树)
    POJ 3468 A Simple Problem with Integers(线段树)
    HDU 3065 病毒侵袭持续中(AC自动机)
    HDU 3065 病毒侵袭持续中(AC自动机)
    ZOJ 3436 July Number(DFS)
    poj 3414 Pots(广搜BFS+路径输出)
    AOP技术应用和研究--AOP简单应用
  • 原文地址:https://www.cnblogs.com/yinzixin/p/1661765.html
Copyright © 2011-2022 走看看