2009-11-17 6 views
30

Tôi có một DataTable với 30 cột và 6500+ hàng. Tôi cần phải đổ toàn bộ giá trị DataTable vào tệp Excel.Có ai đó hãy giúp với mã C#. Tôi cần mỗi giá trị cột phải là trong một ô.Để chính xác, tôi cần bản sao chính xác của DataTable trong tệp Excel. Vui lòng trợ giúp.Xuất DataTable sang Excel File

Cảm ơn, Vix

+0

Bạn có thể thử các kỹ thuật được mô tả ở đây: [C-Sharp Corner] (http://www.c-sharpcorner.com/UploadFile/DipalChoksi/exportxl_asp2_dc11032006003657AM/exportxl_asp2_dc.aspx) – Randolpho

Trả lời

63

sử dụng mã này ...

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

Trong tất cả các bài viết phức tạp tôi đi qua trên web để thực hiện điều này thật tuyệt khi tìm một giải pháp ngắn, đơn giản chỉ hoạt động. Cảm ơn nhiều! –

+0

Bất kỳ đề xuất nào để buộc Excel xử lý tất cả các trường dưới dạng chuỗi bất kể dữ liệu? Ví dụ: không thả các số 0 đứng đầu trong '0000012'. Tôi đã thử tiền tố các giá trị bằng dấu nháy đơn nhưng dấu nháy đơn xuất hiện trong bảng tính. –

+0

Đối với excel của tôi, các tab để chuyển đổi cột không hoạt động, bất kỳ giải pháp nào? – Gobliins

10

đoạn này có thể là nhanh hơn để thực hiện:

// 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

điều này không làm việc với tôi nó là tập tin excel đầu ra nhưng nó chứa bảng liên quan đến giao thức https như '(SERVER_PORT_SECURE, SERVER_PROTOCOL, SERVER_SOFTWARE)' và nghĩ rằng tôi không thực sự là gì ... có vẻ như cách tốt hơn sinces chúng tôi không cần phải ghi đè 'VerifyRenderingInServerForm' ... bạn có thể giúp tôi không ?? – sam

+0

những gì tôi đã bỏ lỡ? Tôi đặt mã đó vào phương thức và gọi nó từ nút 'onclick' event – sam

+0

tôi có cần trả lại gì không? – chungtinhlakho

0

Trong khi không phải là một thi .NET, bạn có thể tìm thấy rằng trình cắm thêm TableTools có thể có hiệu quả cao tùy thuộc vào đối tượng của bạn. Nó dựa trên flash mà không phải là một vấn đề đối với hầu hết các trường hợp cần phải thực sự làm việc chuyên sâu và sau đó muốn ghi lại thông tin dạng bảng.

Phiên bản mới nhất xuất hiện để hỗ trợ sao chép vào clipboard, thành CSV, ".XLS" (thực sự chỉ là tệp được phân cách bằng tab có tên .xls), sang PDF hoặc tạo phiên bản trang thân thiện với máy in với tất cả các hàng được hiển thị và phần còn lại của nội dung trang của bạn bị ẩn.

tôi thấy phần mở rộng trên DataTables trang web ở đây: http://datatables.net/extras/tabletools/

tải về là có sẵn trong các plug-in (extras) trang ở đây: http://datatables.net/extras/

Nó được cho là sẽ được tải về như một phần của DataTables (do đó cụm từ "Extras included in the DataTables package") nhưng tôi không tìm thấy nó trong bản tải xuống mà tôi đã sử dụng. Dường như làm việc tuyệt vời!

4

Liên kết dưới đây được sử dụng để xuất dữ liệu có thể định tuyến thành excel trong Mã C#.

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

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần quan trọng của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. –

-1

Hãy thử điều này để xuất dữ liệu sang Excel tập tin giống như trong DataTable và cũng có thể tùy chỉnh.

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

Câu trả lời xếp hạng cao nhất trong bài đăng này, tuy nhiên đó là tệp CSV. Nó không phải là tệp Excel thực tế. Vì vậy, bạn sẽ nhận được một cảnh báo khi bạn đang mở một tập tin.

Giải pháp tốt nhất tôi tìm thấy trên web đang sử dụng CloseXML http://closedxml.codeplex.com/ Bạn cũng cần phải mở 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(); 
     } 
    } 

Credit: 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

tôi sử dụng này trong 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

cảm ơn Volkan là cách tốt nhất mà chúng ta không cần phải ghi đè 'VerifyRenderingInServerForm' .... Volkan Tôi thực sự đánh giá cao ý kiến ​​của bạn trên mỗi dòng để giải thích những gì đang diễn ra và điều đó cũng hữu ích cho người khác .. ** theo cách đó, hãy tìm kiếm ** – sam

+0

Volkan xin lỗi khi tôi bỏ ghi chú dòng ... Tôi nhận được lỗi Tôi đã cố gắng để hiểu nó là mục đích? '//response.AddHeader("Content-Length", file.Length.ToString()); ' – sam

+0

Tôi đã thêm một số nhận xét cho dòng tôi hiểu, vui lòng cung cấp thêm ... Cảm ơn rất nhiều – sam

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

Đây dt đề cập đến qua DataTable của bạn như là một paramter

0

Hầu hết các câu trả lời thực sự sản xuất CSV mà tôi không phải lúc nào cũng có trải nghiệm tốt khi mở trong Excel.

Một cách để thực hiện nó cũng sẽ là ACE OLEDB Provider (xem thêm connection strings for Excel). Tất nhiên bạn phải cài đặt và đăng ký nhà cung cấp. Bạn có nó, nếu bạn đã cài đặt Excel, nhưng đây là điều bạn phải xem xét khi triển khai (ví dụ: trên máy chủ web).

Trong mã bên dưới lớp helper bạn sẽ phải gọi một cái gì đó giống như 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

đang làm việc cho Excel Export

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

Tại sao bạn lại đăng lại câu trả lời được chấp nhận như câu trả lời của bạn? –

0

Nếu bạn xuất DataTable vượt trội với văn bản tiêu đề định dạng thử như điều này.

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

Tôi đã thực hiện chuyển đổi DataTable sang Excel bằng mã sau. Hy vọng nó rất dễ dàng không cần phải thay đổi nhiều hơn chỉ cần copy & pest mã thay thế biến của bạn với biến của bạn, và nó sẽ hoạt động đúng.

Trước tiên hãy tạo thư mục trong giải pháp Tài liệu và tạo tệp Excel MyTemplate.xlsx. bạn có thể thay đổi tên theo yêu cầu của bạn. Nhưng hãy nhớ rằng bạn phải thay đổi tên trong mã.

hãy tìm đoạn mã sau ...

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

Mã này bạn chỉ cần sao chép & dịch hại trong kịch bản của bạn và thêm Namespace như sau, Ngoài ra thay đổi tên file excel như đã thảo luận trước đó.

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

Hãy thử điều này, điều này sẽ xuất dữ liệu bảng dữ liệu của bạn nhanh hơn để vượt trội.

Lưu ý: Phạm vi "FW", mà tôi đã mã hóa cứng là vì tôi có 179 cột.

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