【问题标题】:Export DataTable to Excel File将数据表导出到 Excel 文件
【发布时间】:2009-11-17 05:02:29
【问题描述】:

我有一个包含 30 多列和 6500 多行的 DataTable。我需要将整个 DataTable 值转储到 Excel 文件中。任何人都可以帮忙处理 C# 代码。我需要每个列值都在一个单元格中。准确地说,我需要 Excel 文件中与 DataTable 完全相同的副本。请帮忙。

谢谢, 波动率

【问题讨论】:

  • 你可以试试这里描述的技术:C-Sharp Corner
  • 几乎所有的答案都在这里写一个(HtmlTextWriter)字符串或有互操作代码。两者都不要使用。这将导致您稍后在 DateTime 和 Decimal 格式方面出现问题。 Excel 也会发出警告,因为您生成的不是“真正的”Excel 文件,而是扩展名为 .xls 的 HTML 页面。开始使用专门的库来创建 Excel 文件,例如 EPPlusExample herehere.

标签: c# asp.net excel datatable export


【解决方案1】:

使用此代码...

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

【讨论】:

  • 在我在网上遇到的所有复杂的文章中,我很高兴找到一个简短而简单的解决方案。非常感谢!
  • 有什么建议可以强制 Excel 将所有字段视为字符串,而不管数据如何?例如,不要删除 '0000012' 中的前导零。我尝试在值前加上撇号,但撇号出现在电子表格中。
  • 为什么这实际上对我没有任何作用?即使我逐字复制它,它也不会下载文件......
  • 用什么来合并单元格? \t 用于移动到同一行的新单元格,\n 用于移动到新行,
  • 此代码下载一个 CSV 文件,没有任何格式;如果您在合并单元格、背景单元格颜色等方面需要更大的灵活性,您应该阅读此问题的其他答案。
【解决方案2】:

这个 sn-p 可以更快地实现:

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

【讨论】:

  • 这对我不起作用,它是输出 excel 文件,但它包含与 https 协议相关的表,如 (SERVER_PORT_SECURE, SERVER_PROTOCOL,SERVER_SOFTWARE) 并认为我真的不知道它是什么......这似乎更好,因为我们这样做了不需要覆盖VerifyRenderingInServerForm...你能帮我吗??
  • 我错过了什么?我将该代码放入方法中并从按钮onclick事件调用它
  • 我需要退货吗?
  • @chungtinhlakho,这个方法渲染一个 HTML 表格并写入响应流;如果您遇到不同的问题,请提出一个新问题;)
【解决方案3】:

以下链接用于在 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;
                }
            }
        }
    }

【讨论】:

  • 其实不是excel创建程序。它以制表符分隔的形式生成纯文本,并将数据保存在具有 .xls 扩展名的文件中。由于 Microsoft Excel 软件知道打开 .此类文件,因此人们认为它是一个 excel 文档。在任何纯文本编辑器(例如“记事本”或“EditPlus”)中打开相同的文件,您就会了解。 Microsoft Excel 文档遵循 ​​OLE 原则。我希望这对尝试关注此主题的人有所帮助。
【解决方案4】:

这篇文章中排名最高的答案,但它是 CSV 文件。它不是实际的 Excel 文件。因此,您在打开文件时会收到警告。

我在网上找到的最佳解决方案是使用 CloseXML https://github.com/closedxml/closedxml 您还需要打开 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

【讨论】:

【解决方案5】:

我在页面中使用了这个。`

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

【讨论】:

  • 感谢 Volkan 这是最好的方法,因为我们不需要覆盖 VerifyRenderingInServerForm .... Volkan 我非常感谢您在每行设置 cmets 来解释正在发生的事情,这对其他人有用太.. 亲爱的搜索者,我推荐这种方式
  • Volkan 亲爱的,当我取消注释该行时...我收到错误我试图理解这是目的吗? //response.AddHeader("Content-Length", file.Length.ToString());
  • 我已经为我理解的行添加了一些评论,请提供更多...非常感谢
【解决方案6】:
            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 指的是你的 DataTable 传递作为参数

【讨论】:

    【解决方案7】:

    虽然不是 .NET 实现,但您可能会发现插件 TableTools 可能非常有效,具体取决于您的受众。它依赖于闪存,对于大多数需要实际深入工作然后想要记录表格信息的情况来说,这应该不是问题。

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

    我在 DataTables 网站上找到了扩展程序:http://datatables.net/extras/tabletools/

    可在此处的插件(附加)页面下载:http://datatables.net/extras/

    据说它是作为 DataTables 的一部分下载的(因此有短语“DataTables 包中包含的附加内容”),但我在一直使用的下载中没有找到它。看起来效果很好!

    【讨论】:

      【解决方案8】:

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

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

      【讨论】:

        【解决方案9】:

        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)
                { }
        

        【讨论】:

        • 您为什么将已接受的答案重新发布为您的答案?
        【解决方案10】:

        尝试将数据导出到与DataTable中相同的Excel文件,也可以自定义。

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

        【讨论】:

          【解决方案11】:

          如果您要使用格式化的标题文本将数据表导出到 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();
          
              }
          

          【讨论】:

            【解决方案12】:

            我已经使用以下代码完成了 DataTable 到 Excel 的转换。希望这很容易,无需更改更多内容,只需复制代码并用您的变量替换您的变量,它就会正常工作。

            首先在您的解决方案 Document 中创建一个文件夹,然后创建一个 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;
            

            【讨论】:

              【解决方案13】:

              请试试这个,这将更快地将您的数据表数据导出到 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();
                  }
              

              【讨论】:

              • 什么是“工作表”类型。在哪里声明,初始化..
              猜你喜欢
              • 1970-01-01
              • 2015-09-27
              • 2017-03-27
              • 1970-01-01
              • 2013-11-01
              • 1970-01-01
              • 2012-08-01
              • 1970-01-01
              相关资源
              最近更新 更多