将 .NET DataTable 导出到 Microsoft Excel 并格式化结果

Export .NET DataTable to Microsoft Excel and Format Results

我想通过将我的数据导出到 Excel 来设置行高。我尝试了以下操作,但出现

的调试错误

Unable To Cast object type of 'System.Web.UI.WebControls.DataGridItem' to type 'System.Web.UI.WebControls.GridViewRow'

这是我的语法

public void ExportToExcel(DataTable dataTable)
{
  string filename = "Bamo.xls";
  StringWriter tw = new System.IO.StringWriter();
  HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
  DataGrid dgGrid = new DataGrid();
  dgGrid.DataSource = dataTable;
  dgGrid.DataBind();
  int j = 0;
  foreach(GridViewRow gvrow in dgGrid.Items)
  {
    if (j % 2 != 0)
    {
        for (int k = 0; k < gvrow.Cells.Count; k++)
        {
            gvrow.Cells[k].Style.Add("Height", "10");
        }
    }
    j++;
  }
}

以下代码片段演示了 .NET DataTable 导出到 MS Excel 与各种数据类型相关的工作表和格式化技术(用 C# 编码):

public bool Export2Excel(DataTable dataTable)
{
    object misValue = System.Reflection.Missing.Value;

    Microsoft.Office.Interop.Excel.Application _appExcel = null;
    Microsoft.Office.Interop.Excel.Workbook _excelWorkbook = null;
    Microsoft.Office.Interop.Excel.Worksheet _excelWorksheet = null;
    try
    {

        if (dataTable.Rows.Count <= 0) { throw new ArgumentNullException("Table is Empty"); }

        // excel app object
        _appExcel = new Microsoft.Office.Interop.Excel.Application();

        // excel workbook object added to app
        _excelWorkbook = _appExcel.Workbooks.Add(misValue);
        _excelWorksheet = _appExcel.ActiveWorkbook.ActiveSheet as Microsoft.Office.Interop.Excel.Worksheet;

        // column names row (range obj)
        Microsoft.Office.Interop.Excel.Range _columnsNameRange;
        _columnsNameRange = _excelWorksheet.get_Range("A1", misValue).get_Resize(1, dataTable.Columns.Count);

        // column names array to be assigned to _columnNameRange
        string[] _arrColumnNames = new string[dataTable.Columns.Count];

        // set Excel columns NumberFormat property
        // note; most important for decimal-currency, DateTime
        for (int i = 0; i < dataTable.Columns.Count; i++)
        {
            // array of column names
            _arrColumnNames[i] = dataTable.Columns[i].ColumnName;

            string _strType = dataTable.Columns[i].DataType.FullName.ToString();
            switch (_strType)
            {
                case "System.DateTime":
                {
                    _excelWorksheet.Range["A1"].Offset[misValue, i].EntireColumn.NumberFormat = "MM/DD/YY";
                    break;
                }
                case "System.Decimal":
                {
                    _excelWorksheet.Columns["A"].Offset[misValue, i].EntireColumn.NumberFormat = "$ #,###.00";
                    break;
                }
                case "System.Double":
                {
                    _excelWorksheet.Columns["A"].Offset[misValue, i].EntireColumn.NumberFormat = "#.#";
                    break;
                }
                case "System.Int8":
                case "System.Int16":
                case "System.Int32":
                case "System.Int64":
                {
                    // use general format for int
                    //_excelWorksheet.Columns["A"].Offset[misValue, i].EntireColumn.NumberFormat = "####";
                    break;
                }
                default: break;
            }
        }

        // assign array to column headers range, make 'em bold
        _columnsNameRange.set_Value(misValue, _arrColumnNames);
        _columnsNameRange.Font.Bold = true;

        // populate data content row by row
        for (int Idx = 0; Idx < dataTable.Rows.Count; Idx++)
        {
            _excelWorksheet.Range["A2"].Offset[Idx].Resize[1, dataTable.Columns.Count].Value =
            dataTable.Rows[Idx].ItemArray;
        }

        // Autofit all Columns in the range
        _columnsNameRange.Columns.EntireColumn.AutoFit();

        // quit excel app process
        if (_appExcel != null)
        {
            _appExcel.UserControl = false;
            _appExcel.Quit();
        }
        return true;
    }
    catch {  throw; }
    finally
    {
        _excelWorksheet = null;
        _excelWorkbook = null;
        _appExcel = null;
        misValue = null;
    }
}
#endregion 

您可以根据自己的特定目的对其进行自定义。 希望这可能有所帮助。

我使用你的代码有一段时间了,但为字符串添加了额外的格式:

    case "System.String":
    {
        // format as text
        _excelWorkSheet.Columns["A"].Offset[misValue, i].EntireColumn.NumberFormat = "@";
        break;
    }

这解决了一个问题(HRESULT 异常:0x800A03EC 错误),当您导出到 excel 并且在任何字符串的开头有一个等号 (=) 时。 Excel 将此识别为调用或公式的开始,因此它会尝试解决可能不存在或无法完成的问题。