【问题标题】:How to export data table with proper formatting and write text in Excel using C# Microsoft.Office.Interop.Excel?如何使用 C# Microsoft.Office.Interop.Excel 以正确的格式导出数据表并在 Excel 中写入文本?
【发布时间】:2012-10-03 13:02:07
【问题描述】:

我正在使用此功能将数据表导出到excel中。

  protected void ExportExcel(System.Data.DataTable dt) 
    { 
         if (dt == null||dt.Rows.Count==0) return; 
         Microsoft.Office.Interop.Excel.Application xlApp = 
new Microsoft.Office.Interop.Excel.Application(); 

 if (xlApp == null) 
 { 
     return; 
 } 
 System.Globalization.CultureInfo CurrentCI = 
System.Threading.Thread.CurrentThread.CurrentCulture; 
 System.Threading.Thread.CurrentThread.CurrentCulture = 
    new System.Globalization.CultureInfo("en-US"); 
 Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks; 
 Microsoft.Office.Interop.Excel.Workbook workbook = 
 workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet); 
 Microsoft.Office.Interop.Excel.Worksheet worksheet = 
(Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1]; 
 Microsoft.Office.Interop.Excel.Range range; 
 long totalCount = dt.Rows.Count; 
 long rowRead = 0; 
 float percent = 0; 
 for (int i = 0; i < dt.Columns.Count; i++) 
 { 
     worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName; 
     range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1]; 
     range.Interior.ColorIndex = 15; 
     range.Font.Bold = true; 

 } 

 for (int r = 0; r < dt.Rows.Count; r++) 
 { 
     for (int i = 0; i < dt.Columns.Count; i++) 
     { 
         worksheet.Cells[r + 2, i + 1] = dt.Rows[r][i].ToString(); 
     } 
     rowRead++; 
     percent = ((float)(100 * rowRead)) / totalCount; 
 }

 xlApp.Visible = true;
}

正如您在生成的 excel 图像中看到的那样,列的格式不正确,即列大小不适应数据绑定项。如何让excel单元格根据数据表自动调整?

我还想添加一些文本,可能是标题,例如“System.DateTime.Now”或“数据表名称”。我该怎么做?

【问题讨论】:

    标签: c# datatable formatting export-to-excel


    【解决方案1】:

    您应该能够像这样格式化列:

    Microsoft.Office.Interop.Excel.Range columns = worksheet.UsedRange.Columns;
    columns.AutoFit();
    

    您可以插入一个新行并将当前日期作为标题,如下所示:

    worksheet.Rows[1].Insert();
    Excel.Range newRow = worksheet.Rows[1];
    Excel.Range newCell = newRow.Cells[1];
    newCell.Value = DateTime.Now.ToString("yyyy-MM-dd");
    

    还要将此添加到您的 using 语句中,这样您就无需在每次使用 Excel 对象时都使用完全限定名称:

    using Excel = Microsoft.Office.Interop.Excel;
    

    此外,我还整理了您的方法,添加了一些 using 语句以减少混乱,删除一些不必要的强制转换和对应用程序对象进行不必要的 null 检查,就在分配对象之后:

    using Excel = Microsoft.Office.Interop.Excel;
    using System.Globalization;
    using System.Threading;
    using System.Data;
    
    protected void ExportExcel(DataTable dt)
    {
        if (dt == null || dt.Rows.Count == 0) return;
    
        var xlApp = new Excel.Application();
        //Is this used?
        CultureInfo CurrentCI = Thread.CurrentThread.CurrentCulture;
    
        Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
    
        Excel.Workbooks workbooks = xlApp.Workbooks;
    
        Excel.Range range
    
        Excel.Workbook workbook = workbooks.Add();
        Excel.Worksheet worksheet = workbook.Worksheets[1];
    
        long totalCount = dt.Rows.Count;
        long rowRead = 0;
        float percent = 0;
    
        for (var i = 0; i < dt.Columns.Count; i++)
        {
            worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
    
            range = worksheet.Cells[1, i + 1];
            range.Interior.ColorIndex = 15;
            range.Font.Bold = true;
        }
    
        for (var r = 0; r < dt.Rows.Count; r++)
        {
            for (var i = 0; i < dt.Columns.Count; i++)
            {
                worksheet.Cells[r + 2, i + 1] = dt.Rows[r][i].ToString();
            }
    
            rowRead++;
    
            //is this used?
            percent = ((float)(100 * rowRead)) / totalCount;
        }    
    
        Microsoft.Office.Interop.Excel.Range columns = worksheet.UsedRange.Columns;
        columns.AutoFit();
    
        worksheet.Rows[1].Insert();
        Excel.Range newRow = worksheet.Rows[1];
        Excel.Range newCell = newRow.Cells[1];
        newCell.Value = DateTime.Now.ToString("yyyy-MM-dd");
    
        xlApp.Visible = true;
    }
    

    【讨论】:

    • 我试过你的代码,有一些错误。在线“ wholeSheet.AutoFit();” - COMexception 未处理 - Range 类的 AutoFit 方法失败。在线“Excel.Range newRow = worksheet.Rows.Insert();” - COMexception 未处理 - “为防止可能的数据丢失,Excel 无法将非空白单元格移出工作表。选择另一个位置插入新单元格,或从工作表末尾删除数据。”
    • 完美运行!谢谢老哥!
    • 请问您使用的是什么版本的互操作库?我在网上遇到错误:worksheet.Rows[1].Insert();错误是方法 'this' 没有重载需要 '1' 参数,果然,文档说你需要两个参数(列和行)。我的图书馆是:12.0.0.0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    相关资源
    最近更新 更多