Sunday, January 26, 2020

Generate XLSX file using C# and OpenXml package

The Following features are implemented:

  • Cell formatting
  • Cell colouring
  • Borders
  • Columns custom width
  • Formulas
  • IgnoredErrors

The resulting xlsx file looks like this:

First of all, we hve to install the following NuGet package: DocumentFormat.OpenXml.

The code:

// Data example used to generate xlsx file
string csv = @"Program Name,Start Date,Start Time,End Date,End Time,Series Number,Run
WEEKEND TODAY,01/12/19,07:00,01/12/19,10:00,19,1
SPORTS SUNDAY,01/12/19,10:00,01/12/19,11:00,19,1
CROSS COURT,01/12/19,11:00,01/12/19,11:30,19,1
THE HOLD DOWN,01/12/19,11:30,01/12/19,12:00,5,1
EXPLORE TV-VIKING,01/12/19,16:30,01/12/19,17:00,1,1
NINE NEWS: FIRST AT FIVE,01/12/19,17:00,01/12/19,17:25,19,1
NINE NEWS SUNDAY,01/12/19,17:59,01/12/19,19:00,19,1
A CURRENT AFFAIR,10/12/19,19:00,10/12/19,19:38,19,1
TODAY,11/12/19,06:00,11/12/19,09:00,19,1
TODAY EXTRA,11/12/19,09:00,11/12/19,11:30,19,1
NINE'S MORNING NEWS,11/12/19,11:30,11/12/19,12:00,19,1
DESTINATION HAPPINESS,11/12/19,12:59,11/12/19,13:31,3,2
GIVING LIFE,11/12/19,13:31,11/12/19,14:02,1,3
NINE'S AFTERNOON NEWS,11/12/19,16:00,11/12/19,17:00,19,1
MILLIONAIRE HOT SEAT,11/12/19,17:00,11/12/19,17:59,19,2
,,,,,,";
            
GenerateXlsx(csv, "D:\\text.xlsx");

public GenerateXlsx(string csv, string path)
{
    string[] lines = csv.Replace("\r", "").Split('\n');
    //Creating XLSX document and filling it with the data
    using (SpreadsheetDocument document = SpreadsheetDocument.Create(path, SpreadsheetDocumentType.Workbook))
    {
        // Add a WorkbookPart to the document.
        WorkbookPart workbookPart = document.AddWorkbookPart();
        //Initialize a SheetData
        SheetData sheetData = InitializeSheetData(workbookPart, lines.Length);
        //Add the headers row
        AddHeadersRow(lines[0].Split(','), sheetData);
        //Add data rows
        for (int i = 1; i < lines.Length; i++)
        {
            if (String.IsNullOrEmpty(lines[i])) continue;
            String[] columnData = lines[i].Split(',');
            //Add row to the sheet
            AddDataRow(columnData, i + 1, sheetData, i == lines.Length - 2);
        }
        //Add the totals row
        AddTotalsRow(lines, sheetData);
        workbookPart.Workbook.Save();
    }
}

/// 
/// Processes whole the routines to create the workbook, sheet parts, sheets, data
/// 
/// 
/// 
/// 
private SheetData InitializeSheetData(WorkbookPart workbookPart, int rowsNumber)
{
    workbookPart.Workbook = new Workbook();
    // Add a WorksheetPart to the WorkbookPart.
    WorksheetPart worksheetPart = workbookPart.AddNewPart();
    worksheetPart.Worksheet = new Worksheet(new SheetData());
    
    //Create a new sheet
    Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets());
    Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Report" };
    sheets.Append(sheet);
    // Get the sheetData cell table.
    SheetData sheetData = worksheetPart.Worksheet.GetFirstChild();
    //Add columns scheme
    worksheetPart.Worksheet.InsertBefore(GenerateColumnsScheme(), sheetData);
    // Add styles to the sheet
    WorkbookStylesPart workbookStylesPart = workbookPart.AddNewPart();
    workbookStylesPart.Stylesheet = CreateStylesheet();
    workbookStylesPart.Stylesheet.Save();
    //Add IgnoredErrors Element
    var ignoredErrorsElement = new IgnoredErrors();
    ignoredErrorsElement.AppendChild(new IgnoredError()
    {
        SequenceOfReferences = new ListValue()
        {
            InnerText = $"B2:B{rowsNumber} D2:D{rowsNumber}"
        },
        TwoDigitTextYear = true
    });
    worksheetPart.Worksheet.AppendChild(ignoredErrorsElement);
    //Add Totals
    
    return sheetData;
}

