【问题标题】:Export .NET DataTable to Microsoft Excel and Format Results将 .NET DataTable 导出到 Microsoft Excel 并格式化结果
【发布时间】:2015-06-29 03:42:51
【问题描述】:

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

的调试错误

无法将“System.Web.UI.WebControls.DataGridItem”的对象类型转换为类型 '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++;
  }
}

【问题讨论】:

    标签: c# asp.net .net excel datatable


    【解决方案1】:

    以下代码 sn-p 演示了 .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 
    

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

    【讨论】:

    • 这个需要下载用户的PC上安装Excel吗?是否需要特定版本的 Excel?
    • 需要安装Excel应用程序,版本可以是任何XP+。这是使用此 DataTable Export to MS Excel 程序的实际应用程序的链接(可下载试用 WPF 应用程序的链接:infosoft.biz/download.aspx)。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-10-01
      • 2018-10-02
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 2021-07-23
      相关资源
      最近更新 更多