网站首页 网站源码
using Dpz.Core.Infrastructure.Excel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
namespace Dpz.Core.Simple.Test;
/// <summary>
/// Excel导出测试类
/// </summary>
public class ExcelExportTest
{
private List<TestData> _testData;
private List<TestData2> _testData2;
[SetUp]
public void Setup()
{
// 初始化测试数据
_testData = new List<TestData>
{
new()
{
Id = 1,
Name = "测试1",
Age = 20,
CreateTime = DateTime.Now,
Score = 95.5m,
IsActive = true,
},
new()
{
Id = 2,
Name = "测试2",
Age = 21,
CreateTime = DateTime.Now.AddDays(-1),
Score = 88.5m,
IsActive = false,
},
};
_testData2 = new List<TestData2>
{
new()
{
Code = "A001",
Description = "描述1",
Tags = ["标签1", "标签2"],
},
new()
{
Code = "A002",
Description = "描述2",
Tags = ["标签3", "标签4"],
},
};
}
[Test]
public void TestBasicExport()
{
// 执行导出
var bytes = _testData.ExportForMark("测试工作表");
// 验证结果
Assert.That(bytes, Is.Not.Null);
Assert.That(bytes.Length, Is.GreaterThan(0));
// 验证Excel内容
using var stream = new MemoryStream(bytes);
using var workbook = new XSSFWorkbook(stream);
var sheet = workbook.GetSheetAt(0);
// 验证表头
var headerRow = sheet.GetRow(0);
Assert.That(headerRow.GetCell(0).StringCellValue, Is.EqualTo("编号"));
Assert.That(headerRow.GetCell(1).StringCellValue, Is.EqualTo("姓名"));
Assert.That(headerRow.GetCell(2).StringCellValue, Is.EqualTo("年龄"));
// 验证数据行
var dataRow = sheet.GetRow(1);
Assert.That(dataRow.GetCell(0).NumericCellValue, Is.EqualTo(1));
Assert.That(dataRow.GetCell(1).StringCellValue, Is.EqualTo("测试1"));
Assert.That(dataRow.GetCell(2).NumericCellValue, Is.EqualTo(20));
SaveFile(bytes);
}
[Test]
public void TestExportWithCustomColumns()
{
// 定义列配置
var columns = new List<ExcelColumn>
{
new CustomColumn { ColumnName = "Id", Show = true },
new CustomColumn { ColumnName = "Name", Show = true },
new CustomColumn { ColumnName = "Age", Show = false },
};
// 执行导出
var bytes = _testData.ExportForMark(columns, "自定义列测试");
// 验证结果
using var stream = new MemoryStream(bytes);
using var workbook = new XSSFWorkbook(stream);
var sheet = workbook.GetSheetAt(0);
// 验证只显示了两列
var headerRow = sheet.GetRow(0);
Assert.That(headerRow.GetCell(0).StringCellValue, Is.EqualTo("编号"));
Assert.That(headerRow.GetCell(1).StringCellValue, Is.EqualTo("姓名"));
Assert.That(headerRow.GetCell(2), Is.Null);
SaveFile(bytes);
}
[Test]
public void TestMultipleSheetExport()
{
// 准备多工作表导出配置
var options = new List<ExportMultipleSheet>
{
new(_testData, "工作表1"),
new(_testData2, "工作表2"),
};
// 执行导出
var bytes = options.ExportMultipleForMark();
// 验证结果
Assert.That(bytes, Is.Not.Null);
Assert.That(bytes.Length, Is.GreaterThan(0));
// 验证Excel内容
using var stream = new MemoryStream(bytes);
using var workbook = new XSSFWorkbook(stream);
// 验证工作表数量
Assert.That(workbook.NumberOfSheets, Is.EqualTo(2));
// 验证第一个工作表
var sheet1 = workbook.GetSheetAt(0);
Assert.That(sheet1.SheetName, Is.EqualTo("工作表1"));
Assert.That(sheet1.GetRow(1).GetCell(0).NumericCellValue, Is.EqualTo(1));
// 验证第二个工作表
var sheet2 = workbook.GetSheetAt(1);
Assert.That(sheet2.SheetName, Is.EqualTo("工作表2"));
Assert.That(sheet2.GetRow(1).GetCell(0).StringCellValue, Is.EqualTo("A001"));
SaveFile(bytes);
}
[Test]
public void TestExportWithCustomAction()
{
// 定义自定义处理操作
void CustomAction(ISheet sheet)
{
var row = sheet.CreateRow(0);
var cell = row.CreateCell(0);
cell.SetCellValue("自定义标题");
}
// 执行导出
var bytes = _testData.ExportForMark("自定义操作测试", 1, CustomAction);
// 验证结果
using var stream = new MemoryStream(bytes);
using var workbook = new XSSFWorkbook(stream);
var sheet = workbook.GetSheetAt(0);
// 验证自定义操作是否生效
Assert.That(sheet.GetRow(0).GetCell(0).StringCellValue, Is.EqualTo("自定义标题"));
SaveFile(bytes);
}
private static void SaveFile(byte[] bytes)
{
var dir = new DirectoryInfo("temp_data");
if (!dir.Exists)
{
dir.Create();
}
var filePath = Path.Combine(dir.FullName, $"{Guid.NewGuid():N}.xlsx");
using var fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write);
fileStream.Write(bytes);
fileStream.Flush();
}
}
/// <summary>
/// 测试数据类1
/// </summary>
public class TestData
{
[ExportMark("编号")]
public int Id { get; set; }
[ExportMark("姓名")]
public string? Name { get; set; }
[ExportMark("年龄")]
public int Age { get; set; }
[ExportMark("创建时间", Format = "yyyy-MM-dd HH:mm:ss")]
public DateTime CreateTime { get; set; }
[ExportMark("分数", Format = "0.0")]
public decimal Score { get; set; }
[ExportMark("是否激活")]
public bool IsActive { get; set; }
}
/// <summary>
/// 测试数据类2
/// </summary>
public class TestData2
{
[ExportMark("编码")]
public string? Code { get; set; }
[ExportMark("描述")]
public string? Description { get; set; }
[ExportMark("标签", EnumerableSplit = ",")]
public string[]? Tags { get; set; }
}
/// <summary>
/// 自定义列配置类
/// </summary>
public class CustomColumn : ExcelColumn { }
上述代码是一个用于测试 Excel 导出功能的单元测试类,使用了 NPOI 库来处理 Excel 文件的创建和操作。以下是代码的主要功能和结构的详细解释:
ExcelExportTest
类:这是一个测试类,包含多个测试方法,用于验证 Excel 导出功能的正确性。Dpz.Core.Infrastructure.Excel
和 NPOI
命名空间:这些命名空间包含了处理 Excel 文件的相关类和方法。_testData
和 _testData2
:这两个列表分别存储了 TestData
和 TestData2
类型的测试数据。TestData
包含了用户的基本信息,而 TestData2
包含了编码、描述和标签等信息。Setup
方法:在每个测试之前执行,初始化测试数据。TestBasicExport
:测试基本的 Excel 导出功能。它验证导出的字节数组是否有效,并检查 Excel 文件的表头和数据行是否正确。
TestExportWithCustomColumns
:测试自定义列导出功能。它定义了要导出的列,并验证导出的 Excel 文件中只包含指定的列。
TestMultipleSheetExport
:测试多工作表导出功能。它准备多个工作表的数据并验证导出的 Excel 文件中是否包含正确数量的工作表及其内容。
TestExportWithCustomAction
:测试自定义操作的导出功能。它定义了一个自定义操作,在导出时在 Excel 的第一行插入自定义标题,并验证该标题是否正确。
SaveFile
:一个私有静态方法,用于将导出的字节数组保存为 Excel 文件。它会在 temp_data
目录下创建一个新的 Excel 文件,文件名为一个新的 GUID。TestData
和 TestData2
类:这两个类定义了导出数据的结构,使用了 ExportMark
特性来指定 Excel 中的列名和格式。TestData
包含了用户的基本信息,而 TestData2
包含了编码、描述和标签等信息。CustomColumn
类:这是一个自定义列配置类,继承自 ExcelColumn
,用于在导出时定义列的显示和隐藏。整体上,这段代码是一个完整的单元测试示例,展示了如何使用 NPOI 库导出 Excel 文件,并通过不同的测试方法验证导出功能的正确性。它涵盖了基本导出、自定义列、多个工作表和自定义操作等多种场景,确保了 Excel 导出功能的健壮性。