/// 
/// Generates columns with custom widths
/// 
/// 
private Columns GenerateColumnsScheme()
{
    Columns columns = new Columns();
    columns.AppendChild(new Column() { Min = 1, Max = 1, Width = 34, CustomWidth = true });
    columns.AppendChild(new Column() { Min = 2, Max = 2, Width = 10, CustomWidth = true });
    columns.AppendChild(new Column() { Min = 3, Max = 3, Width = 10, CustomWidth = true });
    columns.AppendChild(new Column() { Min = 4, Max = 4, Width = 10, CustomWidth = true });
    columns.AppendChild(new Column() { Min = 5, Max = 5, Width = 10, CustomWidth = true });
    columns.AppendChild(new Column() { Min = 6, Max = 6, Width = 17, CustomWidth = true });
    columns.AppendChild(new Column() { Min = 7, Max = 7, Width = 8, CustomWidth = true });
    
    return columns;
}

/// 
/// Add headers row to the sheet
/// 
/// 
/// 
private void AddHeadersRow(string[] headers, SheetData sheetData)
{
    Row row = new Row() { RowIndex = 1 };
    foreach (string header in headers)
    {
        row.AppendChild(new Cell()
        {
            CellValue = new CellValue(header),
            DataType = new EnumValue(CellValues.String),
            StyleIndex = 1
        });
    }
    sheetData.AppendChild(row);
}

private void AddDataRow(String[] rowData, int rowNumber, SheetData sheetData, bool isLastRow)
{
    Row row = new Row() { RowIndex = (UInt32)rowNumber };
    for (int columnIndex = 0; columnIndex < rowData.Length; columnIndex++)
    {
        string cellData = rowData[columnIndex];
        CellValues cellType = CellValues.String;
        TimeSpan timeSpanCellData = TimeSpan.Zero;
        if (columnIndex == 2 || columnIndex == 4)
        {
            TimeSpan.TryParse(cellData, out timeSpanCellData);
        }
        switch (columnIndex)
        {
            case 5: //Series Number
            case 6: //Run
            cellType = CellValues.Number;
                break;
        }
        Cell cell = new Cell()
        {
            CellValue = new CellValue(cellData),
            DataType = new EnumValue(cellType)
        };
        //Add bottom line under the last row
        if (isLastRow) cell.StyleIndex = 2;
        row.AppendChild(cell);
    }
    sheetData.AppendChild(row);
}

/// 
/// Add totals row to the sheet
/// 
/// 
/// 
private void AddTotalsRow(string[] lines, SheetData sheetData)
{
    Row row = new Row() {RowIndex = (UInt32Value) (lines.Length + 1U)};
    for (int columnIndex = 0; columnIndex < 7; columnIndex++)
    {
        Cell cell = new Cell()
        {
            StyleIndex = 3,
            DataType = new EnumValue(CellValues.String)
        };
        switch (columnIndex)
        {
            case 0:
                cell.CellValue = new CellValue("Totals");
                break;
            case 6:
                cell.DataType = new EnumValue(CellValues.Number);
                cell.CellFormula = new CellFormula($"SUM(G2:G{lines.Length - 1})");
                break;
        }
        row.AppendChild(cell);
    }
    
    sheetData.AppendChild(row);
}

