【问题标题】:Export DataTable to Excel?将数据表导出到 Excel?
【发布时间】:2009-08-17 10:29:24
【问题描述】:

我需要显示如何将 DataTable 导出到 Excel 电子表格的代码。

 string data = null;
            int i = 0;
            int j = 0;
            string sFileName=null;

            Excel.Application xlApp;
            Excel.Workbook xlWorkBook;
            Excel.Worksheet xlWorkSheet;
            object misValue = System.Reflection.Missing.Value;

            xlApp = new Excel.ApplicationClass();
            xlWorkBook = xlApp.Workbooks.Add(misValue);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

            for (i = 0; i <= dt.Rows.Count - 1; i++)
            {
                for (j = 0; j <= dt.Columns.Count - 1; j++)
                {
                    data = dt.Rows[i].ItemArray[j].ToString();
                    xlWorkSheet.Cells[i + 1, j + 1] = data;
                }
            }

            SaveFileDialog oDialog = new SaveFileDialog();
            oDialog.Filter = "Excel files | *.xls";
            if (oDialog.ShowDialog() == DialogResult.OK)
            {
                sFileName = oDialog.FileName;
            }

            if (sFileName != null)
            {
                xlWorkBook.SaveAs(sFileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
                xlWorkBook.Close(true, misValue, misValue);
                xlApp.Quit();
                MessageBox.Show("Report saved with file: " + sFileName, "To Excel", MessageBoxButtons.OK, MessageBoxIcon.Information);


            }
            else
            {
                //oEXLApp.ActiveWorkbook.Close(false, Missing.Value, Missing.Value);
                MessageBox.Show("Cannot export to excel...", "Can't export", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            releaseObject(xlWorkSheet);
            releaseObject(xlWorkBook);
            releaseObject(xlApp);

这段代码可以将数据表导出到excel,但问题是我没有得到列名。 我希望 dt(DataTable) 列名显示比值来。

【问题讨论】:

    标签: c#


    【解决方案1】:

    最简单的解决方案是只做一个小循环

     xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
    //new code here
    for(int i=0; i<dt.Columns.Count; i++)
    {
      xlWorkSheet.Cells[0,i] = dt.Columns[i].ColumnName;
    }
    
    for (i = 0; i <= dt.Rows.Count - 1; i++)
    {
        for (j = 0; j <= dt.Columns.Count - 1; j++)
        {
             data = dt.Rows[i].ItemArray[j].ToString();
             xlWorkSheet.Cells[i + 2, j + 1] = data;
        }
    }
    

    【讨论】:

    • 将 Cells[hereOrThere] 替换为要在其中包含列的索引,并在添加表值之前放置代码( for (i = 0; i
    【解决方案2】:
    require 'spreadsheet'
    
    def export_from_db_to_excel(model)
      @format = Spreadsheet::Format.new(:weight => :bold)
      @template_folder = File.join(Rails.root, 'vendor','gems','omni','db','import','templates') 
      @template_file = File.join(@template_folder, "my_file_to_write_to")
      @book = Spreadsheet::Workbook.new  
      write_sheet = Spreadsheet::Workbook.new :name => model.table_name
      write_sheet.row(0).set_format(0, @format)
      write_sheet.row(0).push 'display'
      # Create header row
      model.columns.each_with_index do |col, i| 
        puts 'processing attribute: ' + col.name
        column = ""
        column << "*" unless col.null  #to indicate required fields
        column << "#{col.name}"
        write_sheet.row(0).set_format(i+1, @format)
        write_sheet.row(0).push column
      end
      # Insert data
      model.all.each do |row|
        row.keys.reject {|k| !row[k] or row[k] == ' '}.each {|attribute_name| write_sheet.row(0).push row[attribute_name]
      end
      @book.write @template_file = File.join(@template_folder, @template_file)
    end
    

    【讨论】:

      【解决方案3】:

      这是我为此任务编写的扩展方法:

          public static Range LoadFromDataTable(this Worksheet ws, int startRow, int startCol, System.Data.DataTable dt)
          {
              var columnHeaders = new List<string>();
              for (int i = 0; i < dt.Columns.Count; i++)
              {
                  columnHeaders.Add(dt.Columns[i].ColumnName);
              }
              ws.Range[ws.Cells[startRow, startCol], ws.Cells[startRow, startCol + dt.Columns.Count - 1]].Value2 = columnHeaders.ToArray();
      
              //Transfer dt data to 2d array
              var data = new object[dt.Rows.Count, dt.Columns.Count];
              for (int rowIndex = 0; rowIndex < dt.Rows.Count; rowIndex++)
              {
                  for (int colIndex = 0; colIndex < dt.Columns.Count; colIndex++)
                  {
                      data[rowIndex, colIndex] = dt.Rows[rowIndex][colIndex];
                  }
              }
              ws.Range[ws.Cells[startRow + 1, startCol], ws.Cells[startRow + dt.Rows.Count, startCol + dt.Columns.Count - 1]].Value2 =
                  data;
      
              var rng = ws.Range[ws.Cells[startRow, startCol], ws.Cells[startRow + dt.Rows.Count, startCol + dt.Columns.Count - 1]];
              return rng;
          }
      

      我转移到二维数组的原因是出于性能考虑。

      【讨论】:

        猜你喜欢
        • 2017-03-27
        • 2015-08-05
        • 2010-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-14
        相关资源
        最近更新 更多