2015-11-25 3 views
0

Мне нужно экспортировать два значения набора данных в два листа Excel одной и той же книги. мой запрос, как:Экспорт наборов данных на несколько листов excel из одного файла excel

// Dataset One:

 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 Два:

 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. Как это сделать? Спасибо.

ответ

0

Возможный дубликат: 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); 
    } 
0

Чтобы поместить данные в первенствовать листы, вам не нужно вносить данные в наборы данных. Вы можете напрямую извлекать данные на листе 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(); 
} 

Другой вариант заключается в использовании библиотеки Epplus из NuGet. С помощью этого вы можете просто иметь много листов, где вы загружаете контент из коллекций. т.е.:

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 бывают быстрыми. Если вы все равно будете использовать наборы данных и \ или задавать значения ячеек в цикле, то убедитесь, что у вас небольшие данные.

+0

Какие пространства имен должны использоваться для первого кода? –

+0

Он был там на первой строке: Microsoft.Office.Interop.Excel.dll и Microsoft.Office.Interop.Excel. –

-1

Здесь мы можем экспортировать несколько таблиц в один лист 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; 
       } 
      } 
     } 
Смежные вопросы