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. 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. public void WriteAll(IEnumerable<DynamicWorksheet>? dynamicWorksheets, bool append = false)
  28. {
  29. if (dynamicWorksheets == null) return;
  30. foreach (var dynamicWorksheet in dynamicWorksheets)
  31. Write(dynamicWorksheet.Cells, dynamicWorksheet.Name, append);
  32. }
  33. private static void Write(IEnumerable<List<DynamicCell>> values, IXLWorksheet worksheet, bool append)
  34. {
  35. var rowIndex = append switch
  36. {
  37. true => worksheet.LastRowUsed().RowNumber() + 1,
  38. false => GenerateHeader(worksheet, values.First()),
  39. };
  40. foreach (var row in values)
  41. {
  42. foreach (var cell in row)
  43. {
  44. if (cell.Value == null) continue;
  45. worksheet.Cell(rowIndex, cell.Position).Value = XLCellValue.FromObject(cell.Value);
  46. }
  47. rowIndex++;
  48. }
  49. }
  50. public void SaveAs(string path, IExcelConverter? converter = null)
  51. {
  52. xlWorkbook.SaveAs(path);
  53. converter?.MakeCompatible(path);
  54. }
  55. }