【问题标题】:Exporting datasets into multiple excel sheets of one excel file将数据集导出到一个 Excel 文件的多个 Excel 工作表中
【发布时间】:2016-02-28 03:10:46
【问题描述】:

我需要在同一个工作簿的两个 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。怎么做? 谢谢。

【问题讨论】:

    标签: c# .net visual-studio-2010 excellibrary


    【解决方案1】:

    Export DataSet to Excel With Multiple Sheets,您可以使用以下代码。 首先,您必须在您的应用程序中安装 "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 };
        }
    

    我希望它会起作用。

    【讨论】:

      【解决方案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;
                      }
                  }
              }
      

      【讨论】:

        【解决方案3】:

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

        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 库。使用它,您可以简单地拥有许多工作表,您可以在其中从集合中加载内容。即:

        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 方法都很快。如果您无论如何都要使用数据集和/或在循环中设置单元格值,那么请确保您拥有少量数据。

        【讨论】:

        • 它在第一行:Microsoft.Office.Interop.Excel.dll 和 Microsoft.Office.Interop.Excel。
        【解决方案4】:

        可能重复:how to add dataset to worksheet using 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);
            }
        

        【讨论】:

        • 这应该是公认的答案(甚至多年后。发现这个,它对我来说完美无缺!)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多