/// 
/// Creates the stylesheet
/// 
/// 
private static Stylesheet CreateStylesheet()
{
    //Fonts
    Font font0 = new Font();
    Font font1 = new Font(new FontSize() {Val = 10}, new Bold(), new Color() {Rgb = "FF000000"});
    Font font2 = new Font(new FontSize() { Val = 12 }, new Bold());
    Fonts fonts = new Fonts(font0, font1, font2);
    //Fills
    Fill fill0 = new Fill();
    Fill fill1 = new Fill();
    Fill fill2 = new Fill(new PatternFill()
    {
        PatternType = PatternValues.Solid,
        ForegroundColor = new ForegroundColor {Rgb = "FFA9CEE8"},
        BackgroundColor = new BackgroundColor() {Indexed = 64}
    });
    Fill fill3 = new Fill(new PatternFill()
    {
        PatternType = PatternValues.Solid,
        ForegroundColor = new ForegroundColor {Rgb = "FFC6EFCE"},
        BackgroundColor = new BackgroundColor() {Indexed = 64}
    });
    Fills fills = new Fills(fill0, fill1, fill2, fill3);
    //Borders
    Border border0 = new Border();
    Border border1 = new Border(new BottomBorder(new Color() {Auto = true}) {Style = BorderStyleValues.Double});
    Borders borders = new Borders(border0, border1);
    
    //CellFormats
    CellFormat cellFormat0 = new CellFormat {FontId = 0, FillId = 0};
    CellFormat cellFormat1 = new CellFormat {FontId = 1, FillId = 2, Alignment = new Alignment() {Horizontal = HorizontalAlignmentValues.Center}};
    CellFormat cellFormat2 = new CellFormat { FontId = 0, FillId = 0, BorderId = 1};
    CellFormat cellFormat3 = new CellFormat { FontId = 2, FillId = 3 };
    CellFormats cellFormats = new CellFormats(cellFormat0, cellFormat1, cellFormat2, cellFormat3);
    //Compose the Style Sheet
    Stylesheet styleSheet = new Stylesheet(fonts, fills, borders, cellFormats);
    return styleSheet;
}

  1. // Data example used to generate xlsx file
  2. string csv = @"Program Name,Start Date,Start Time,End Date,End Time,Series Number,Run
  3. WEEKEND TODAY,01/12/19,07:00,01/12/19,10:00,19,1
  4. SPORTS SUNDAY,01/12/19,10:00,01/12/19,11:00,19,1
  5. CROSS COURT,01/12/19,11:00,01/12/19,11:30,19,1
  6. THE HOLD DOWN,01/12/19,11:30,01/12/19,12:00,5,1
  7. EXPLORE TV-VIKING,01/12/19,16:30,01/12/19,17:00,1,1
  8. NINE NEWS: FIRST AT FIVE,01/12/19,17:00,01/12/19,17:25,19,1
  9. NINE NEWS SUNDAY,01/12/19,17:59,01/12/19,19:00,19,1
  10. A CURRENT AFFAIR,10/12/19,19:00,10/12/19,19:38,19,1
  11. TODAY,11/12/19,06:00,11/12/19,09:00,19,1
  12. TODAY EXTRA,11/12/19,09:00,11/12/19,11:30,19,1
  13. NINE'S MORNING NEWS,11/12/19,11:30,11/12/19,12:00,19,1
  14. DESTINATION HAPPINESS,11/12/19,12:59,11/12/19,13:31,3,2
  15. GIVING LIFE,11/12/19,13:31,11/12/19,14:02,1,3
  16. NINE'S AFTERNOON NEWS,11/12/19,16:00,11/12/19,17:00,19,1
  17. MILLIONAIRE HOT SEAT,11/12/19,17:00,11/12/19,17:59,19,2
  18. ,,,,,,";
  19. GenerateXlsx(csv, "D:\\text.xlsx");
  20. public GenerateXlsx(string csv, string path)
  21. {
  22. string[] lines = csv.Replace("\r", "").Split('\n');
  23. //Creating XLSX document and filling it with the data
  24. using (SpreadsheetDocument document = SpreadsheetDocument.Create(path, SpreadsheetDocumentType.Workbook))
  25. {
  26. // Add a WorkbookPart to the document.
  27. WorkbookPart workbookPart = document.AddWorkbookPart();
  28. //Initialize a SheetData
  29. SheetData sheetData = InitializeSheetData(workbookPart, lines.Length);
  30. //Add the headers row
  31. AddHeadersRow(lines[0].Split(','), sheetData);
  32. //Add data rows
  33. for (int i = 1; i < lines.Length; i++)
  34. {
  35. if (String.IsNullOrEmpty(lines[i])) continue;
  36. String[] columnData = lines[i].Split(',');
  37. //Add row to the sheet
  38. AddDataRow(columnData, i + 1, sheetData, i == lines.Length - 2);
  39. }
  40. //Add the totals row
  41. AddTotalsRow(lines, sheetData);
  42. workbookPart.Workbook.Save();
  43. }
  44. }
  45. /// <summary>
  46. /// Processes whole the routines to create the workbook, sheet parts, sheets, data
  47. /// </summary>
  48. /// <param name="workbookPart">
  49. /// <param name="rowsNumber">
  50. /// <returns></returns>
  51. private SheetData InitializeSheetData(WorkbookPart workbookPart, int rowsNumber)
  52. {
  53. workbookPart.Workbook = new Workbook();
  54. // Add a WorksheetPart to the WorkbookPart.
  55. WorksheetPart worksheetPart = workbookPart.AddNewPart<worksheetpart>();
  56. worksheetPart.Worksheet = new Worksheet(new SheetData());
  57. //Create a new sheet
  58. Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets());
  59. Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Report" };
  60. sheets.Append(sheet);
  61. // Get the sheetData cell table.
  62. SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<sheetdata>();
  63. //Add columns scheme
  64. worksheetPart.Worksheet.InsertBefore(GenerateColumnsScheme(), sheetData);
  65. // Add styles to the sheet
  66. WorkbookStylesPart workbookStylesPart = workbookPart.AddNewPart<workbookstylespart>();
  67. workbookStylesPart.Stylesheet = CreateStylesheet();
  68. workbookStylesPart.Stylesheet.Save();
  69. //Add IgnoredErrors Element
  70. var ignoredErrorsElement = new IgnoredErrors();
  71. ignoredErrorsElement.AppendChild(new IgnoredError()
  72. {
  73. SequenceOfReferences = new ListValue<stringvalue>()
  74. {
  75. InnerText = $"B2:B{rowsNumber} D2:D{rowsNumber}"
  76. },
  77. TwoDigitTextYear = true
  78. });
  79. worksheetPart.Worksheet.AppendChild(ignoredErrorsElement);
  80. //Add Totals
  81. return sheetData;
  82. }
  83. /// <summary>
  84. /// Generates columns with custom widths
  85. /// </summary>
  86. /// <returns></returns>
  87. private Columns GenerateColumnsScheme()
  88. {
  89. Columns columns = new Columns();
  90. columns.AppendChild(new Column() { Min = 1, Max = 1, Width = 34, CustomWidth = true });
  91. columns.AppendChild(new Column() { Min = 2, Max = 2, Width = 10, CustomWidth = true });
  92. columns.AppendChild(new Column() { Min = 3, Max = 3, Width = 10, CustomWidth = true });
  93. columns.AppendChild(new Column() { Min = 4, Max = 4, Width = 10, CustomWidth = true });
  94. columns.AppendChild(new Column() { Min = 5, Max = 5, Width = 10, CustomWidth = true });
  95. columns.AppendChild(new Column() { Min = 6, Max = 6, Width = 17, CustomWidth = true });
  96. columns.AppendChild(new Column() { Min = 7, Max = 7, Width = 8, CustomWidth = true });
  97. return columns;
  98. }
  99. /// <summary>
  100. /// Add headers row to the sheet
  101. /// </summary>
  102. /// <param name="headers">
  103. /// <param name="sheetData">
  104. private void AddHeadersRow(string[] headers, SheetData sheetData)
  105. {
  106. Row row = new Row() { RowIndex = 1 };
  107. foreach (string header in headers)
  108. {
  109. row.AppendChild(new Cell()
  110. {
  111. CellValue = new CellValue(header),
  112. DataType = new EnumValue<cellvalues>(CellValues.String),
  113. StyleIndex = 1
  114. });
  115. }
  116. sheetData.AppendChild(row);
  117. }
  118. private void AddDataRow(String[] rowData, int rowNumber, SheetData sheetData, bool isLastRow)
  119. {
  120. Row row = new Row() { RowIndex = (UInt32)rowNumber };
  121. for (int columnIndex = 0; columnIndex < rowData.Length; columnIndex++)
  122. {
  123. string cellData = rowData[columnIndex];
  124. CellValues cellType = CellValues.String;
  125. TimeSpan timeSpanCellData = TimeSpan.Zero;
  126. if (columnIndex == 2 || columnIndex == 4)
  127. {
  128. TimeSpan.TryParse(cellData, out timeSpanCellData);
  129. }
  130. switch (columnIndex)
  131. {
  132. case 5: //Series Number
  133. case 6: //Run
  134. cellType = CellValues.Number;
  135. break;
  136. }
  137. Cell cell = new Cell()
  138. {
  139. CellValue = new CellValue(cellData),
  140. DataType = new EnumValue<cellvalues>(cellType)
  141. };
  142. //Add bottom line under the last row
  143. if (isLastRow) cell.StyleIndex = 2;
  144. row.AppendChild(cell);
  145. }
  146. sheetData.AppendChild(row);
  147. }
  148. /// <summary>
  149. /// Add totals row to the sheet
  150. /// </summary>
  151. /// <param name="lines">
  152. /// <param name="sheetData">
  153. private void AddTotalsRow(string[] lines, SheetData sheetData)
  154. {
  155. Row row = new Row() {RowIndex = (UInt32Value) (lines.Length + 1U)};
  156. for (int columnIndex = 0; columnIndex < 7; columnIndex++)
  157. {
  158. Cell cell = new Cell()
  159. {
  160. StyleIndex = 3,
  161. DataType = new EnumValue<cellvalues>(CellValues.String)
  162. };
  163. switch (columnIndex)
  164. {
  165. case 0:
  166. cell.CellValue = new CellValue("Totals");
  167. break;
  168. case 6:
  169. cell.DataType = new EnumValue<cellvalues>(CellValues.Number);
  170. cell.CellFormula = new CellFormula($"SUM(G2:G{lines.Length - 1})");
  171. break;
  172. }
  173. row.AppendChild(cell);
  174. }
  175. sheetData.AppendChild(row);
  176. }
  177. /// <summary>
  178. /// Creates the stylesheet
  179. /// </summary>
  180. /// <returns></returns>
  181. private static Stylesheet CreateStylesheet()
  182. {
  183. //Fonts
  184. Font font0 = new Font();
  185. Font font1 = new Font(new FontSize() {Val = 10}, new Bold(), new Color() {Rgb = "FF000000"});
  186. Font font2 = new Font(new FontSize() { Val = 12 }, new Bold());
  187. Fonts fonts = new Fonts(font0, font1, font2);
  188. //Fills
  189. Fill fill0 = new Fill();
  190. Fill fill1 = new Fill();
  191. Fill fill2 = new Fill(new PatternFill()
  192. {
  193. PatternType = PatternValues.Solid,
  194. ForegroundColor = new ForegroundColor {Rgb = "FFA9CEE8"},
  195. BackgroundColor = new BackgroundColor() {Indexed = 64}
  196. });
  197. Fill fill3 = new Fill(new PatternFill()
  198. {
  199. PatternType = PatternValues.Solid,
  200. ForegroundColor = new ForegroundColor {Rgb = "FFC6EFCE"},
  201. BackgroundColor = new BackgroundColor() {Indexed = 64}
  202. });
  203. Fills fills = new Fills(fill0, fill1, fill2, fill3);
  204. //Borders
  205. Border border0 = new Border();
  206. Border border1 = new Border(new BottomBorder(new Color() {Auto = true}) {Style = BorderStyleValues.Double});
  207. Borders borders = new Borders(border0, border1);
  208. //CellFormats
  209. CellFormat cellFormat0 = new CellFormat {FontId = 0, FillId = 0};
  210. CellFormat cellFormat1 = new CellFormat {FontId = 1, FillId = 2, Alignment = new Alignment() {Horizontal = HorizontalAlignmentValues.Center}};
  211. CellFormat cellFormat2 = new CellFormat { FontId = 0, FillId = 0, BorderId = 1};
  212. CellFormat cellFormat3 = new CellFormat { FontId = 2, FillId = 3 };
  213. CellFormats cellFormats = new CellFormats(cellFormat0, cellFormat1, cellFormat2, cellFormat3);
  214. //Compose the Style Sheet
  215. Stylesheet styleSheet = new Stylesheet(fonts, fills, borders, cellFormats);
  216. return styleSheet;
  217. }
  218. </cellvalues></cellvalues></cellvalues></cellvalues></stringvalue></workbookstylespart></sheetdata></worksheetpart>
