2009-11-17 117 views
30

我有一个包含30列和6500+行的DataTable。我需要将整个DataTable值转储到Excel文件中。任何人都可以请求C#代码帮助。我需要每列值在一个单元格中。确切地说,我需要Excel文件中的DataTable的精确副本。请帮助。将DataTable导出到Excel文件

感谢, Vix指数

+0

你可以尝试这里描述的技术:C-尖角(http://www.c-sharpcorner.com/UploadFile/DipalChoksi/exportxl_asp2_dc11032006003657AM/exportxl_asp2_dc.aspx) – Randolpho 2009-11-17 05:05:28

回答

63

使用此代码...

dt = city.GetAllCity();//your datatable 
    string attachment = "attachment; filename=city.xls"; 
    Response.ClearContent(); 
    Response.AddHeader("content-disposition", attachment); 
    Response.ContentType = "application/vnd.ms-excel"; 
    string tab = ""; 
    foreach (DataColumn dc in dt.Columns) 
    { 
     Response.Write(tab + dc.ColumnName); 
     tab = "\t"; 
    } 
    Response.Write("\n"); 
    int i; 
    foreach (DataRow dr in dt.Rows) 
    { 
     tab = ""; 
     for (i = 0; i < dt.Columns.Count; i++) 
     { 
      Response.Write(tab + dr[i].ToString()); 
      tab = "\t"; 
     } 
     Response.Write("\n"); 
    } 
    Response.End(); 
+3

所有错综复杂的文章中我在网络上发现了这一点,很高兴找到一个简单而简单的解决方案。非常感谢! – 2010-08-23 17:50:02

+0

任何建议强制Excel将所有字段视为字符串而不考虑数据?例如,不要在“0000012”中删除前导零。我试着在撇号前加上撇号,但撇号出现在电子表格中。 – 2010-10-05 16:01:27

+0

对于我的Excel,切换列的标签不工作,任何解决方案? – Gobliins 2012-02-28 16:01:33

10

这个片段可以以更快的速度实现:

// Example data 
DataTable table = new DataTable(); 
table.Columns.AddRange(new[]{ new DataColumn("Key"), new DataColumn("Value") }); 
foreach (string name in Request.ServerVariables) 
    table.Rows.Add(name, Request.ServerVariables[name]); 

// This actually makes your HTML output to be downloaded as .xls file 
Response.Clear(); 
Response.ClearContent(); 
Response.ContentType = "application/octet-stream"; 
Response.AddHeader("Content-Disposition", "attachment; filename=ExcelFile.xls"); 

// Create a dynamic control, populate and render it 
GridView excel = new GridView(); 
excel.DataSource = table; 
excel.DataBind(); 
excel.RenderControl(new HtmlTextWriter(Response.Output)); 

Response.Flush(); 
Response.End(); 
+0

这不是我的工作是输出excel文件,但它包含与HTTPS协议,如'(SERVER_PORT_SECURE,SERVER_PROTOCOL,SERVER_SOFTWARE)表',并认为我真的不又是什么...似乎更好的办法sinces我们不这样做需要重写'VerifyRenderingInServerForm' ...你能帮我吗? – sam 2017-05-14 18:04:06

+0

我错过了什么?我把这些代码在方法和按钮'onclick'事件 – sam 2017-05-14 18:09:06

+0

叫它做我需要一个什么回报? – chungtinhlakho 2017-05-15 21:23:48

0

虽然不是一个.NET实现,你会发现根据您的受众,插件TableTools可能会非常有效。它依赖闪光灯,对于大多数需要实际深入工作并且想要记录表格信息的情况,这应该不成问题。

最新版本似乎支持将复制到剪贴板,CSV,“.XLS”(实际上只是一个名为.xls的制表符分隔文件),复制到PDF,或创建一个打印机友好的页面版本,显示所有行并隐藏你的页面内容的其余部分。

我发现对数据表的网站在这里延伸:http://datatables.net/extras/tabletools/

下载是在插件(演员)页面在这里可供选择:http://datatables.net/extras/

它理应被下载的数据表的一部分(因此“包含在DataTables包中的其他附件”),但是我没有在我一直使用的下载中找到它。似乎奇妙地工作!

4

下面的链接用于导出datatable到C#代码中的excel。

http://royalarun.blogspot.in/2012/01/export-datatable-to-excel-in-c-windows.html

using System;  
    using System.Data; 
    using System.IO; 
    using System.Windows.Forms; 

    namespace ExportExcel 
    {  
     public partial class ExportDatatabletoExcel : Form 
     { 
      public ExportDatatabletoExcel() 
      { 
       InitializeComponent(); 
      } 

      private void Form1_Load(object sender, EventArgs e) 
      { 

       DataTable dt = new DataTable(); 

       //Add Datacolumn 
       DataColumn workCol = dt.Columns.Add("FirstName", typeof(String)); 

       dt.Columns.Add("LastName", typeof(String)); 
       dt.Columns.Add("Blog", typeof(String)); 
       dt.Columns.Add("City", typeof(String)); 
       dt.Columns.Add("Country", typeof(String)); 

       //Add in the datarow 
       DataRow newRow = dt.NewRow(); 

       newRow["firstname"] = "Arun"; 
       newRow["lastname"] = "Prakash"; 
       newRow["Blog"] = "http://royalarun.blogspot.com/"; 
       newRow["city"] = "Coimbatore"; 
       newRow["country"] = "India"; 

       dt.Rows.Add(newRow); 

       //open file 
       StreamWriter wr = new StreamWriter(@"D:\\Book1.xls"); 

       try 
       { 

        for (int i = 0; i < dt.Columns.Count; i++) 
        { 
         wr.Write(dt.Columns[i].ToString().ToUpper() + "\t"); 
        } 

        wr.WriteLine(); 

        //write rows to excel file 
        for (int i = 0; i < (dt.Rows.Count); i++) 
        { 
         for (int j = 0; j < dt.Columns.Count; j++) 
         { 
          if (dt.Rows[i][j] != null) 
          { 
           wr.Write(Convert.ToString(dt.Rows[i][j]) + "\t"); 
          } 
          else 
          { 
           wr.Write("\t"); 
          } 
         } 
         //go to next line 
         wr.WriteLine(); 
        } 
        //close file 
        wr.Close(); 
       } 
       catch (Exception ex) 
       { 
        throw ex; 
       } 
      } 
     } 
    } 
+1

虽然此链接可以回答这个问题,最好是在这里有答案的主要部件,并提供链接以供参考。如果链接页面更改,则仅链接答案可能会失效。 – 2013-11-07 12:46:52

-1

尝试使用此方法将数据导出到Excel文件相同的DataTable,也可以自定义。

dtDataTable1 = ds.Tables[0]; 
    try 
    { 
     Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application(); 
     Workbook xlWorkBook = ExcelApp.Workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet); 

     for (int i = 1; i > 0; i--) 
     { 
      Sheets xlSheets = null; 
      Worksheet xlWorksheet = null; 
      //Create Excel sheet 
      xlSheets = ExcelApp.Sheets; 
      xlWorksheet = (Worksheet)xlSheets.Add(xlSheets[1], Type.Missing, Type.Missing, Type.Missing); 
      xlWorksheet.Name = "MY FIRST EXCEL FILE"; 
      for (int j = 1; j < dtDataTable1.Columns.Count + 1; j++) 
      { 
       ExcelApp.Cells[i, j] = dtDataTable1.Columns[j - 1].ColumnName; 
       ExcelApp.Cells[1, j].Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Green); 
       ExcelApp.Cells[i, j].Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.WhiteSmoke); 
      } 
      // for the data of the excel 
      for (int k = 0; k < dtDataTable1.Rows.Count; k++) 
      { 
       for (int l = 0; l < dtDataTable1.Columns.Count; l++) 
       { 
        ExcelApp.Cells[k + 2, l + 1] = dtDataTable1.Rows[k].ItemArray[l].ToString(); 
       } 
      } 
      ExcelApp.Columns.AutoFit(); 
     } 
     ((Worksheet)ExcelApp.ActiveWorkbook.Sheets[ExcelApp.ActiveWorkbook.Sheets.Count]).Delete(); 
     ExcelApp.Visible = true; 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
