【问题标题】:Dataset export to excel and write multiple sheets in excel数据集导出到excel并在excel中写入多张工作表
【发布时间】:2015-01-22 05:29:16
【问题描述】:

我在我的项目中有一个要求,即来自多个数据库表的数据应该按照 excel 文件中的表单导出,比如如果数据集包含 4 个表,那么表 0 应该是国家,表 1 应该是州等等......所以请向我建议任何可以一次将多个数据表导出到 excel 文件的方法,并且应该在运行时生成 excel。我正在使用 C# ASP.NET

【问题讨论】:

  • 提供示例代码,并展示您的尝试。
  • 我已成功完成从 1 个表格导出到 1 个 excel 文件中的 1 个工作表,但对于多个工作表,我遇到了困难...... :(
  • 显示代码并解释你卡在哪里。你用什么导出到excel表?

标签: c# asp.net sql-server excel ado


【解决方案1】:

我只需将新工作簿添加到每个表的工作簿对象,然后遍历将每个表写入工作簿的表。默认情况下会创建 3 个工作簿,因此如果数据集中的表超过三个,则需要删除额外的工作簿。

var ds = [Your dataset here];
Worksheet objWorkSheet1 = null;
Application objExcel = new Application {Visible = false};
Workbooks objWorkbooks = objExcel.Workbooks;
Workbook objWorkbook = objWorkbooks.Add(Missing.Value);
Sheets objSheets = objWorkbook.Worksheets;

if (ds.Tables.Count > objSheets.Count)
{
    // add extra sheets
    for (var i = objSheets.Count; i < ds.Tables.Count; i++)
    {
        var objWorkSheet2 = (Worksheet)objSheets[i];
        objWorkSheet1 = (Worksheet)objSheets.Add(Missing.Value, objWorkSheet2, 1, XlSheetType.xlWorksheet);
        Marshal.ReleaseComObject(objWorkSheet2);
        Marshal.ReleaseComObject(objWorkSheet1);
        objWorkSheet1 = null;
    }
}
while (ds.Tables.Count < objSheets.Count)
{
    // remove unnecessary sheets
    var objWorkSheet2 = (Worksheet)objSheets[ds.Tables.Count];
    objWorkSheet2.Delete();
    Marshal.ReleaseComObject(objWorkSheet2);
}
Range objCells;
Range myCell;
for (var t = 0; t < ds.Tables.Count; t++)
{// for each table in the dataset fill in the sheet 
    var iCurrentRow = 1;
    var dt = ds.Tables[t];
    objWorkSheet1 = (Worksheet)(objSheets[t + 1]);
    objCells = objWorkSheet1.Cells;

    //Start writing the table to the worksheet
    // Get the sheet and write the headers
    for (var h = 0; h < dt.Columns.Count; h++)
    {
        myCell = (Range)objCells[iCurrentRow, h + 1];
        myCell.Value2 = dt.Columns[h].ColumnName;
        Marshal.ReleaseComObject(myCell);
    }
    iCurrentRow++;
    // write the data rows
    for (var r = 0; r < dt.Rows.Count; r++)
    {
        // Get the sheet and write the headers
        for (var c = 0; c < dt.Columns.Count; c++)
        {
            myCell = (Range)objCells[r + iCurrentRow, c + 1];
            myCell.Value2 = dt.Rows[r][c].ToString();
            Marshal.ReleaseComObject(myCell);
        }
    }
    Marshal.ReleaseComObject(objCells);
    objCells = null;
    Marshal.ReleaseComObject(objWorkSheet1);
    objWorkSheet1 = null;
}
//End writing the data table to the sheet

// select the first cell in the first sheet
objWorkSheet1 = (Worksheet)(objSheets[1]);
objCells = objWorkSheet1.Cells;
myCell = (Range)objCells[1, 1];
Marshal.ReleaseComObject(myCell);
myCell = null;
Marshal.ReleaseComObject(objCells);
objCells = null;
Marshal.ReleaseComObject(objWorkSheet1);
objWorkSheet1 = null;

// save the file to the new location with new name.
objWorkbook.Close(true, [your filename here to save to], Missing.Value);

objWorkbooks.Close();
objExcel.Quit();

另一种方法是使用报告服务。报表的每一页都会在 Excel 中呈现到自己的工作表中。

【讨论】:

  • 感谢您的快速回复 但我对此有些担忧 1. 默认情况下,路径是我的文档,我希望它以下载格式下载,并且 2. 已创建工作表但其中没有数据?
  • 我已经添加了将表格写入工作表的代码。至于保存文件。将带有文件名的完整路径放在 [your filename here to save to] 所在的位置。这对我写入远程文件服务器很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
相关资源
最近更新 更多