// Data example used to generate xlsx file
string csv = @"Program Name,Start Date,Start Time,End Date,End Time,Series Number,Run
WEEKEND TODAY,01/12/19,07:00,01/12/19,10:00,19,1
SPORTS SUNDAY,01/12/19,10:00,01/12/19,11:00,19,1
CROSS COURT,01/12/19,11:00,01/12/19,11:30,19,1
THE HOLD DOWN,01/12/19,11:30,01/12/19,12:00,5,1
EXPLORE TV-VIKING,01/12/19,16:30,01/12/19,17:00,1,1
NINE NEWS: FIRST AT FIVE,01/12/19,17:00,01/12/19,17:25,19,1
NINE NEWS SUNDAY,01/12/19,17:59,01/12/19,19:00,19,1
A CURRENT AFFAIR,10/12/19,19:00,10/12/19,19:38,19,1
TODAY,11/12/19,06:00,11/12/19,09:00,19,1
TODAY EXTRA,11/12/19,09:00,11/12/19,11:30,19,1
NINE'S MORNING NEWS,11/12/19,11:30,11/12/19,12:00,19,1
DESTINATION HAPPINESS,11/12/19,12:59,11/12/19,13:31,3,2
GIVING LIFE,11/12/19,13:31,11/12/19,14:02,1,3
NINE'S AFTERNOON NEWS,11/12/19,16:00,11/12/19,17:00,19,1
MILLIONAIRE HOT SEAT,11/12/19,17:00,11/12/19,17:59,19,2
,,,,,,";
            
