2012-02-28 3 views
4

Я хочу экспортировать данные из набора данных или таблицы данных в файл Excel на C# без использования Gridview.Как экспортировать Excel из набора данных или datatable в C#?

+0

@Pankaj: При редактировании, пожалуйста, удалите «пожалуйста», «спасибо» и подобные настроения. Мы стремимся к короткому и сладкому. :) – sarnold

ответ

7

Получить больше способов: 9 Solutions to Export Data to Excel for ASP.NET

У меня есть этот код, но для этого вам необходимо включить Excel COM-компонент

Добавить ссылку на Microsoft.Office.Interop.Excel.dll в проекте будет делать задачу для вас.

using Excel = Microsoft.Office.Interop.Excel; 
public static bool ExportDataTableToExcel(DataTable dt, string filepath) 
    { 

    Excel.Application oXL; 
    Excel.Workbook oWB; 
    Excel.Worksheet oSheet; 
    Excel.Range oRange; 

    try 
    { 
     // Start Excel and get Application object. 
     oXL = new Excel.Application(); 

     // Set some properties 
     oXL.Visible = true; 
     oXL.DisplayAlerts = false; 

     // Get a new workbook. 
     oWB = oXL.Workbooks.Add(Missing.Value); 

     // Get the Active sheet 
     oSheet = (Excel.Worksheet)oWB.ActiveSheet; 
     oSheet.Name = "Data"; 

     int rowCount = 1; 
     foreach (DataRow dr in dt.Rows) 
     { 
      rowCount += 1; 
      for (int i = 1; i < dt.Columns.Count + 1; i++) 
      { 
       // Add the header the first time through 
       if (rowCount == 2) 
       { 
        oSheet.Cells[1, i] = dt.Columns[i - 1].ColumnName; 
       } 
       oSheet.Cells[rowCount, i] = dr[i - 1].ToString(); 
      } 
     } 

     // Resize the columns 
     oRange = oSheet.get_Range(oSheet.Cells[1, 1], 
         oSheet.Cells[rowCount, dt.Columns.Count]); 
     oRange.EntireColumn.AutoFit(); 

     // Save the sheet and close 
     oSheet = null; 
     oRange = null; 
     oWB.SaveAs(filepath, Excel.XlFileFormat.xlWorkbookNormal, 
      Missing.Value, Missing.Value, Missing.Value, Missing.Value, 
      Excel.XlSaveAsAccessMode.xlExclusive, 
      Missing.Value, Missing.Value, Missing.Value, 
      Missing.Value, Missing.Value); 
     oWB.Close(Missing.Value, Missing.Value, Missing.Value); 
     oWB = null; 
     oXL.Quit(); 
    } 
    catch 
    { 
     throw; 
    } 
    finally 
    { 
     // Clean up 
     // NOTE: When in release mode, this does the trick 
     GC.WaitForPendingFinalizers(); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     GC.Collect(); 
    } 

    return true; 
} 
+0

Вместо того, чтобы напрямую обращаться к GC, можем ли мы удалить объекты данных и другие объекты excel вручную? вызвав соответствующую функцию dispose? – Pankaj

+0

Вызывая функции удаления, это отправит объекты в очередь GC, вместо того, чтобы дать GC узнать, какой объект имеет право распоряжаться. – Pankaj

+0

Использование COM выполняется медленно и требует, чтобы на сервере был установлен Excel. Каждый раз, когда вы создаете электронную таблицу, процесс Excel должен начинаться. Вы можете завершить несколько процессов Excel, выполняемых на вашем веб-сервере. Кроме того, вам нужна лицензия. –

1

вы можете использовать

using Microsoft.Office.Interop.Excel; 

работать с документами первенствовать "родной" ...

Использование C# для создания в Excel документа http://www.codeproject.com/Articles/20228/Using-C-to-Create-an-Excel-Document

Но большинство из общих отчет Генератор/Дизайнеры могут легко экспортировать в excel также проверить на Отчетность Услуги если вы используете SQL SERVER

9

Я бы порекомендовал EPPlus - это решение не требует COM Interop, ни библиотеки DLL и очень быстро. Идеально подходит для веб-сценариев.

http://epplus.codeplex.com/

http://nuget.org/packages/EPPlus

private void DumpExcel(DataTable tbl) 
{ 
    using (ExcelPackage pck = new ExcelPackage()) 
    { 
      //Create the worksheet 
      ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Demo"); 

      //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1 
      ws.Cells["A1"].LoadFromDataTable(tbl, true); 

      //Format the header for column 1-3 
      using (ExcelRange rng = ws.Cells["A1:C1"]) 
      { 
       rng.Style.Font.Bold = true; 
       rng.Style.Fill.PatternType = ExcelFillStyle.Solid;      //Set Pattern for the background to Solid 
       rng.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(79, 129, 189)); //Set color to dark blue 
       rng.Style.Font.Color.SetColor(Color.White); 
      } 

      //Example how to Format Column 1 as numeric 
      using (ExcelRange col = ws.Cells[2, 1, 2 + tbl.Rows.Count, 1]) 
      { 
        col.Style.Numberformat.Format = "#,##0.00"; 
        col.Style.HorizontalAlignment = ExcelHorizontalAlignment.Right; 
       } 

       //Write it back to the client 
       Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
       Response.AddHeader("content-disposition", "attachment; filename=ExcelDemo.xlsx"); 
       Response.BinaryWrite(pck.GetAsByteArray()); 
      } 
     } 
    } 
} 
1

Только в случае, если кто-то использовал выбранное решение и запустить в «объект не содержит определения для get_Range» исключение. Я нашел решение здесь: Worksheet get_Range throws exception. Надеюсь, это сэкономит ваше время.

Смежные вопросы