Migrate ExcelIO from ClosedXML to NPOI
This commit is contained in:
@@ -1,18 +1,139 @@
|
||||
using ClosedXML.Excel;
|
||||
|
||||
namespace JdeScoping.ExcelIO.Tests.Fixtures;
|
||||
|
||||
public static class ExcelTestHelpers
|
||||
{
|
||||
public static List<string> GetHeadersFromSheet(IXLWorksheet sheet)
|
||||
{
|
||||
var headers = new List<string>();
|
||||
var col = 1;
|
||||
while (!sheet.Cell(1, col).IsEmpty())
|
||||
{
|
||||
headers.Add(sheet.Cell(1, col).Value.GetText());
|
||||
col++;
|
||||
}
|
||||
return headers;
|
||||
}
|
||||
}
|
||||
using NPOI.SS.UserModel;
|
||||
using NPOI.SS.Util;
|
||||
using NPOI.XSSF.UserModel;
|
||||
|
||||
namespace JdeScoping.ExcelIO.Tests.Fixtures;
|
||||
|
||||
public static class ExcelTestHelpers
|
||||
{
|
||||
private static readonly DataFormatter Formatter = new();
|
||||
|
||||
public static List<string> GetHeadersFromSheet(ISheet sheet)
|
||||
{
|
||||
var headers = new List<string>();
|
||||
var headerRow = sheet.GetRow(0);
|
||||
if (headerRow == null)
|
||||
{
|
||||
return headers;
|
||||
}
|
||||
|
||||
var col = 0;
|
||||
while (true)
|
||||
{
|
||||
var cell = headerRow.GetCell(col);
|
||||
var text = cell == null ? string.Empty : Formatter.FormatCellValue(cell);
|
||||
if (string.IsNullOrEmpty(text))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
headers.Add(text);
|
||||
col++;
|
||||
}
|
||||
|
||||
return headers;
|
||||
}
|
||||
|
||||
public static string GetCellText(ISheet sheet, int row1Based, int col1Based)
|
||||
{
|
||||
var cell = GetCell(sheet, row1Based, col1Based);
|
||||
return cell == null ? string.Empty : Formatter.FormatCellValue(cell);
|
||||
}
|
||||
|
||||
public static double GetCellNumber(ISheet sheet, int row1Based, int col1Based)
|
||||
{
|
||||
var cell = GetCell(sheet, row1Based, col1Based);
|
||||
if (cell == null)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (cell.CellType == CellType.Numeric)
|
||||
{
|
||||
return cell.NumericCellValue;
|
||||
}
|
||||
|
||||
var text = Formatter.FormatCellValue(cell);
|
||||
return double.TryParse(text, out var value) ? value : 0;
|
||||
}
|
||||
|
||||
public static ICell? GetCell(ISheet sheet, int row1Based, int col1Based)
|
||||
{
|
||||
return sheet.GetRow(row1Based - 1)?.GetCell(col1Based - 1);
|
||||
}
|
||||
|
||||
public static XSSFSheet GetXssfSheet(IWorkbook workbook, string sheetName)
|
||||
{
|
||||
return (XSSFSheet)workbook.GetSheet(sheetName)!;
|
||||
}
|
||||
|
||||
public static XSSFWorkbook OpenWorkbook(byte[] bytes)
|
||||
{
|
||||
return new XSSFWorkbook(new MemoryStream(bytes));
|
||||
}
|
||||
|
||||
public static double GetColumnWidthChars(ISheet sheet, int col1Based)
|
||||
{
|
||||
return sheet.GetColumnWidth(col1Based - 1) / 256d;
|
||||
}
|
||||
|
||||
public static bool IsSheetProtected(ISheet sheet)
|
||||
{
|
||||
return sheet is XSSFSheet xssf && xssf.IsSheetLocked;
|
||||
}
|
||||
|
||||
public static byte[]? GetFillForegroundRgb(ICell cell)
|
||||
{
|
||||
if (cell.CellStyle is XSSFCellStyle xssfStyle)
|
||||
{
|
||||
return xssfStyle.FillForegroundXSSFColor?.RGB;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static bool IsMerged(ISheet sheet, int firstRow1Based, int lastRow1Based, int firstCol1Based, int lastCol1Based)
|
||||
{
|
||||
for (var i = 0; i < sheet.NumMergedRegions; i++)
|
||||
{
|
||||
var region = sheet.GetMergedRegion(i);
|
||||
if (region.FirstRow == firstRow1Based - 1 &&
|
||||
region.LastRow == lastRow1Based - 1 &&
|
||||
region.FirstColumn == firstCol1Based - 1 &&
|
||||
region.LastColumn == lastCol1Based - 1)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static XSSFTable GetFirstTable(ISheet sheet)
|
||||
{
|
||||
return ((XSSFSheet)sheet).GetTables().First();
|
||||
}
|
||||
|
||||
public static XSSFTable GetTableByName(ISheet sheet, string name)
|
||||
{
|
||||
return ((XSSFSheet)sheet).GetTables().First(t => t.Name == name || t.DisplayName == name);
|
||||
}
|
||||
|
||||
public static int GetTableRowCount(XSSFTable table)
|
||||
{
|
||||
// header row + data rows
|
||||
return table.RowCount;
|
||||
}
|
||||
|
||||
public static bool TableExists(ISheet sheet, string tableName)
|
||||
{
|
||||
return ((XSSFSheet)sheet).GetTables().Any(t => t.Name == tableName || t.DisplayName == tableName);
|
||||
}
|
||||
|
||||
public static bool RegionIntersectsCell(CellRangeAddress region, int row1Based, int col1Based)
|
||||
{
|
||||
var row = row1Based - 1;
|
||||
var col = col1Based - 1;
|
||||
return region.IsInRange(row, col);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,68 +1,67 @@
|
||||
using ClosedXML.Excel;
|
||||
using JdeScoping.Core.Models.SearchResults;
|
||||
using JdeScoping.ExcelIO.Generators;
|
||||
using JdeScoping.ExcelIO.Mapping;
|
||||
using JdeScoping.ExcelIO.Mapping.Maps;
|
||||
using JdeScoping.ExcelIO.Options;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
using NSubstitute;
|
||||
|
||||
namespace JdeScoping.ExcelIO.Tests.Fixtures;
|
||||
|
||||
public abstract class WorkbookFixtureBase : IDisposable
|
||||
{
|
||||
public XLWorkbook Workbook { get; }
|
||||
public SearchModel SearchModel { get; }
|
||||
|
||||
protected abstract SearchModel CreateSearchModel();
|
||||
|
||||
protected WorkbookFixtureBase()
|
||||
{
|
||||
SearchModel = CreateSearchModel();
|
||||
var service = CreateExportService();
|
||||
var bytes = service.GenerateAsync(SearchModel).GetAwaiter().GetResult();
|
||||
Workbook = new XLWorkbook(new MemoryStream(bytes));
|
||||
}
|
||||
|
||||
private static ExcelExportService CreateExportService()
|
||||
{
|
||||
var logger = Substitute.For<ILogger<ExcelExportService>>();
|
||||
var options = Microsoft.Extensions.Options.Options.Create(new ExcelExportOptions
|
||||
{
|
||||
CriteriaSheetPassword = "TestCriteriaPass",
|
||||
DataSheetPassword = "TestDataPass"
|
||||
});
|
||||
|
||||
var registry = CreateTestRegistry();
|
||||
var tableWriter = new FluentTableWriter(registry);
|
||||
var criteriaGenerator = new CriteriaSheetGenerator(options, tableWriter);
|
||||
|
||||
return new ExcelExportService(logger, options, criteriaGenerator, tableWriter, registry);
|
||||
}
|
||||
|
||||
private static ExcelMapRegistry CreateTestRegistry()
|
||||
{
|
||||
var registry = new ExcelMapRegistry();
|
||||
|
||||
registry.Register(new SearchResultMap());
|
||||
registry.Register(new MisSearchResultMap());
|
||||
registry.Register(new MisNonMatchSearchResultMap());
|
||||
registry.Register(new TimespanFilterMap());
|
||||
registry.Register(new WorkOrderFilterEntryMap());
|
||||
registry.Register(new ItemNumberFilterEntryMap());
|
||||
registry.Register(new ProfitCenterFilterEntryMap());
|
||||
registry.Register(new WorkCenterFilterEntryMap());
|
||||
registry.Register(new OperatorFilterEntryMap());
|
||||
registry.Register(new ComponentLotFilterEntryMap());
|
||||
registry.Register(new ItemOperationMisFilterEntryMap());
|
||||
|
||||
return registry;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Workbook.Dispose();
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
}
|
||||
using JdeScoping.Core.Models.SearchResults;
|
||||
using JdeScoping.ExcelIO.Generators;
|
||||
using JdeScoping.ExcelIO.Mapping;
|
||||
using JdeScoping.ExcelIO.Mapping.Maps;
|
||||
using JdeScoping.ExcelIO.Options;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using NPOI.XSSF.UserModel;
|
||||
using NSubstitute;
|
||||
|
||||
namespace JdeScoping.ExcelIO.Tests.Fixtures;
|
||||
|
||||
public abstract class WorkbookFixtureBase : IDisposable
|
||||
{
|
||||
public XSSFWorkbook Workbook { get; }
|
||||
public SearchModel SearchModel { get; }
|
||||
|
||||
protected abstract SearchModel CreateSearchModel();
|
||||
|
||||
protected WorkbookFixtureBase()
|
||||
{
|
||||
SearchModel = CreateSearchModel();
|
||||
var service = CreateExportService();
|
||||
var bytes = service.GenerateAsync(SearchModel).GetAwaiter().GetResult();
|
||||
Workbook = new XSSFWorkbook(new MemoryStream(bytes));
|
||||
}
|
||||
|
||||
private static ExcelExportService CreateExportService()
|
||||
{
|
||||
var logger = Substitute.For<ILogger<ExcelExportService>>();
|
||||
var options = Microsoft.Extensions.Options.Options.Create(new ExcelExportOptions
|
||||
{
|
||||
CriteriaSheetPassword = "TestCriteriaPass",
|
||||
DataSheetPassword = "TestDataPass"
|
||||
});
|
||||
|
||||
var registry = CreateTestRegistry();
|
||||
var tableWriter = new FluentTableWriter(registry);
|
||||
var criteriaGenerator = new CriteriaSheetGenerator(options, tableWriter);
|
||||
|
||||
return new ExcelExportService(logger, options, criteriaGenerator, tableWriter, registry);
|
||||
}
|
||||
|
||||
private static ExcelMapRegistry CreateTestRegistry()
|
||||
{
|
||||
var registry = new ExcelMapRegistry();
|
||||
|
||||
registry.Register(new SearchResultMap());
|
||||
registry.Register(new MisSearchResultMap());
|
||||
registry.Register(new MisNonMatchSearchResultMap());
|
||||
registry.Register(new TimespanFilterMap());
|
||||
registry.Register(new WorkOrderFilterEntryMap());
|
||||
registry.Register(new ItemNumberFilterEntryMap());
|
||||
registry.Register(new ProfitCenterFilterEntryMap());
|
||||
registry.Register(new WorkCenterFilterEntryMap());
|
||||
registry.Register(new OperatorFilterEntryMap());
|
||||
registry.Register(new ComponentLotFilterEntryMap());
|
||||
registry.Register(new ItemOperationMisFilterEntryMap());
|
||||
|
||||
return registry;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Workbook.Dispose();
|
||||
GC.SuppressFinalize(this);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user