GenerateXlsx(csv, "D:\\text.xlsx");

public GenerateXlsx(string csv, string path)
{
    string[] lines = csv.Replace("\r", "").Split('\n');
    //Creating XLSX document and filling it with the data
    using (SpreadsheetDocument document = SpreadsheetDocument.Create(path, SpreadsheetDocumentType.Workbook))
    {
        // Add a WorkbookPart to the document.
        WorkbookPart workbookPart = document.AddWorkbookPart();
        //Initialize a SheetData
        SheetData sheetData = InitializeSheetData(workbookPart, lines.Length);
        //Add the headers row
        AddHeadersRow(lines[0].Split(','), sheetData);
        //Add data rows
        for (int i = 1; i < lines.Length; i++)
        {
            if (String.IsNullOrEmpty(lines[i])) continue;
            String[] columnData = lines[i].Split(',');
            //Add row to the sheet
            AddDataRow(columnData, i + 1, sheetData, i == lines.Length - 2);
        }
        //Add the totals row
        AddTotalsRow(lines, sheetData);
        workbookPart.Workbook.Save();
    }
}

/// <summary>
/// Processes whole the routines to create the workbook, sheet parts, sheets, data
/// </summary>
/// <param name="workbookPart">
/// <param name="rowsNumber">
/// <returns></returns>
private SheetData InitializeSheetData(WorkbookPart workbookPart, int rowsNumber)
{
    workbookPart.Workbook = new Workbook();
    // Add a WorksheetPart to the WorkbookPart.
    WorksheetPart worksheetPart = workbookPart.AddNewPart<worksheetpart>();
    worksheetPart.Worksheet = new Worksheet(new SheetData());
    
    //Create a new sheet
    Sheets sheets = workbookPart.Workbook.AppendChild(new Sheets());
    Sheet sheet = new Sheet() { Id = workbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Report" };
    sheets.Append(sheet);
    // Get the sheetData cell table.
    SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<sheetdata>();
    //Add columns scheme
    worksheetPart.Worksheet.InsertBefore(GenerateColumnsScheme(), sheetData);
    // Add styles to the sheet
    WorkbookStylesPart workbookStylesPart = workbookPart.AddNewPart<workbookstylespart>();
    workbookStylesPart.Stylesheet = CreateStylesheet();
    workbookStylesPart.Stylesheet.Save();
    //Add IgnoredErrors Element
    var ignoredErrorsElement = new IgnoredErrors();
    ignoredErrorsElement.AppendChild(new IgnoredError()
    {
        SequenceOfReferences = new ListValue<stringvalue>()
        {
            InnerText = $"B2:B{rowsNumber} D2:D{rowsNumber}"
        },
        TwoDigitTextYear = true
    });
    worksheetPart.Worksheet.AppendChild(ignoredErrorsElement);
    //Add Totals
    
    return sheetData;
}

/// <summary>
/// Generates columns with custom widths
/// </summary>
/// <returns></returns>
private Columns GenerateColumnsScheme()
{
    Columns columns = new Columns();
    columns.AppendChild(new Column() { Min = 1, Max = 1, Width = 34, CustomWidth = true });
    columns.AppendChild(new Column() { Min = 2, Max = 2, Width = 10, CustomWidth = true });
    columns.AppendChild(new Column() { Min = 3, Max = 3, Width = 10, CustomWidth = true });
    columns.AppendChild(new Column() { Min = 4, Max = 4, Width = 10, CustomWidth = true });
    columns.AppendChild(new Column() { Min = 5, Max = 5, Width = 10, CustomWidth = true });
    columns.AppendChild(new Column() { Min = 6, Max = 6, Width = 17, CustomWidth = true });
    columns.AppendChild(new Column() { Min = 7, Max = 7, Width = 8, CustomWidth = true });
    
    return columns;
}

/// <summary>
/// Add headers row to the sheet
/// </summary>
/// <param name="headers">
/// <param name="sheetData">
private void AddHeadersRow(string[] headers, SheetData sheetData)
{
    Row row = new Row() { RowIndex = 1 };
    foreach (string header in headers)
    {
        row.AppendChild(new Cell()
        {
            CellValue = new CellValue(header),
            DataType = new EnumValue<cellvalues>(CellValues.String),
            StyleIndex = 1
        });
    }
    sheetData.AppendChild(row);
}

private void AddDataRow(String[] rowData, int rowNumber, SheetData sheetData, bool isLastRow)
{
    Row row = new Row() { RowIndex = (UInt32)rowNumber };
    for (int columnIndex = 0; columnIndex < rowData.Length; columnIndex++)
    {
        string cellData = rowData[columnIndex];
        CellValues cellType = CellValues.String;
        TimeSpan timeSpanCellData = TimeSpan.Zero;
        if (columnIndex == 2 || columnIndex == 4)
        {
            TimeSpan.TryParse(cellData, out timeSpanCellData);
        }
        switch (columnIndex)
        {
            case 5: //Series Number
            case 6: //Run
            cellType = CellValues.Number;
                break;
        }
        Cell cell = new Cell()
        {
            CellValue = new CellValue(cellData),
            DataType = new EnumValue<cellvalues>(cellType)
        };
        //Add bottom line under the last row
        if (isLastRow) cell.StyleIndex = 2;
        row.AppendChild(cell);
    }
    sheetData.AppendChild(row);
}

/// <summary>
/// Add totals row to the sheet
/// </summary>
/// <param name="lines">
/// <param name="sheetData">
private void AddTotalsRow(string[] lines, SheetData sheetData)
{
    Row row = new Row() {RowIndex = (UInt32Value) (lines.Length + 1U)};
    for (int columnIndex = 0; columnIndex < 7; columnIndex++)
    {
        Cell cell = new Cell()
        {
            StyleIndex = 3,
            DataType = new EnumValue<cellvalues>(CellValues.String)
        };
        switch (columnIndex)
        {
            case 0:
                cell.CellValue = new CellValue("Totals");
                break;
            case 6:
                cell.DataType = new EnumValue<cellvalues>(CellValues.Number);
                cell.CellFormula = new CellFormula($"SUM(G2:G{lines.Length - 1})");
                break;
        }
        row.AppendChild(cell);
    }
    
    sheetData.AppendChild(row);
}

/// <summary>
/// Creates the stylesheet
/// </summary>
/// <returns></returns>
private static Stylesheet CreateStylesheet()
{
    //Fonts
    Font font0 = new Font();
    Font font1 = new Font(new FontSize() {Val = 10}, new Bold(), new Color() {Rgb = "FF000000"});
    Font font2 = new Font(new FontSize() { Val = 12 }, new Bold());
    Fonts fonts = new Fonts(font0, font1, font2);
    //Fills
    Fill fill0 = new Fill();
    Fill fill1 = new Fill();
    Fill fill2 = new Fill(new PatternFill()
    {
        PatternType = PatternValues.Solid,
        ForegroundColor = new ForegroundColor {Rgb = "FFA9CEE8"},
        BackgroundColor = new BackgroundColor() {Indexed = 64}
    });
    Fill fill3 = new Fill(new PatternFill()
    {
        PatternType = PatternValues.Solid,
        ForegroundColor = new ForegroundColor {Rgb = "FFC6EFCE"},
        BackgroundColor = new BackgroundColor() {Indexed = 64}
    });
    Fills fills = new Fills(fill0, fill1, fill2, fill3);
    //Borders
    Border border0 = new Border();
    Border border1 = new Border(new BottomBorder(new Color() {Auto = true}) {Style = BorderStyleValues.Double});
    Borders borders = new Borders(border0, border1);
    
    //CellFormats
    CellFormat cellFormat0 = new CellFormat {FontId = 0, FillId = 0};
    CellFormat cellFormat1 = new CellFormat {FontId = 1, FillId = 2, Alignment = new Alignment() {Horizontal = HorizontalAlignmentValues.Center}};
    CellFormat cellFormat2 = new CellFormat { FontId = 0, FillId = 0, BorderId = 1};
    CellFormat cellFormat3 = new CellFormat { FontId = 2, FillId = 3 };
    CellFormats cellFormats = new CellFormats(cellFormat0, cellFormat1, cellFormat2, cellFormat3);
    //Compose the Style Sheet
    Stylesheet styleSheet = new Stylesheet(fonts, fills, borders, cellFormats);
    return styleSheet;
}

</cellvalues></cellvalues></cellvalues></cellvalues></stringvalue></workbookstylespart></sheetdata></worksheetpart>

No comments:

Post a Comment