将数据表导出到 Excel 文件

     2023-02-22     60

关键词:

【中文标题】将数据表导出到 Excel 文件【英文标题】:Export DataTable to Excel File 【发布时间】: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 文件,例如 EPPlus。 Example here 和 here. 【参考方案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

【讨论】:

@jefissu 似乎关闭的 XML 已经知道旧版本的 .Net 框架存在问题github.com/ClosedXML/ClosedXML/issues/450【参考方案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:FWdataTable.Rows.Count + 2"];
        range.Value = objects;

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

【讨论】:

什么是“工作表”类型。在哪里声明,初始化..

将数据导出到 Excel 时如何更改文件名?

】将数据导出到Excel时如何更改文件名?【英文标题】:HowtochangethenameoffilewhileexportingdatatoExcel?【发布时间】:2013-02-2713:18:59【问题描述】:如何在将数据导出到Excel时更改文件名?<divid="example"class="k-content"><buttontype="button"... 查看详情

AnyLogic 将数据集导出到 excel 文件中

】AnyLogic将数据集导出到excel文件中【英文标题】:AnyLogicexportingdatasetintoexcelfile【发布时间】:2020-04-0209:00:03【问题描述】:我有一个名为datasetHourly的数据集,我想将模拟后的数据放入excel文件中,我该如何获得呢?我可以复制... 查看详情

使用 Pandas 将多个日志文件数据导出到单个 Excel

】使用Pandas将多个日志文件数据导出到单个Excel【英文标题】:ExportingMultiplelogfilesdatatosingleExcelusingPandas【发布时间】:2020-09-1510:38:07【问题描述】:如何将多个数据框导出到单个excel,我不是在谈论合并或组合。我只想将多个日... 查看详情

将 DataGridView 导出到 Excel 文件

】将DataGridView导出到Excel文件【英文标题】:ExportDataGridViewtoExcelFile【发布时间】:2014-04-0923:07:23【问题描述】:你能说我,我如何将DataGridView的内容保存到带有格式化单元格背景色/前景色的Exel文件?我有这样的DGV:当我尝试将... 查看详情

如何将sql server中的大量数据导出到excel文件中

】如何将sqlserver中的大量数据导出到excel文件中【英文标题】:Howtoexporthugedatafromsqlserverintoexcelfile【发布时间】:2017-05-3011:21:16【问题描述】:我想将sqlservermanagementstudio中的大数据(大约500万行,2列)导出到excel文件中,但是exc... 查看详情

使用 EPPlus 将 DataTable 导出到 Excel

...布时间】:2012-11-2002:54:06【问题描述】:我想使用EPPlus将数据表导出到Excel文件。该数据表具有int类型的属性,因此我希望Excel文件中的格式相同。有人知道如何将这样的DataTable导出到Excel吗?【问题讨论】:【参考方案1】:前... 查看详情

将数据从 MS Sql Server 存储过程导出到 excel 文件

】将数据从MSSqlServer存储过程导出到excel文件【英文标题】:exportdatafromMSSqlServerstoreproceduretoexcelfile【发布时间】:2014-12-1613:39:33【问题描述】:我有一个任务,那就是我想将数据从MSSqlServer存储过程导出到不同工作表中的excel文... 查看详情

怎样将sql数据导出到excel中

...容易对数据处理和方便用户邮箱传输。本次经验归纳了SQL数据表导出到EXCEL中的三种方法:1、复制粘贴,将SQL查询语句按指定条件导出数据;——适合小量数据。2、导出完整的SQL数据表为Excel文件;——适合大量数据。3、定时... 查看详情

如何使用 python 3 将数据从 textedit 导出到 excel 文件

】如何使用python3将数据从textedit导出到excel文件【英文标题】:Howtoexportdatafromtextedittoexcelfileusingpython3【发布时间】:2017-11-1608:07:52【问题描述】:今天遇到一个新问题,希望大家能帮帮我。我的问题是使用python3将数据从textedit... 查看详情

如何将access中的数据导出为excel文件?

...texcel或其他电子表格程序中使用microsoftaccess数据:可以将数据表作为无格式数据导出到microsoftexcel或其他电子表格程序中。可以将数据表、窗体或报表的导出直接作为excel(.xls)文件或工作表保存。可以将数据表、窗体或报表的导... 查看详情

将数据导出到 XML 以在 Excel 中打开

】将数据导出到XML以在Excel中打开【英文标题】:ExportingdatatoXMLtobeopenedinExcel【发布时间】:2012-03-2010:34:09【问题描述】:我有一个关于将数据保存到要由MicrosoftExcel打开的XML文件的问题。我在VisualC++中使用MFC构建了一个报表控件... 查看详情

通过保留数据类型将数据从 JSON 导出到 excel [关闭]

】通过保留数据类型将数据从JSON导出到excel[关闭]【英文标题】:ExportdatafromJSONtoexcelbypreservingdatatype[closed]【发布时间】:2015-08-3101:46:17【问题描述】:我正在使用alasql.js文件将JSON数据导出到excel文件中。我面临的问题是,当我... 查看详情

怎样将mysql数据导出到excel表中

...操作方法如下:1、打开NavicatforMySQL,单击core_db2、选择要导出的表右键,选择导出向导3、选择Excel4、设置导出文件的路径5、选择导出表的结构6、导出后就会看到下图的excel打开后的结果参考技术A借助客户端工具可以了,如dbvis... 查看详情

VBA 将 excel 单元格数据导出到 .txt 文件中

】VBA将excel单元格数据导出到.txt文件中【英文标题】:VBAtoexportexcelcelldatainto.txtfiles【发布时间】:2021-04-1517:50:19【问题描述】:我有一个Excel电子表格,它在C列的单元格中包含一些长文本,大约为400行。您可以在这里看到一个... 查看详情

如何使用pl/sql工具将oracle数据导出到excel

1、首先在SQLWindow窗口中,查询需要导出的数据。2、在查询的结果集上(注意不要选中任何一个行或者单元格)右键--【CopytoExcel】-->【Copyasxls/xlsx】导出到97-2003格式的.xls或者2007之后的xlsx文件.3、如果不想导出查询的全部数据... 查看详情

将数据从 Excel 导出到 Access - 错误:参数不是可选的

】将数据从Excel导出到Access-错误:参数不是可选的【英文标题】:ExportdatafromExceltoAccess-Error:ArgumentnotOptional【发布时间】:2012-07-0418:20:13【问题描述】:当我按下按钮时,我正在尝试使用我的Excel文件中的VBA代码将数据从Excel2010... 查看详情

将数据从平面文件加载到 Sql Server 表,并使用 SSIS 导出到 excel

】将数据从平面文件加载到SqlServer表,并使用SSIS导出到excel【英文标题】:LoaddatafromflatfiletoSqlServertableandalsoexporttoexcelusingSSIS【发布时间】:2020-11-1703:17:43【问题描述】:问题陈述:要求很简单,就是我们有一个平面文件(基本... 查看详情

如何将 SQL 语句结果导出到 Excel 文件

】如何将SQL语句结果导出到Excel文件【英文标题】:HowtoexportSQLstatementresultstoanExcelFile【发布时间】:2017-04-0518:59:39【问题描述】:我在ExcelVBA中有一个Access数据库和一个表单。我输入DB的所有数据都是通过VBA表单输入的。此数据... 查看详情