using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Spreadsheet; using Font = DocumentFormat.OpenXml.Spreadsheet.Font; using X14 = DocumentFormat.OpenXml.Office2010.Excel; using X15 = DocumentFormat.OpenXml.Office2013.Excel; using X18 = DocumentFormat.OpenXml.Office2021.Excel; namespace PlaylistManager { internal class XLSX { internal static void Serialize(string filename, DataTable table) { if (table == null) throw new Exception("Data was empty"); using (SpreadsheetDocument document = SpreadsheetDocument.Create(filename, SpreadsheetDocumentType.Workbook)) { FillDocument(document, table); } } internal static string Serialize(DataTable table) { if (table == null) throw new Exception("Data was empty"); MemoryStream ms = new MemoryStream(); using (SpreadsheetDocument document = SpreadsheetDocument.Create(ms, SpreadsheetDocumentType.Workbook)) { FillDocument(document, table); } ms.Seek(0, SeekOrigin.Begin); return Encoding.UTF8.GetString(ms.ToArray()); } private static SpreadsheetDocument FillDocument(SpreadsheetDocument document, DataTable table) { // Create Content SheetData sheetData = new SheetData(); Row xlrow = new Row(); foreach (DataColumn col in table.Columns) { xlrow.Append(CreateCell(col.ColumnName, 2U)); } sheetData.Append(xlrow); foreach (DataRow row in table.Rows) { xlrow = new Row(); foreach (DataColumn col in table.Columns) { xlrow.Append(CreateCell(row[col.ColumnName], col.DataType)); } sheetData.Append(xlrow); } // Generate WorksheetPart Content Worksheet worksheet1 = new Worksheet() { MCAttributes = new MarkupCompatibilityAttributes() { Ignorable = "x14ac" } }; worksheet1.AddNamespaceDeclaration("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships"); worksheet1.AddNamespaceDeclaration("mc", "http://schemas.openxmlformats.org/markup-compatibility/2006"); worksheet1.AddNamespaceDeclaration("x14ac", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"); worksheet1.Append(sheetData); WorkbookPart workbookPart1 = document.AddWorkbookPart(); workbookPart1.Workbook = new Workbook(); workbookPart1.Workbook.Sheets = new Sheets(new Sheet() { Name = "Sheet1", SheetId = (UInt32Value)1U, Id = "rId1" }); WorkbookStylesPart workbookStylesPart1 = workbookPart1.AddNewPart("rId3"); workbookStylesPart1.Stylesheet = CreateStylesheet(); WorksheetPart worksheetPart1 = workbookPart1.AddNewPart("rId1"); worksheetPart1.Worksheet = worksheet1; document.Save(); return document; } private static Cell CreateCell(string Text, uint StyleIndex = 0U) { return CreateCell(Text, typeof(string), StyleIndex); } private static Cell CreateCell(object? value, Type type, uint StyleIndex = 0U) { Cell cell = new Cell(); cell.StyleIndex = StyleIndex; if (value == null || value == DBNull.Value) { cell.DataType = CellValues.String; cell.CellValue = new CellValue(""); } else if (type == typeof(int) || type == typeof(uint)) { cell.DataType = CellValues.Number; cell.CellValue = new CellValue((int)value); } else if (type == typeof(float) || type == typeof(double)) { cell.DataType = CellValues.Number; cell.CellValue = new CellValue((double)value); } else if (type == typeof(decimal)) { cell.DataType = CellValues.Number; cell.CellValue = new CellValue((decimal)value); } else if (type == typeof(bool) || type == typeof(Boolean)) { cell.DataType = CellValues.Boolean; cell.CellValue = new CellValue((bool)value); } else if (type == typeof(DateTime) || type == typeof(DateOnly) || type == typeof(TimeOnly)) { cell.StyleIndex = 1U; // Style mit passendem Numberformat cell.DataType = CellValues.Date; cell.CellValue = new CellValue(((DateTime)value)); } else if (type == typeof(DateTimeOffset)) { cell.DataType = CellValues.Date; cell.CellValue = new CellValue((DateTimeOffset)value); } else if (type == typeof(string) || type == typeof(String)) { cell.DataType = CellValues.String; cell.CellValue = new CellValue((string)value); } else { throw new NotSupportedException($"Unsupported Column type: {type}"); } return cell; } private static Stylesheet CreateStylesheet() { uint iExcelIndex = 164; Stylesheet stylesheet = new Stylesheet(); stylesheet.Fonts = new Fonts( new Font() { Color = new() { Theme = (UInt32Value)1U }, FontSize = new() { Val = 11D }, FontName = new() { Val = "Calibri" }, FontFamilyNumbering = new() { Val = 2 }, FontScheme = new FontScheme() { Val = FontSchemeValues.Minor }, }, new Font() { Bold = new(), Color = new() { Theme = (UInt32Value)1U }, FontSize = new() { Val = 11D }, FontName = new() { Val = "Calibri" }, FontFamilyNumbering = new() { Val = 2 }, FontScheme = new FontScheme() { Val = FontSchemeValues.Minor }, } ) { KnownFonts = true }; stylesheet.Fills = new Fills(new Fill());// { Count = (UInt32Value)0U }; stylesheet.Borders = new Borders(new Border()); // ---- CELL STYLE FORMATS ---- NumberingFormat nfDateTime = new NumberingFormat() { NumberFormatId = iExcelIndex++, FormatCode = StringValue.FromString("yyyy-MM-dd HH:mm:ss"), }; stylesheet.NumberingFormats = new NumberingFormats(nfDateTime); stylesheet.CellStyleFormats = new CellStyleFormats( new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, BorderId = (UInt32Value)0U, } ); // ---- CELL FORMATS ---- // NumberFormatID: https://github.com/closedxml/closedxml/wiki/NumberFormatId-Lookup-Table stylesheet.CellFormats = new CellFormats( new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U }, // Mit Datumsformat new CellFormat() { NumberFormatId = nfDateTime.NumberFormatId, FontId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U }, // Bold (Header) new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)1U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U, ApplyFont = true } ); ; stylesheet.CellStyles = new CellStyles( new CellStyle() { Name = "Normal", FormatId = (UInt32Value)0U, BuiltinId = (UInt32Value)0U } ); return stylesheet; } } }