2009-11-17 6 views
30

У меня есть DataTable с 30 + столбцами и 6500+ строк. Мне нужно сбросить все значения DataTable в файл Excel. Может кто-нибудь помочь с кодом C#. Мне нужно, чтобы каждое значение столбца было в ячейке. Чтобы быть точным, мне нужна точная копия DataTable в файле Excel. Пожалуйста, помогите.Экспорт данных в файл Excel

Спасибо, Vix

+0

Вы могли бы попробовать технику, описанную здесь: [C-Sharp Corner] (http://www.c-sharpcorner.com/UploadFile/DipalChoksi/exportxl_asp2_dc11032006003657AM/exportxl_asp2_dc.aspx) – Randolpho

ответ

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

Из всех запутанных статей I наткнулся на Интернет, чтобы добиться этого, было приятно найти короткое, простое решение, которое просто работает. Большое спасибо! –

+0

Любые предложения, чтобы заставить Excel обрабатывать все поля как строку независимо от данных? Например, не отбрасывайте ведущие нули в '0000012'. Я попробовал префикс значений с апострофом, но апостроф появился в электронной таблице. –

+0

Для моего excel, вкладки для переключения столбцов не работают, какие-либо решения? – Gobliins

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)' и думаю, что я действительно не понимаю, что это такое ... кажется, что лучше, нужно переопределить 'VerifyRenderingInServerForm' ... вы можете мне помочь? – sam

+0

что я пропустил? Я поместил этот код в метод и вызвал его из кнопки 'onclick' event – sam

+0

мне нужно что-нибудь вернуть? – chungtinhlakho

0

Хотя не реализация .NET, вы можете найти что плагин TableTools может быть очень эффективным в зависимости от вашей аудитории. Он полагается на флеш-память, которая не должна быть проблемой для большинства случаев необходимости фактической работы в глубину, а затем для записи табличной информации.

Последняя версия, похоже, поддерживает копирование в буфер обмена, в CSV, «.XLS» (на самом деле только файл с разделителями табуляции с именем .xls), в PDF-файл или создает версию для печати со всеми отображаемыми строками и остальная часть содержимого вашей страницы скрыта.

Я нашел продолжение на сайте DataTables здесь: http://datatables.net/extras/tabletools/

Загрузка доступна в плагинов (дополнений) страница здесь: http://datatables.net/extras/

Это предположительно может быть загружен как часть DataTables (отсюда фраза «Дополнительные функции, включенные в пакет DataTables»), но я не нашел ее в используемой вами загрузке. Кажется, работает чудесно!

4

Ниже ссылка используется для экспорта datatable в excel в C# Code.

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

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. –

-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, что это лучший способ совести, нам не нужно переопределять 'VerifyRenderingInServerForm' .... Volkan. Я очень ценю, что вы задавали комментарии к каждой строке, чтобы объяснить, что происходит, и это было бы полезно и для других. ** Я рекомендую таким образом, дорогой Searcher ** – sam

+0

Volkan, пожалуйста, дорогой, когда я раскомментирую эту строку ... Я получаю ошибку, я пытался понять, что это цель? '//response.AddHeader("Content-Length", file.Length.ToString()); ' – sam

+0

Я добавил комментарий для строки, которую я понимаю, пожалуйста, предоставьте больше ... Спасибо alot – 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); 

Здесь дт относится к вашему DataTable перевале в качестве параметра

0

Большинство ответов на самом деле производит CSV, с которым у меня не всегда есть хороший опыт при открытии в Excel.

Один из способов сделать это будет также с ACE OLEDB Provider (см. Также connection strings for Excel). Конечно, вам нужно будет установить и зарегистрировать провайдера. У вас это есть, если у вас установлен Excel, но это то, что вам нужно учитывать при развертывании (например, на веб-сервере).

В ниже помощника класса код, который вы должны были бы вызвать что-то вроде 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

Зачем вы отменили принятый ответ как ваш ответ? –

0

Если экспортировать DataTable, чтобы преуспеть с форматированный текст заголовка попробовать как это.

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

Этот код нужно просто скопировать & вредителя в сценарии и добавить пространство имен следующим образом, также изменить имя файла первенствовать, как обсуждалось ранее.

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

Пожалуйста, попробуйте это, это позволит быстрее экспортировать данные таблицы данных в Excel.

Примечание: Диапазон «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(); 
    } 
Смежные вопросы