3

我需要在同一个工作簿的两个 Excel 表中导出两个数据集的值。我的查询是这样的:

//数据集一:

        DataSet ds1 = new DataSet();
        SqlCommand commandOpen = new SqlCommand("storedproc1", conSql);
        commandOpen.CommandType = CommandType.StoredProcedure;
        var adaptOpen = new SqlDataAdapter();
        adaptOpen.SelectCommand = commandOpen;
        adaptOpen.Fill(ds1, "table");

//数据集二:

        DataSet ds2 = new DataSet();
        SqlCommand commandOpen = new SqlCommand("storedproc2", conSql);
        commandOpen.CommandType = CommandType.StoredProcedure;
        var adaptOpen = new SqlDataAdapter();
        adaptOpen.SelectCommand = commandOpen;
        adaptOpen.Fill(ds2, "table");

现在创建一个我使用过的 Excel 工作簿:

        ExcelLibrary.DataSetHelper.CreateWorkbook("C:/New Folder/file1.xls", ds1);

但不是这个,我想在同一个工作簿中添加两张纸;一个用于 ds1,另一个用于 ds2。怎么做?谢谢。

4

4 回答 4

4

可能重复:如何使用 Excellibrary 将数据集添加到工作表

在该问题的答案中,展示了如何将数据集导出到 excel 文件,但数据集中的每个表都有自己的工作表。您可以根据需要修改代码。

另一篇文章的代码:

public static void CreateWorkbook(String filePath, DataSet dataset)
    {
        if (dataset.Tables.Count == 0)
            throw new ArgumentException("DataSet needs to have at least one DataTable", "dataset");

        Workbook workbook = new Workbook();
        foreach (DataTable dt in dataset.Tables)
        {
            Worksheet worksheet = new Worksheet(dt.TableName);
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                // Add column header
                worksheet.Cells[0, i] = new Cell(dt.Columns[i].ColumnName);

                // Populate row data
                for (int j = 0; j < dt.Rows.Count; j++)
                    worksheet.Cells[j + 1, i] = new Cell(dt.Rows[j][i]);
            }
            workbook.Worksheets.Add(worksheet);
        }
        workbook.Save(filePath);
    }
于 2015-11-25T11:19:42.930 回答
3

使用多个工作表将数据集导出到 Excel,您可以使用以下代码。首先,您必须在应用程序中安装“ClosedXML” NuGet 包。

public DataSet GetDataSetExportToExcel()
    {
        DataSet ds = new DataSet();
        var SPNames = new List<string>() { "storedproc1", "storedproc2" };

        foreach (var SPName in SPNames)
        {
            DataTable dt = new DataTable();
            dt = GetDataTableExportToExcel(SPName);
            ds.Tables.Add(dt);
        }

        return ds;
    }

    private DataTable GetDataTableExportToExcel(string SPName)
    {
        DataTable dt = new DataTable();

        using (SqlConnection con = new SqlConnection(connectionString))
        {
            using (var cmd = new SqlCommand(SPName, con))
            {
                using (var sda = new SqlDataAdapter(cmd))
                {
                    cmd.CommandType = CommandType.StoredProcedure;
                    sda.Fill(dt);
                    return dt;
                }
            }
        }
    }

单击导出按钮使用以下代码

/// <summary>
    /// Export button click event
    /// </summary>
    /// <returns>Return the excel file with multiple sheets</returns>
    public ActionResult ExportToExcel()
    {
        var sheetNames = new List<string>() { "sheetName1", "sheetName2" };
        string fileName = "Example.xlsx";

        DataSet ds = GetDataSetExportToExcel();

        XLWorkbook wbook = new XLWorkbook();

        for (int k = 0; k < ds.Tables.Count; k++)
        {
            DataTable dt = ds.Tables[k];
            IXLWorksheet Sheet = wbook.Worksheets.Add(sheetNames[k]);
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                Sheet.Cell(1, (i + 1)).Value = dt.Columns[i].ColumnName;
            }
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    Sheet.Cell((i + 2), (j + 1)).Value = dt.Rows[i][j].ToString();
                }
            }
        }

        Stream spreadsheetStream = new MemoryStream();
        wbook.SaveAs(spreadsheetStream);
        spreadsheetStream.Position = 0;

        return new FileStreamResult(spreadsheetStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { FileDownloadName = fileName };
    }

我希望它会奏效。

于 2018-07-25T17:52:35.240 回答
2

在这里,我们可以将多个表格导出到单个 Excel 工作表中。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using Excel = Microsoft.Office.Interop.Excel;

