18using System.Collections.Generic;
24 internal class ExcelHelper
27 internal static void TokenizeExcelFile(GPALFile gPALFile)
29 foreach (
string filename
in gPALFile.Filenames)
33 IGPALGrid<string> data = GPAL.Grid.ToGPALObject();
35 using (var workbook =
new XLWorkbook(filename))
37 var worksheet = workbook.Worksheet(1);
39 foreach (var row
in worksheet.RowsUsed())
41 var rowData =
new List<string>();
42 foreach (var cell
in row.CellsUsed())
44 rowData.Add(cell.GetString());
48 ((IGPALFileInternal)gPALFile).FileGrid.Add(data);
53 GPAL.PublishSimpleEvent(Enums.GPALEventType.EXCEPTION, $
"Unable to tokenize file [{filename}]. Continuing.", gPALFile, Enums.GPALObjectType.GPALFile, ex);
58 internal static IGPALGrid<string> TokenizeExcelFile(
string filename)
60 IGPALGrid<string> data = GPAL.Grid.ToGPALObject();
64 using (var workbook =
new XLWorkbook(filename))
66 foreach (IXLWorksheet worksheet
in workbook.Worksheets)
68 var lastRow = worksheet.LastRowUsed()?.RowNumber() ?? 0;
69 var lastCol = worksheet.LastColumnUsed()?.ColumnNumber() ?? 0;
71 for (
int r = 1; r <= lastRow; r++)
73 var rowData =
new List<string>();
74 var row = worksheet.Row(r);
76 for (
int c = 1; c <= lastCol; c++)
78 rowData.Add(row.Cell(c).GetString());
88 GPAL.PublishSimpleEvent(Enums.GPALEventType.EXCEPTION,
89 $
"Unable to tokenize file [{filename}]. Continuing.",
null,
90 Enums.GPALObjectType.None, ex);
96 internal static string SaveToExcelFile(
string fileName, IGPALGrid<string> data)
98 using (var workbook =
new XLWorkbook())
100 var worksheet = workbook.Worksheets.Add(
"Sheet1");
102 for (
int rowIndex = 0; rowIndex < data.Count(); rowIndex++)
104 var row = data[rowIndex];
105 for (
int colIndex = 0; colIndex < row.Count; colIndex++)
109 worksheet.Cell(rowIndex + 1, colIndex + 1).Value = row[colIndex];
113 GPAL.PublishSimpleEvent(Enums.GPALEventType.EXCEPTION, $
"Error saving to Excel [{fileName}]", data, Enums.GPALObjectType.Other, ex);
118 workbook.SaveAs(fileName);
128 internal static void CopyWorksheet(IXLWorksheet src, IXLWorksheet dest)
136 foreach (var row
in src.RowsUsed())
138 int rowIndex = row.RowNumber();
139 foreach (var cell
in row.CellsUsed())
141 int colIndex = cell.Address.ColumnNumber;
143 dest.Cell(rowIndex, colIndex).Value = cell.GetString();
149 GPAL.PublishSimpleEvent(Enums.GPALEventType.EXCEPTION, $
"Failed to copy worksheet",
null, Enums.GPALObjectType.None, ex);
158 internal static void WriteRange(IXLWorksheet worksheet,
string range, IGPALGrid<string> data)
162 var rangeObj = worksheet.Range(range);
163 var firstCell = rangeObj.FirstCell();
165 int startRow = firstCell.Address.RowNumber;
166 int startColumn = firstCell.Address.ColumnNumber;
168 for (
int rowIndex = 0; rowIndex < data.Count(); rowIndex++)
170 var row = data[rowIndex];
171 for (
int colIndex = 0; colIndex < row.Count; colIndex++)
173 worksheet.Cell(startRow + rowIndex, startColumn + colIndex).Value = row[colIndex];
179 GPAL.PublishSimpleEvent(Enums.GPALEventType.EXCEPTION, $
"Failed to write range [{range}] in worksheet",
null, Enums.GPALObjectType.None, ex);
186 public string CellAddress {
get;
set; }
187 public string OldValue {
get;
set; }
188 public string NewValue {
get;
set; }
189 public string SourceRange {
get;
set; }
190 public string TargetRange {
get;
set; }
193 internal static List<CellDifference> CompareExcelFiles(XLWorkbook workbook1, XLWorkbook workbook2)
195 var differences =
new List<CellDifference>();
199 var worksheet1 = workbook1.Worksheet(1);
200 var worksheet2 = workbook2.Worksheet(1);
201 var range1 = worksheet1.RangeUsed();
202 var range2 = worksheet2.RangeUsed();
203 int maxRows = Math.Max(range1?.RowCount() ?? 0, range2?.RowCount() ?? 0);
204 int maxCols = Math.Max(range1?.ColumnCount() ?? 0, range2?.ColumnCount() ?? 0);
206 for (
int row = 1; row <= maxRows; row++)
208 for (
int col = 1; col <= maxCols; col++)
210 string value1 = worksheet1.Cell(row, col).GetString();
211 string value2 = worksheet2.Cell(row, col).GetString();
212 if (value1 != value2)
216 CellAddress = $
"{worksheet1.Column(col).ColumnLetter()}{row}",
226 GPAL.PublishSimpleEvent(Enums.GPALEventType.EXCEPTION, $
"Failed to compare workbooks",
null, Enums.GPALObjectType.None, ex);
237 internal static List<CellDifference> CompareRanges(IGPALGrid<string> data1, IGPALGrid<string> data2)
239 var differences =
new List<CellDifference>();
243 int maxRows = Math.Max(data1.Count(), data2.Count());
244 int maxCols = Math.Max(data1.Any() ? data1[0].Count : 0, data2.Any() ? data2[0].Count : 0);
246 for (
int i = 0; i < maxRows; i++)
248 for (
int j = 0; j < maxCols; j++)
250 string value1 = i < data1.Count() && j < data1[i].Count ? data1[i][j] :
null;
251 string value2 = i < data2.Count() && j < data2[i].Count ? data2[i][j] :
null;
253 if (value1 != value2)
255 string cellAddress = $
"{(char)('A' + j)}{i + 1}";
258 CellAddress = cellAddress,
259 OldValue = value1 ??
"",
260 NewValue = value2 ??
""
268 GPAL.PublishSimpleEvent(Enums.GPALEventType.EXCEPTION, $
"Failed to compare ranges",
null, Enums.GPALObjectType.None, ex);
273 internal static string GetCellValue(XLWorkbook workbook,
string cellAddress)
277 return workbook.Worksheet(1).Cell(cellAddress).GetString();
281 GPAL.PublishSimpleEvent(Enums.GPALEventType.EXCEPTION, $
"Failed to get cell value [{cellAddress}]",
null, Enums.GPALObjectType.None, ex);
286 internal static IGPALGrid<string> ReadRange(IXLWorksheet worksheet,
string range)
288 IGPALGrid<string> data = GPAL.Grid.ToGPALObject();
292 var xlRange = worksheet.Range(range);
294 foreach (var row
in xlRange.RowsUsed())
296 var rowData =
new List<string>();
297 foreach (var cell
in row.CellsUsed())
299 rowData.Add(cell.GetString());
301 data.AddRow(rowData);
306 GPAL.PublishSimpleEvent(Enums.GPALEventType.EXCEPTION, $
"Failed to extract range [{range}]",
null, Enums.GPALObjectType.None, ex);
312 internal static double GetColumnSum(XLWorkbook workbook,
string column)
318 var col = workbook.Worksheet(1).Column(column);
319 foreach (var cell
in col.CellsUsed())
321 if (
double.TryParse(cell.GetString(), out
double value))
329 GPAL.PublishSimpleEvent(Enums.GPALEventType.EXCEPTION, $
"Failed to calculate sum for column [{column}]",
null, Enums.GPALObjectType.None, ex);
335 internal static List<string> GetColumnValues(IXLWorksheet worksheet,
string column)
337 var values =
new List<string>();
341 var col = worksheet.Column(column);
342 foreach (var cell
in col.CellsUsed())
344 values.Add(cell.GetString());
349 GPAL.PublishSimpleEvent(Enums.GPALEventType.EXCEPTION, $
"Failed to get values for column [{column}]",
null, Enums.GPALObjectType.None, ex);
355 internal static List<string> GetRowValues(IXLWorksheet worksheet,
int rowNumber)
357 var values =
new List<string>();
361 var row = worksheet.Row(rowNumber);
362 foreach (var cell
in row.CellsUsed())
364 values.Add(cell.GetString());
369 GPAL.PublishSimpleEvent(Enums.GPALEventType.EXCEPTION, $
"Failed to get values for row [{rowNumber}]",
null, Enums.GPALObjectType.None, ex);
375 internal static void SearchAndReplaceByValue(IXLWorksheet worksheet,
string range,
string searchValue,
string replaceValue)
379 var xlRange = worksheet.Range(range);
380 foreach (var cell
in xlRange.CellsUsed())
382 if (cell.GetString() == searchValue)
384 cell.Value = replaceValue;
390 GPAL.PublishSimpleEvent(Enums.GPALEventType.EXCEPTION, $
"Failed to search and replace in range [{range}]",
null, Enums.GPALObjectType.None, ex);
394 internal static int SearchHeaderIndexByValue(XLWorkbook workbook,
string range,
string headerValue)
398 var worksheet = workbook.Worksheet(1);
399 var xlRange = worksheet.Range(range);
400 foreach (var cell
in xlRange.CellsUsed())
402 if (cell.GetString() == headerValue)
404 return cell.Address.ColumnNumber;
410 GPAL.PublishSimpleEvent(Enums.GPALEventType.EXCEPTION, $
"Failed to search header in range [{range}]",
null, Enums.GPALObjectType.None, ex);
416 internal static string SearchValue(XLWorkbook workbook,
string range,
string searchValue)
420 var worksheet = workbook.Worksheet(1);
421 var xlRange = worksheet.Range(range);
422 foreach (var cell
in xlRange.CellsUsed())
424 if (cell.GetString() == searchValue)
426 return cell.Address.ToString();
432 GPAL.PublishSimpleEvent(Enums.GPALEventType.EXCEPTION, $
"Failed to search value in range [{range}]",
null, Enums.GPALObjectType.None, ex);
438 internal static void SetCellValue(XLWorkbook workbook,
string cellAddress,
string value)
442 workbook.Worksheet(1).Cell(cellAddress).Value = value;
446 GPAL.PublishSimpleEvent(Enums.GPALEventType.EXCEPTION, $
"Failed to set cell value [{cellAddress}]",
null, Enums.GPALObjectType.None, ex);
459 public static void WriteXlsxFromTokenizedData(
461 IGPALGrid<string> grid,
462 List<int> rowsPerSheet,
463 IGPALGrid<string> columnNamesPerSheet,
464 List<string> sheetNames,
465 bool writeHeaders =
true)
467 if (grid ==
null)
throw new ArgumentNullException(nameof(grid));
468 if (rowsPerSheet ==
null)
throw new ArgumentNullException(nameof(rowsPerSheet));
469 if (columnNamesPerSheet ==
null)
throw new ArgumentNullException(nameof(columnNamesPerSheet));
471 using var workbook =
new XLWorkbook();
473 int currentRowInGrid = 0;
475 for (
int sheetIdx = 0; sheetIdx < rowsPerSheet.Count; sheetIdx++)
477 int totalRowsThisSheet = rowsPerSheet[sheetIdx];
478 if (totalRowsThisSheet == 0)
continue;
480 var columnNames = columnNamesPerSheet[sheetIdx];
482 string sheetName = sheetNames !=
null && sheetIdx < sheetNames.Count
483 ? sheetNames[sheetIdx]
484 : $
"Sheet{sheetIdx + 1}";
486 var worksheet = workbook.Worksheets.Add(sheetName);
493 for (
int col = 0; col < columnNames.Count; col++)
494 worksheet.Cell(1, col + 1).Value = columnNames[col];
496 worksheet.Row(1).Style.Font.Bold =
true;
500 int startOffset = writeHeaders ? 1 : 0;
501 int dataRowsToWrite = totalRowsThisSheet - startOffset;
504 for (
int i = 0; i < dataRowsToWrite; i++)
506 var sourceRow = grid[currentRowInGrid + startOffset + i];
509 for (
int col = 0; col < columnNames.Count; col++)
511 string value = col < sourceRow.Count ? sourceRow[col] ?? string.Empty :
string.Empty;
512 worksheet.Cell(destRow, col + 1).Value = value;
519 if (columnNames.Count > 0)
520 worksheet.Columns(1, columnNames.Count).AdjustToContents();
522 currentRowInGrid += totalRowsThisSheet;
525 workbook.SaveAs(outputPath);