private static void WriteExcelFile(DataTable dt, SpreadsheetDocument spreadsheet) { // Create the Excel file contents. This function is used when creating an Excel file either writing // to a file, or writing to a MemoryStream. spreadsheet.AddWorkbookPart(); if (spreadsheet.WorkbookPart == null) return; spreadsheet.WorkbookPart.Workbook = new Workbook(); var definedNamesCol = new DefinedNames(); // The following line of code (which prevents crashes in Excel 2010) spreadsheet.WorkbookPart.Workbook.Append(new BookViews(new WorkbookView())); // If we don't add a "WorkbookStylesPart", OLEDB will refuse to connect to this .xlsx file ! var workbookStylesPart = spreadsheet.WorkbookPart.AddNewPart("rIdStyles"); workbookStylesPart.Stylesheet = GenerateStyleSheet(); workbookStylesPart.Stylesheet.Save(); var sheets = spreadsheet.WorkbookPart.Workbook.AppendChild(new Sheets()); // For each worksheet you want to create var worksheetName = dt.TableName; // Create worksheet part, and add it to the sheets collection in workbook var worksheetPart = spreadsheet.WorkbookPart.AddNewPart(); SheetData sheetData = new SheetData(); //add the first row Row firstRow = new Row(); firstRow.RowIndex = (UInt32)1; //create a cell in A1 (the upper left most cell of the merged cells) Cell dataCell = new Cell(); dataCell.CellReference = "A1"; CellValue cellValue = new CellValue(); cellValue.Text = "Raw Matrials and Price List"; dataCell.Append(cellValue); firstRow.AppendChild(dataCell); sheetData.AppendChild(firstRow); //add the second row Row secondrow = new Row(); secondrow.RowIndex = (UInt32)2; //create a cell in A2 (the upper left most cell of the merged cells) Cell secdataCell = new Cell(); secdataCell.CellReference = "A2"; CellValue seccellValue = new CellValue(); seccellValue.Text = "From: 121"; Cell secdataCell2 = new Cell(); secdataCell2.CellReference = "C2"; CellValue seccellValue2 = new CellValue(); seccellValue2.Text = "To: 250"; secdataCell.Append(seccellValue); secdataCell2.Append(seccellValue2); secondrow.AppendChild(secdataCell); secondrow.AppendChild(secdataCell2); sheetData.AppendChild(secondrow); //based on the table data to add row and cell. DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row(); List columns = new List(); foreach (System.Data.DataColumn column in dt.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 dt.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); } // Add a WorkbookPart to the document. worksheetPart.Worksheet = new Worksheet(sheetData); //set the columns width Columns exccolumns = new Columns(); exccolumns.Append(new Column() { Min = 1, Max = 2, Width = 20, CustomWidth = true }); exccolumns.Append(new Column() { Min = 3, Max = 4, Width = 50, CustomWidth = true }); worksheetPart.Worksheet.Append(exccolumns); //create a MergeCells class to hold each MergeCell MergeCells mergeCells = new MergeCells(); //append a MergeCell to the mergeCells for each set of merged cells mergeCells.Append(new MergeCell() { Reference = new StringValue("A1:d1") }); mergeCells.Append(new MergeCell() { Reference = new StringValue("A2:b2") }); mergeCells.Append(new MergeCell() { Reference = new StringValue("c2:d2") }); worksheetPart.Worksheet.InsertAfter(mergeCells, worksheetPart.Worksheet.Elements().First()); var sheet = new Sheet { Id = spreadsheet.WorkbookPart.GetIdOfPart(spreadsheet.WorkbookPart.WorksheetParts.First()), SheetId = 1, Name = worksheetName }; // If you want to define the Column Widths for a Worksheet, you need to do this *before* appending the SheetData // http://social.msdn.microsoft.com/Forums/en-US/oxmlsdk/thread/1d93eca8-2949-4d12-8dd9-15cc24128b10/ sheets.Append(sheet); // Append this worksheet's data to our Workbook, using OpenXmlWriter, to prevent memory problems //WriteDataTableToExcelWorksheet(dt, worksheetPart, definedNamesCol); spreadsheet.WorkbookPart.Workbook.Append(definedNamesCol); spreadsheet.WorkbookPart.Workbook.Save(); }