public override byte[] Render(Base.Report report) { byte[] buffer; using (var outputMemoryStream = new MemoryStream()) { using (var document = SpreadsheetDocument.Create(outputMemoryStream, SpreadsheetDocumentType.Workbook, true)) { // Add a WorkbookPart to the document. var workbookpart = document.AddWorkbookPart(); workbookpart.Workbook = new Workbook(); // Add a WorksheetPart to the WorkbookPart. var worksheetPart = workbookpart.AddNewPart <WorksheetPart>(); worksheetPart.Worksheet = new Worksheet(new SheetData()); // Add Sheets to the Workbook. var sheets = document.WorkbookPart.Workbook.AppendChild(new Sheets()); // Append a new worksheet and associate it with the workbook. var sheet = new DocumentFormat.OpenXml.Spreadsheet.Sheet() { Id = document.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" }; sheets.Append(sheet); // Add a WorkbookStylesPart to the WorkbookPart var stylesPart = document.WorkbookPart.AddNewPart <WorkbookStylesPart>(); var shData = worksheetPart.Worksheet.GetFirstChild <SheetData>(); stylesPart.Stylesheet = InitializeDefaultStyles(stylesPart.Stylesheet); uint styleId = 2; //обязательно 2 потому что уже додано два стиля по умолчанию с индексами 0 и 1; var styles = report.Select(o => o.Style).ToList(); //нельзя перенести в отдельный метод :( foreach (var s in styles) { if (s is TableStyle) { var style = s as TableStyle; var border = new DocumentFormat.OpenXml.Spreadsheet.Border(); var leftBorder = new DocumentFormat.OpenXml.Spreadsheet.LeftBorder(); var rightBorder = new DocumentFormat.OpenXml.Spreadsheet.RightBorder(); var topBorder = new DocumentFormat.OpenXml.Spreadsheet.TopBorder(); var bottomBorder = new DocumentFormat.OpenXml.Spreadsheet.BottomBorder(); leftBorder.Style = SetLineType(style.BorderLine); rightBorder.Style = SetLineType(style.BorderLine); topBorder.Style = SetLineType(style.BorderLine); bottomBorder.Style = SetLineType(style.BorderLine); leftBorder.Color = new DocumentFormat.OpenXml.Spreadsheet.Color { Rgb = ToHexBinaryValue(style.BorderColor) }; rightBorder.Color = new DocumentFormat.OpenXml.Spreadsheet.Color { Rgb = ToHexBinaryValue(style.BorderColor) }; topBorder.Color = new DocumentFormat.OpenXml.Spreadsheet.Color { Rgb = ToHexBinaryValue(style.BorderColor) }; bottomBorder.Color = new DocumentFormat.OpenXml.Spreadsheet.Color { Rgb = ToHexBinaryValue(style.BorderColor) }; border.LeftBorder = leftBorder; border.RightBorder = rightBorder; border.TopBorder = topBorder; border.BottomBorder = bottomBorder; stylesPart.Stylesheet.Borders.AppendChild <DocumentFormat.OpenXml.Spreadsheet.Border>(border); var patternFill = new DocumentFormat.OpenXml.Spreadsheet.PatternFill { BackgroundColor = new DocumentFormat.OpenXml.Spreadsheet.BackgroundColor { Rgb = ToHexBinaryValue(style.Background) }, ForegroundColor = new DocumentFormat.OpenXml.Spreadsheet.ForegroundColor { Rgb = ToHexBinaryValue(style.Foreground) }, PatternType = SetPatternType(style.PatternType) }; var fill = new DocumentFormat.OpenXml.Spreadsheet.Fill { PatternFill = patternFill }; stylesPart.Stylesheet.Fills.AppendChild <DocumentFormat.OpenXml.Spreadsheet.Fill>(fill); DocumentFormat.OpenXml.Spreadsheet.Font font = new DocumentFormat.OpenXml.Spreadsheet.Font() { FontName = new DocumentFormat.OpenXml.Spreadsheet.FontName { Val = new StringValue { Value = s.FontName } }, FontSize = new DocumentFormat.OpenXml.Spreadsheet.FontSize { Val = s.FontSize }, Color = new DocumentFormat.OpenXml.Spreadsheet.Color { Rgb = ToHexBinaryValue(s.FontColor) } }; stylesPart.Stylesheet.Fonts.AppendChild <DocumentFormat.OpenXml.Spreadsheet.Font>(font); } else { stylesPart.Stylesheet.Fills.AppendChild <DocumentFormat.OpenXml.Spreadsheet.Fill>(new DocumentFormat.OpenXml.Spreadsheet.Fill()); stylesPart.Stylesheet.Borders.AppendChild <DocumentFormat.OpenXml.Spreadsheet.Border>(new DocumentFormat.OpenXml.Spreadsheet.Border()); DocumentFormat.OpenXml.Spreadsheet.Font font; if (s != null) { font = new DocumentFormat.OpenXml.Spreadsheet.Font { FontName = new DocumentFormat.OpenXml.Spreadsheet.FontName { Val = new StringValue { Value = s.FontName } }, FontSize = new DocumentFormat.OpenXml.Spreadsheet.FontSize { Val = s.FontSize }, Color = new DocumentFormat.OpenXml.Spreadsheet.Color { Rgb = ToHexBinaryValue(s.FontColor) } }; foreach (var item in s.TextStyle) { switch (item) { case TextStyleType.Bold: font.Bold = new DocumentFormat.OpenXml.Spreadsheet.Bold { Val = true }; break; case TextStyleType.Italic: font.Italic = new DocumentFormat.OpenXml.Spreadsheet.Italic { Val = true }; break; case TextStyleType.Underline: font.Underline = new DocumentFormat.OpenXml.Spreadsheet.Underline { Val = DocumentFormat.OpenXml.Spreadsheet.UnderlineValues.Single }; break; case TextStyleType.Normal: break; } } } else { font = new DocumentFormat.OpenXml.Spreadsheet.Font(); } stylesPart.Stylesheet.Fonts.AppendChild <DocumentFormat.OpenXml.Spreadsheet.Font>(font); } if (s != null) { var cellFormat = new DocumentFormat.OpenXml.Spreadsheet.CellFormat { BorderId = UInt32Value.ToUInt32(styleId), FillId = UInt32Value.ToUInt32(styleId), FontId = UInt32Value.ToUInt32(styleId) }; if (s.Aligment != null) { var align = new Alignment() { TextRotation = new UInt32Value(s.Aligment.Rotation), Horizontal = AlignmentMapper.MapHorizontalAligment(s.Aligment.HorizontalAligment), Vertical = AlignmentMapper.MapVerticalAligment(s.Aligment.VerticalAligment) }; cellFormat.Append(align); } stylesPart.Stylesheet.CellFormats.AppendChild <DocumentFormat.OpenXml.Spreadsheet.CellFormat>(cellFormat); } styleId = styleId + 1; } foreach (var x in report) { if (x is ComplexHeaderCell) { var element = x as ComplexHeaderCell; if (Render(element, styles, shData, worksheetPart, workbookpart)) { continue; } } if (x is TextElement) { var element = x as TextElement; if (Render(element, styles, shData, workbookpart)) { continue; } } if (x is TableElement) { var element = x as TableElement; if (Render(element, styles, shData, workbookpart)) { continue; } } if (x is ImageElement) { var element = x as ImageElement; if (Render(element, styles, shData, workbookpart)) { continue; } } } //var dateLine = shData.AppendChild(new Spreadsheet.Row()); //dateLine.AppendChild(new Spreadsheet.Cell() //{ // CellValue = new Spreadsheet.CellValue(_report.TimeStamp.Date.ToString()), // DataType = Spreadsheet.CellValues.String, // StyleIndex = 0 //}); workbookpart.Workbook.Save(); } buffer = new byte[outputMemoryStream.Position]; outputMemoryStream.Position = 0; outputMemoryStream.Read(buffer, 0, buffer.Length); } return(buffer); }
public override byte[] Render(Base.Report report) { #warning Need to extend text style support var memoryStream = new MemoryStream(); using (var document = WordprocessingDocument.Create(memoryStream, WordprocessingDocumentType.Document)) { document.AddMainDocumentPart(); document.MainDocumentPart.Document = new DocumentFormat.OpenXml.Wordprocessing.Document(); var stylesPart = document.MainDocumentPart.AddNewPart <StyleDefinitionsPart>(); var body = document.MainDocumentPart.Document.AppendChild <DocumentFormat.OpenXml.Wordprocessing.Body>(new DocumentFormat.OpenXml.Wordprocessing.Body()); var styles = report.Select(o => o.Style).ToList(); stylesPart.Styles = WordStyles(styles); stylesPart.Styles.Save(); foreach (var x in report) { if (x is TextElement) { var element = x as TextElement; if (Render(element, document, body)) { continue; } } if (x is TableElement) { var element = x as TableElement; if (Render(element, document, body)) { continue; } } if (x is ImageElement) { var element = x as ImageElement; if (Render(element, document, body)) { continue; } } if (x is ComplexHeaderCell) { var element = x as ComplexHeaderCell; if (Render(element, document, body)) { continue; } } if (x is ComplexHeader) { var element = x as ComplexHeader; if (Render(element, document, body)) { continue; } } document.MainDocumentPart.Document.Save(); } } return(memoryStream.ToArray()); }