2

这个帖子后面的回答最高,但是它是CSV文件。这不是真正的Excel文件。因此,当您打开文件时,您会收到警告。

我在网上找到的最佳解决方案是使用CloseXML http://closedxml.codeplex.com/ 您还需要打开XML。

dt = city.GetAllCity();//your datatable 
using (XLWorkbook wb = new XLWorkbook()) 
    { 
     wb.Worksheets.Add(dt); 

     Response.Clear(); 
     Response.Buffer = true; 
     Response.Charset = ""; 
     Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
     Response.AddHeader("content-disposition", "attachment;filename=GridView.xlsx"); 
     using (MemoryStream MyMemoryStream = new MemoryStream()) 
     { 
      wb.SaveAs(MyMemoryStream); 
      MyMemoryStream.WriteTo(Response.OutputStream); 
      Response.Flush(); 
      Response.End(); 
     } 
    } 

信用:http://www.aspsnippets.com/Articles/Solution-ASPNet-GridView-Export-to-Excel-The-file-you-are-trying-to-open-is-in-a-different-format-than-specified-by-the-file-extension.aspx

1

我用这page.`

public void DTToExcel(DataTable dt) 
{ 
    // dosya isimleri ileride aynı anda birden fazla kullanıcı aynı dosya üzerinde işlem yapmak ister düşüncesiyle guid yapıldı. 
    string FileName = Guid.NewGuid().ToString(); 

    FileInfo f = new FileInfo(Server.MapPath("Downloads") + string.Format("\\{0}.xlsx", FileName)); 
    if (f.Exists) 
     f.Delete(); // delete the file if it already exist. 

    HttpResponse response = HttpContext.Current.Response; 
    response.Clear(); 
    response.ClearHeaders(); 
    response.ClearContent(); 
    response.Charset = Encoding.UTF8.WebName; 
    response.AddHeader("content-disposition", "attachment; filename=" + FileName + ".xls"); 
    response.AddHeader("Content-Type", "application/Excel"); 
    response.ContentType = "application/vnd.xlsx"; 
    //response.AddHeader("Content-Length", file.Length.ToString()); 


    // create a string writer 
    using (StringWriter sw = new StringWriter()) 
    { 
     using (HtmlTextWriter htw = new HtmlTextWriter(sw)) //datatable'a aldığımız sorguyu bir datagrid'e atayıp html'e çevir. 
     { 
      // instantiate a datagrid 
      DataGrid dg = new DataGrid(); 
      dg.DataSource = dt; 
      dg.DataBind(); 
      dg.RenderControl(htw); 
      response.Write(sw.ToString()); 
      dg.Dispose(); 
      dt.Dispose(); 
      response.End(); 
     } 
    } 
} 
+0

感谢Volkan,这是最好的方法sinces我们不需要重写'VerifyRenderingInServerForm' .... Volkan我真的很感激你,你在每一行设置注释,解释发生了什么,这对别人也是有用的.. ** I Recommend亲爱的方式搜索器** – sam 2017-05-14 18:32:03

+0

沃尔坎那请亲爱的,当我取消这条线......我得到的错误,我试图去理解它是目的吗? '//response.AddHeader("Content-Length”,file.Length.ToString());' – sam 2017-05-14 18:39:08

+0

我有添加一些评论对我行了解请提供更多...非常感谢 – sam 2017-05-14 19:03:32

1
  var lines = new List<string>(); 

      string[] columnNames = dt.Columns.Cast<DataColumn>(). 
               Select(column => column.ColumnName). 
               ToArray(); 

      var header = string.Join(",", columnNames); 
      lines.Add(header); 
      var valueLines = dt.AsEnumerable() 
           .Select(row => string.Join(",", row.ItemArray)); 
      lines.AddRange(valueLines); 
      File.WriteAllLines("excel.csv", lines); 

这里DT是指你的数据表中通作为一个放慢参数

0

大多数的答案实际上是生产在Excel中打开时,我并不总是有很好的体验。

这样做的一种方法也将与ACE OLEDB Provider(也见connection strings for Excel)。当然,你必须安装并注册提供商。如果您安装了Excel,则确实拥有它,但这是部署时必须考虑的事项(例如,在Web服务器上)。

在下面的辅助类的代码,你不得不调用像ExportHelper.CreateXlsFromDataTable(dataset.Tables[0], @"C:\tmp\export.xls");

public class ExportHelper 
{ 
    private const string ExcelOleDbConnectionStringTemplate = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=YES\";"; 

    /// <summary> 
    /// Creates the Excel file from items in DataTable and writes them to specified output file. 
    /// </summary> 
    public static void CreateXlsFromDataTable(DataTable dataTable, string fullFilePath) 
    { 
     string createTableWithHeaderScript = GenerateCreateTableCommand(dataTable); 

     using (var conn = new OleDbConnection(String.Format(ExcelOleDbConnectionStringTemplate, fullFilePath))) 
     { 
      if (conn.State != ConnectionState.Open) 
      { 
       conn.Open(); 
      } 

      OleDbCommand cmd = new OleDbCommand(createTableWithHeaderScript, conn); 
      cmd.ExecuteNonQuery(); 

      foreach (DataRow dataExportRow in dataTable.Rows) 
      { 
       AddNewRow(conn, dataExportRow); 
      } 
     } 
    } 

    private static void AddNewRow(OleDbConnection conn, DataRow dataRow) 
    { 
     string insertCmd = GenerateInsertRowCommand(dataRow); 

     using (OleDbCommand cmd = new OleDbCommand(insertCmd, conn)) 
     { 
      AddParametersWithValue(cmd, dataRow); 
      cmd.ExecuteNonQuery(); 
     } 
    } 

    /// <summary> 
    /// Generates the insert row command. 
    /// </summary> 
    private static string GenerateInsertRowCommand(DataRow dataRow) 
    { 
     var stringBuilder = new StringBuilder(); 
     var columns = dataRow.Table.Columns.Cast<DataColumn>().ToList(); 
     var columnNamesCommaSeparated = string.Join(",", columns.Select(x => x.Caption)); 
     var questionmarkCommaSeparated = string.Join(",", columns.Select(x => "?")); 

     stringBuilder.AppendFormat("INSERT INTO [{0}] (", dataRow.Table.TableName); 
     stringBuilder.Append(columnNamesCommaSeparated); 
     stringBuilder.Append(") VALUES("); 
     stringBuilder.Append(questionmarkCommaSeparated); 
     stringBuilder.Append(")"); 
     return stringBuilder.ToString(); 
    } 

    /// <summary> 
    /// Adds the parameters with value. 
    /// </summary> 
    private static void AddParametersWithValue(OleDbCommand cmd, DataRow dataRow) 
    { 
     var paramNumber = 1; 

     for (int i = 0; i <= dataRow.Table.Columns.Count - 1; i++) 
     { 
      if (!ReferenceEquals(dataRow.Table.Columns[i].DataType, typeof(int)) && !ReferenceEquals(dataRow.Table.Columns[i].DataType, typeof(decimal))) 
      { 
       cmd.Parameters.AddWithValue("@p" + paramNumber, dataRow[i].ToString().Replace("'", "''")); 
      } 
      else 
      { 
       object value = GetParameterValue(dataRow[i]); 
       OleDbParameter parameter = cmd.Parameters.AddWithValue("@p" + paramNumber, value); 
       if (value is decimal) 
       { 
        parameter.OleDbType = OleDbType.Currency; 
       } 
      } 

      paramNumber = paramNumber + 1; 
     } 
    } 

    /// <summary> 
    /// Gets the formatted value for the OleDbParameter. 
    /// </summary> 
    private static object GetParameterValue(object value) 
    { 
     if (value is string) 
     { 
      return value.ToString().Replace("'", "''"); 
     } 
     return value; 
    } 

    private static string GenerateCreateTableCommand(DataTable tableDefination) 
    { 
     StringBuilder stringBuilder = new StringBuilder(); 
     bool firstcol = true; 

     stringBuilder.AppendFormat("CREATE TABLE [{0}] (", tableDefination.TableName); 

     foreach (DataColumn tableColumn in tableDefination.Columns) 
     { 
      if (!firstcol) 
      { 
       stringBuilder.Append(", "); 
      } 
      firstcol = false; 

      string columnDataType = "CHAR(255)"; 

      switch (tableColumn.DataType.Name) 
      { 
       case "String": 
        columnDataType = "CHAR(255)"; 
        break; 
       case "Int32": 
        columnDataType = "INTEGER"; 
        break; 
       case "Decimal": 
        // Use currency instead of decimal because of bug described at 
        // http://social.msdn.microsoft.com/Forums/vstudio/en-US/5d6248a5-ef00-4f46-be9d-853207656bcc/localization-trouble-with-oledbparameter-and-decimal?forum=csharpgeneral 
        columnDataType = "CURRENCY"; 
        break; 
      } 

      stringBuilder.AppendFormat("{0} {1}", tableColumn.ColumnName, columnDataType); 
     } 
     stringBuilder.Append(")"); 

     return stringBuilder.ToString(); 
    } 
} 
0

工作代码Excel导出

try 
     { 
      DataTable dt = DS.Tables[0]; 
      string attachment = "attachment; filename=log.xls"; 
      Response.ClearContent(); 
      Response.AddHeader("content-disposition", attachment); 
      Response.ContentType = "application/vnd.ms-excel"; 
      string tab = ""; 
      foreach (DataColumn dc in dt.Columns) 
      { 
       Response.Write(tab + dc.ColumnName); 
       tab = "\t"; 
      } 
      Response.Write("\n"); 
      int i; 
      foreach (DataRow dr in dt.Rows) 
      { 
       tab = ""; 
       for (i = 0; i < dt.Columns.Count; i++) 
       { 
        Response.Write(tab + dr[i].ToString()); 
        tab = "\t"; 
       } 
       Response.Write("\n"); 
      } 
      Response.End(); 
     } 
     catch (Exception Ex) 
     { } 
+1

你为什么转贴接受的答案作为你的答案? – 2017-01-19 17:13:59

0

如果您导出数据表与格式的标题文字到Excel尝试像这个。

public void ExportFullDetails() 
    { 
     Int16 id = Convert.ToInt16(Session["id"]); 
     DataTable registeredpeople = new DataTable(); 
     registeredpeople = this.dataAccess.ExportDetails(eventid); 

     string attachment = "attachment; filename=Details.xls"; 
     Response.ClearContent(); 
     Response.AddHeader("content-disposition", attachment); 
     Response.ContentType = "application/vnd.ms-excel"; 
     string tab = ""; 


     registeredpeople.Columns["Reg_id"].ColumnName = "Reg. ID"; 
     registeredpeople.Columns["Name"].ColumnName = "Name"; 
     registeredpeople.Columns["Reg_country"].ColumnName = "Country"; 
     registeredpeople.Columns["Reg_city"].ColumnName = "City"; 
     registeredpeople.Columns["Reg_email"].ColumnName = "Email"; 
     registeredpeople.Columns["Reg_business_phone"].ColumnName = "Business Phone"; 
     registeredpeople.Columns["Reg_mobile"].ColumnName = "Mobile"; 
     registeredpeople.Columns["PositionRole"].ColumnName = "Position"; 
     registeredpeople.Columns["Reg_work_type"].ColumnName = "Work Type"; 

     foreach (DataColumn dc in registeredpeople.Columns) 
     { 
      Response.Write(tab + dc.ColumnName); 
      tab = "\t"; 
     } 

     Response.Write("\n"); 
     int i; 
     foreach (DataRow dr in registeredpeople.Rows) 
     { 
      tab = ""; 
      for (i = 0; i < registeredpeople.Columns.Count; i++) 
      { 
       Response.Write(tab + dr[i].ToString()); 
       tab = "\t"; 
      } 
      Response.Write("\n"); 
     } 
     Response.End(); 

    } 
0

我已经使用以下代码完成了DataTable到Excel的转换。希望这很容易,不需要更改只需复制&有害生物代码将您的变量替换为变量,并且它将正常工作。

首先在解决方案文档创建一个文件夹,并创建一个Excel文件MyTemplate.xlsx。您可以根据您的要求更改这些名称。但请记住,您还必须在代码中更改名称。

请找到下面的代码...

protected void GetExcel_Click(object sender, EventArgs e) 
    {    

     ManageTicketBS objManageTicket = new ManageTicketBS(); 
     DataTable DT = objManageTicket.GetAlldataByDate(); //this function will bring the data in DataTable format, you can use your function instate of that. 

     string DownloadFileName; 
     string FolderPath; 
     string FileName = "MyTemplate.xlsx"; 
     DownloadFileName = Path.GetFileNameWithoutExtension(FileName) + new Random().Next(10000, 99999) + Path.GetExtension(FileName); 
     FolderPath = ".\\" + DownloadFileName; 

     GetParents(Server.MapPath("~/Document/" + FileName), Server.MapPath("~/Document/" + DownloadFileName), DT); 

     string path = Server.MapPath("~/Document/" + FolderPath); 
     FileInfo file = new FileInfo(path); 
     if (file.Exists) 
     { 
      try 
      { 
       HttpResponse response = HttpContext.Current.Response; 
       response.Clear(); 
       response.ClearContent(); 
       response.ClearHeaders(); 
       response.Buffer = true; 
       response.ContentType = MimeType(Path.GetExtension(FolderPath)); 
       response.AddHeader("Content-Disposition", "attachment;filename=" + DownloadFileName); 
       byte[] data = File.ReadAllBytes(path); 
       response.BinaryWrite(data); 
       HttpContext.Current.ApplicationInstance.CompleteRequest(); 
       response.End(); 
      } 

      catch (Exception ex) 
      { 
       ex.ToString(); 
      } 
      finally 
      { 
       DeleteOrganisationtoSupplierTemplate(path); 
      } 
     } 
    } 
    public string GetParents(string FilePath, string TempFilePath, DataTable DTTBL) 
    { 
     File.Copy(Path.Combine(FilePath), Path.Combine(TempFilePath), true); 
     FileInfo file = new FileInfo(TempFilePath); 
     try 
     { 
      DatatableToExcel(DTTBL, TempFilePath, 0); 

      return TempFilePath; 

     } 

     catch (Exception ex) 
     {     
      return ""; 
     } 

    } 


    public static string MimeType(string Extension) 
    { 
     string mime = "application/octetstream"; 
     if (string.IsNullOrEmpty(Extension)) 
      return mime; 
     string ext = Extension.ToLower(); 
     Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext); 
     if (rk != null && rk.GetValue("Content Type") != null) 
      mime = rk.GetValue("Content Type").ToString(); 
     return mime; 
    } 


    static bool DeleteOrganisationtoSupplierTemplate(string filePath) 
    { 
     try 
     {     
      File.Delete(filePath); 
      return true; 
     } 
     catch (IOException) 
     {    
      return false; 
     } 
    } 


    public void DatatableToExcel(DataTable dtable, string pFilePath, int excelSheetIndex=1) 
    { 

     try 
     { 
      if (dtable != null && dtable.Rows.Count > 0) 
      { 
       IWorkbook workbook = null; 
       ISheet worksheet = null; 

       using (FileStream stream = new FileStream(pFilePath, FileMode.Open, FileAccess.ReadWrite)) 
       { 

        workbook = WorkbookFactory.Create(stream); 
        worksheet = workbook.GetSheetAt(excelSheetIndex); 

        int iRow = 1; 



        foreach (DataRow row in dtable.Rows) 
        { 
         IRow file = worksheet.CreateRow(iRow); 
         int iCol = 0; 
         foreach (DataColumn column in dtable.Columns) 
         { 
          ICell cell = null; 
          object cellValue = row[iCol]; 

          switch (column.DataType.ToString()) 
          { 
           case "System.Boolean": 
            if (cellValue != DBNull.Value) 
            { 
             cell = file.CreateCell(iCol, CellType.Boolean); 

             if (Convert.ToBoolean(cellValue)) { cell.SetCellFormula("TRUE()"); } 
             else { cell.SetCellFormula("FALSE()"); } 

             //cell.CellStyle = _boolCellStyle; 
            } 
            break; 

           case "System.String": 
            if (cellValue != DBNull.Value) 
            { 
             cell = file.CreateCell(iCol, CellType.String); 
             cell.SetCellValue(Convert.ToString(cellValue)); 
            } 
            break; 

           case "System.Int32": 
            if (cellValue != DBNull.Value) 
            { 
             cell = file.CreateCell(iCol, CellType.Numeric); 
             cell.SetCellValue(Convert.ToInt32(cellValue)); 
             //cell.CellStyle = _intCellStyle; 
            } 
            break; 
           case "System.Int64": 
            if (cellValue != DBNull.Value) 
            { 
             cell = file.CreateCell(iCol, CellType.Numeric); 
             cell.SetCellValue(Convert.ToInt64(cellValue)); 
             //cell.CellStyle = _intCellStyle; 
            } 
            break; 
           case "System.Decimal": 
            if (cellValue != DBNull.Value) 
            { 
             cell = file.CreateCell(iCol, CellType.Numeric); 
             cell.SetCellValue(Convert.ToDouble(cellValue)); 
             //cell.CellStyle = _doubleCellStyle; 
            } 
            break; 
           case "System.Double": 
            if (cellValue != DBNull.Value) 
            { 
             cell = file.CreateCell(iCol, CellType.Numeric); 
             cell.SetCellValue(Convert.ToDouble(cellValue)); 
             //cell.CellStyle = _doubleCellStyle; 
            } 
            break; 

           case "System.DateTime": 
            if (cellValue != DBNull.Value) 
            { 
             cell = file.CreateCell(iCol, CellType.String); 
             DateTime dateTime = Convert.ToDateTime(cellValue); 
             cell.SetCellValue(dateTime.ToString("dd/MM/yyyy")); 

             DateTime cDate = Convert.ToDateTime(cellValue); 
             if (cDate != null && cDate.Hour > 0) 
             { 
              //cell.CellStyle = _dateTimeCellStyle; 
             } 
             else 
             { 
              // cell.CellStyle = _dateCellStyle; 
             } 
            } 
            break; 
           default: 
            break; 
          } 
          iCol++; 
         } 
         iRow++; 
        } 
        using (var WritetoExcelfile = new FileStream(pFilePath, FileMode.Create, FileAccess.ReadWrite)) 
        { 
         workbook.Write(WritetoExcelfile); 
         WritetoExcelfile.Close(); 
         //workbook.Write(stream); 
         stream.Close(); 
        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

此代码,你只需要在你的脚本复制&害虫,并添加命名空间如下,也改变了Excel文件名如前所述。

using NPOI.HSSF.UserModel; 
using NPOI.SS.UserModel; 
using NPOI.XSSF.UserModel; 
using NPOI.SS.Util; 
0

请试试这个,这会导出您的数据表数据的速度更快。

注:范围“FW”,我硬编码是因为我有179列。

public void UpdateExcelApplication(SqlDataTable dataTable) 
    { 
     var objects = new string[dataTable.Rows.Count, dataTable.Columns.Count]; 

     var rowIndex = 0; 

     foreach (DataRow row in dataTable.Rows) 
     { 
      var colIndex = 0; 

      foreach (DataColumn column in dataTable.Columns) 
      { 
       objects[rowIndex, colIndex++] = Convert.ToString(row[column]); 
      } 

      rowIndex++; 
     } 

     var range = this.workSheet.Range[$"A3:FW{dataTable.Rows.Count + 2}"]; 
     range.Value = objects; 

     this.workSheet.Columns.AutoFit(); 
     this.workSheet.Rows.AutoFit(); 
    }