ExcelDynamicWriter.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using ClosedXML.Excel;
  2. using ExcelORM.Models;
  3. namespace ExcelORM;
  4. public class ExcelDynamicWriter
  5. {
  6. private readonly IXLWorkbook xlWorkbook;
  7. public ExcelDynamicWriter(string? path = null)
  8. {
  9. xlWorkbook = File.Exists(path) ? new XLWorkbook(path) : new XLWorkbook();
  10. }
  11. private static int GenerateHeader(IXLWorksheet worksheet, IEnumerable<DynamicCell> firstRow)
  12. {
  13. var rowIndex = 1;
  14. foreach (var item in firstRow)
  15. worksheet.Cell(rowIndex, item.Position).Value = item.Header;
  16. return ++rowIndex;
  17. }
  18. private static void Write(IEnumerable<List<DynamicCell>> values, IXLWorksheet worksheet, bool append)
  19. {
  20. var rowIndex = append switch
  21. {
  22. true => worksheet.LastRowUsed().RowNumber() + 1,
  23. false => GenerateHeader(worksheet, values.First()),
  24. };
  25. foreach (var row in values)
  26. {
  27. foreach (var cell in row)
  28. {
  29. if (cell.Value == null) continue;
  30. worksheet.Cell(rowIndex, cell.Position).Value = XLCellValue.FromObject(cell.Value);
  31. }
  32. rowIndex++;
  33. }
  34. }
  35. public void Write(IEnumerable<List<DynamicCell>>? values, string? worksheetName = null, bool append = false)
  36. {
  37. if (values == null) return;
  38. var xlWorksheet = xlWorkbook.Worksheets.FirstOrDefault(x => x.Name.Equals(worksheetName, StringComparison.InvariantCultureIgnoreCase));
  39. xlWorksheet ??= !string.IsNullOrWhiteSpace(worksheetName) ?
  40. xlWorkbook.AddWorksheet(worksheetName)
  41. : xlWorkbook.Worksheets.Count == 0 ? xlWorkbook.AddWorksheet() : xlWorkbook.Worksheets.First();
  42. Write(values, xlWorksheet, append);
  43. }
  44. public void WriteAll(IEnumerable<DynamicWorksheet>? dynamicWorksheets, bool append = false)
  45. {
  46. if (dynamicWorksheets == null) return;
  47. foreach (var dynamicWorksheet in dynamicWorksheets)
  48. Write(dynamicWorksheet.Cells, dynamicWorksheet.Name, append);
  49. }
  50. public void SaveAs(string path, IExcelConverter? converter = null)
  51. {
  52. xlWorkbook.SaveAs(path);
  53. converter?.MakeCompatible(path);
  54. }
  55. }