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

时间:2015-06-29 03:42:51

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

我想通过将我的数据输出到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++;
  }
}

2 个答案:

答案 0 :(得分:0)

以下代码段演示.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 

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

答案 1 :(得分:-1)

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

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

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