ExcelDynamicWriter.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. public void Write(IEnumerable<List<DynamicCell>>? values, string? worksheetName = null, bool append = false)
  19. {
  20. if (values == null) return;
  21. var xlWorksheet = xlWorkbook.Worksheets.FirstOrDefault(x => x.Name.Equals(worksheetName, StringComparison.InvariantCultureIgnoreCase));
  22. xlWorksheet ??= !string.IsNullOrWhiteSpace(worksheetName) ?
  23. xlWorkbook.AddWorksheet(worksheetName)
  24. : xlWorkbook.Worksheets.Count == 0 ? xlWorkbook.AddWorksheet() : xlWorkbook.Worksheets.First();
  25. Write(values, xlWorksheet, append);
  26. }
  27. private static void Write(IEnumerable<List<DynamicCell>> values, IXLWorksheet worksheet, bool append)
  28. {
  29. var rowIndex = append switch
  30. {
  31. true => worksheet.LastRowUsed().RowNumber() + 1,
  32. false => GenerateHeader(worksheet, values.First()),
  33. };
  34. foreach (var row in values)
  35. {
  36. foreach (var cell in row)
  37. {
  38. if (cell.Value == null) continue;
  39. worksheet.Cell(rowIndex, cell.Position).Value = XLCellValue.FromObject(cell.Value);
  40. }
  41. rowIndex++;
  42. }
  43. }
  44. public void SaveAs(string path, IExcelConverter? converter = null)
  45. {
  46. xlWorkbook.SaveAs(path);
  47. converter?.MakeCompatible(path);
  48. }
  49. }