namespace multiplesheets_export
{
    class Program
    {
    public static void Main(string[] args)
                {
                    object missing = Type.Missing;
                    SqlConnection con = new SqlConnection("Data Source=WINCTRL-KJ8RKFO;Initial Catalog=excel;Integrated Security=True");

                    SqlDataAdapter da = new SqlDataAdapter("select * from Employee", con);
                    SqlDataAdapter da1 = new SqlDataAdapter("select * from Department", con);

                    DataTable dt = new DataTable();
                    DataTable dt1 = new DataTable();

                    da.Fill(dt);
                    da1.Fill(dt1);

                    if (dt == null || dt.Columns.Count == 0)
                                                        throw new Exception("ExportToExcel: Null or empty input table!\n");
                    Excel.Application oXL = new Excel.Application();
                    Excel.Workbook oWB = oXL.Workbooks.Add(missing);
                    Excel.Worksheet oSheet = oWB.ActiveSheet as Excel.Worksheet;
                    oSheet.Name = "Employee Details";

                    for (var i = 0; i < dt.Columns.Count; i++)
                    {
                        oSheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
                    }
                    for (var i = 0; i < dt.Rows.Count; i++)
                    {
                        for (var j = 0; j < dt.Columns.Count; j++)
                        {
                            oSheet.Cells[i + 2, j + 1] = dt.Rows[i][j];
                        }
                    }

                    // From Here am taking EXCEL SHEET -2

                    Excel.Worksheet oSheet2 = oWB.Sheets.Add(missing, missing, 1, missing)as Excel.Worksheet;

                    if (dt1 == null || dt1.Columns.Count == 0)
                        throw new Exception("ExportToExcel: Null or empty input table!\n");
                    oSheet2.Name = "Depatment Details";

                    for (var i = 0; i < dt1.Columns.Count; i++)
                    {
                        oSheet2.Cells[1, i + 1] = dt1.Columns[i].ColumnName;
                    }
                    for (var i = 0; i < dt1.Rows.Count; i++)
                    {
                        for (var j = 0; j < dt1.Columns.Count; j++)
                        {
                            oSheet2.Cells[i + 2, j + 1] = dt1.Rows[i][j];
                        }
                    }
                    oXL.Visible = true;
                }
            }
        }
于 2017-03-31T06:10:59.813 回答
0

要将数据放入 Excel 工作表,您无需将数据放入数据集中。您可以通过多种方式将数据直接拉到 Excel 表上。其中一种方法是使用 QueryTables.Add 方法。使用这种方法,当在源上修改数据时,更改会反映在 excel 文件中。即:(使用示例罗斯文数据):

void Main()
{
  Microsoft.Office.Interop.Excel.Application xl = new Microsoft.Office.Interop.Excel.Application();
  var workbook = xl.Workbooks.Add();
  Worksheet sht1, sht2;
  sht1 = ((Worksheet)workbook.Sheets[1]);
  if (workbook.Sheets.Count < 2)
  {
    sht2 = (Worksheet)workbook.Sheets.Add();
  }
  else
  {
    sht2 = ((Worksheet)workbook.Sheets[2]);
  }
  xl.Visible = true;
  sht1.Move(sht2);

  sht1.Name = "Data Sheet 1";
  sht2.Name = "Data Sheet 2";

  string strCon = @"OLEDB;Provider=SQLNCLI11.0;server=.\SQLExpress;Trusted_Connection=yes;Database=Northwind";

  Range target1 = (Range)sht1.Range["A1"];
  sht1.QueryTables.Add(strCon, target1, "Select * from Customers" ).Refresh();

  Range target2 = (Range)sht2.Range["A1"];
  sht2.QueryTables.Add(strCon, target2, "Select * from Orders").Refresh();
}

另一种选择是使用 Nuget 的 Epplus 库。使用它,您可以简单地拥有许多工作表,您可以在其中从集合中加载内容。IE:

void Main()
{
  ExcelPackage pck = new ExcelPackage();

  var collection1 = from c in db.Customers
                    select new
                    {
                      CustomerName = c.CompanyName,
                      ContactPerson = c.ContactName,
                      FirstOrder = c.Orders.Min(o => o.OrderDate),
                      LastOrder = c.Orders.Max(o => o.OrderDate),
                      OrderTotal = c.Orders.Any() ? c.Orders.Sum(o => o.OrderDetails.Sum(od => od.Quantity * od.UnitPrice)) : 0M,
                      Orders = c.Orders.Count()
                    };
  var collection2 = db.Orders.Select(o => new {
         OrderId = o.OrderID, Customer=o.CustomerID, OrderDate=o.OrderDate});

  var ws1 = pck.Workbook.Worksheets.Add("My Sheet 1");

  //Load the collection1 starting from cell A1 in ws1
  ws1.Cells["A1"].LoadFromCollection(collection1, true, TableStyles.Medium9);
  ws1.Cells[2, 3, collection1.Count() + 1, 3].Style.Numberformat.Format = "MMM dd, yyyy";
  ws1.Cells[2, 4, collection1.Count() + 1, 4].Style.Numberformat.Format = "MMM dd, yyyy";
  ws1.Cells[2, 5, collection1.Count() + 1, 5].Style.Numberformat.Format = "$#,##0.0000";
  ws1.Cells[ws1.Dimension.Address].AutoFitColumns();

  var ws2 = pck.Workbook.Worksheets.Add("My Sheet 2");

  //Load the collection1 starting from cell A1 in ws1
  ws2.Cells["A1"].LoadFromCollection(collection2, true, TableStyles.Medium9);

  //...and save
  var fi = new FileInfo(@"d:\temp\AnonymousCollection.xlsx");
  if (fi.Exists)
  {
    fi.Delete();
  }
  pck.SaveAs(fi);
}

PS:QueryTables 和 Epplus 方法都很快。如果您无论如何都要使用数据集和/或在循环中设置单元格值,那么请确保您有小数据。

于 2015-11-25T11:28:41.220 回答