使用C#中的Open Xml SDK将DataTable导出到Excel

对不起,我的英语请。 我是新的开放式XML SDK。 我的程序能够导出一些数据和DataTable到Excel文件(模板)在模板中,我将数据插入一些占位符。 这是非常好的作品,但我也需要插入一个DataTable …我的示例代码:

using (Stream OutStream = new MemoryStream()) { // read teamplate using (var fileStream = File.OpenRead(templatePath)) fileStream.CopyTo(OutStream); // exporting Exporting(OutStream); // to start OutStream.Seek(0L, SeekOrigin.Begin); // out using (var resultFile = File.Create(resultPath)) OutStream.CopyTo(resultFile); 

下一个导出方法

 private void Exporting(Stream template) { using (var workbook = SpreadsheetDocument.Open(template, true, new OpenSettings { AutoSave = true })) { // Replace shared strings SharedStringTablePart sharedStringsPart = workbook.WorkbookPart.SharedStringTablePart; IEnumerable<Text> sharedStringTextElements = sharedStringsPart.SharedStringTable.Descendants<Text>(); DoReplace(sharedStringTextElements); // Replace inline strings IEnumerable<WorksheetPart> worksheetParts = workbook.GetPartsOfType<WorksheetPart>(); foreach (var worksheet in worksheetParts) { DoReplace(worksheet.Worksheet.Descendants<Text>()); } int z = 40; foreach (System.Data.DataRow row in ExcelWorkXLSX.ToOut.Rows) { for (int i = 0; i < row.ItemArray.Count(); i++) { ExcelWorkXLSX.InsertText(workbook, row.ItemArray.ElementAt(i).ToString(), getColumnName(i), Convert.ToUInt32(z)); } z++; } } } } 

但是这个片段输出DataTable slooooooooooooooooooooooowwwwwww …

如何快速,真实地将DataTable导出到Excel?

我写了这个快速的例子。 这个对我有用。 我只用一个内部数据集对一个数据集进行了testing,但是我想对您来说可能已经足够了。

考虑到我把所有单元格作为string(甚至不是SharedStrings)。 如果你想使用SharedStrings,你可能需要调整一下我的示例。

编辑:为了使这个工作有必要添加WindowsBase和DocumentFormat.OpenXml引用项目。

请享用,

 private void ExportDataSet(DataSet ds, string destination) { using (var workbook = SpreadsheetDocument.Create(destination, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook)) { var workbookPart = workbook.AddWorkbookPart(); workbook.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook(); workbook.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets(); foreach (System.Data.DataTable table in ds.Tables) { var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>(); var sheetData = new DocumentFormat.OpenXml.Spreadsheet.SheetData(); sheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet(sheetData); DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>(); string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart); uint sheetId = 1; if (sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Count() > 0) { sheetId = sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Select(s => s.SheetId.Value).Max() + 1; } DocumentFormat.OpenXml.Spreadsheet.Sheet sheet = new DocumentFormat.OpenXml.Spreadsheet.Sheet() { Id = relationshipId, SheetId = sheetId, Name = table.TableName }; sheets.Append(sheet); DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row(); List<String> columns = new List<string>(); foreach (System.Data.DataColumn column in table.Columns) { columns.Add(column.ColumnName); DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell(); cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String; cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(column.ColumnName); headerRow.AppendChild(cell); } sheetData.AppendChild(headerRow); foreach (System.Data.DataRow dsrow in table.Rows) { DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row(); foreach (String col in columns) { DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell(); cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String; cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString()); // newRow.AppendChild(cell); } sheetData.AppendChild(newRow); } } } } 

eburgos,我稍微修改了你的代码,因为当你在数据集中有多个数据表时,它只是在电子表格中覆盖它们,所以你只剩下一张工作表。 我基本上只是将工作簿创build的部分移出循环。 这里是更新的代码。

 private void ExportDSToExcel(DataSet ds, string destination) { using (var workbook = SpreadsheetDocument.Create(destination, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook)) { var workbookPart = workbook.AddWorkbookPart(); workbook.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook(); workbook.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets(); uint sheetId = 1; foreach (DataTable table in ds.Tables) { var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>(); var sheetData = new DocumentFormat.OpenXml.Spreadsheet.SheetData(); sheetPart.Worksheet = new DocumentFormat.OpenXml.Spreadsheet.Worksheet(sheetData); DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>(); string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart); if (sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Count() > 0) { sheetId = sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Select(s => s.SheetId.Value).Max() + 1; } DocumentFormat.OpenXml.Spreadsheet.Sheet sheet = new DocumentFormat.OpenXml.Spreadsheet.Sheet() { Id = relationshipId, SheetId = sheetId, Name = table.TableName }; sheets.Append(sheet); DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row(); List<String> columns = new List<string>(); foreach (DataColumn column in table.Columns) { columns.Add(column.ColumnName); DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell(); cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String; cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(column.ColumnName); headerRow.AppendChild(cell); } sheetData.AppendChild(headerRow); foreach (DataRow dsrow in table.Rows) { DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row(); foreach (String col in columns) { DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell(); cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String; cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString()); // newRow.AppendChild(cell); } sheetData.AppendChild(newRow); } } } } 

我还写了一个C#/ VB.Net“导出到Excel”库,使用OpenXML,(更重要的是)也使用OpenXmlWriter,所以在写大文件的时候不会出现内存不足的情况。

完整的源代码和演示,可以在这里下载:

导出到Excel

它很容易使用。 只要传递你要写入的文件名,以及一个DataTableDataSetList<>

 CreateExcelFile.CreateExcelDocument(myDataSet, "MyFilename.xlsx"); 

如果你是从一个ASP.Net应用程序调用它,传递它HttpResponse写出来的文件。

 CreateExcelFile.CreateExcelDocument(myDataSet, "MyFilename.xlsx", Response); 

我写了自己的出口到Excel作家,因为没有其他的东西完全满足我的需求。 它是快速的,并允许大量格式的单元格。 你可以在

https://openxmlexporttoexcel.codeplex.com/

我希望它有帮助。

你可以试试看这个库。 我用它来做我的一个项目,发现它很容易处理,可靠和快速(我只用它来导出数据)。

http://epplus.codeplex.com/

你可以在这里看看我的图书馆。 在文档部分下,您将find如何导入数据表。

你只需要写

 using (var doc = new SpreadsheetDocument(@"C:\OpenXmlPackaging.xlsx")) { Worksheet sheet1 = doc.Worksheets.Add("My Sheet"); sheet1.ImportDataTable(ds.Tables[0], "A1", true); } 

希望能帮助到你!

我试图接受的答案,并得到消息说,生成的Excel文件试图打开时被破坏。 我能够通过做一些修改来修复它,比如在代码的下面添加代码。

workbookPart.Workbook.Save();

我已经发布完整的代码@ 导出数据表到Excel与Open XML在C#