网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
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 { }
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码是一个用于测试 Excel 导出功能的单元测试类,使用了 NPOI 库来处理 Excel 文件的创建和操作。以下是代码的主要功能和结构的详细解释:

1. 类和命名空间

  • ExcelExportTest 类:这是一个测试类,包含多个测试方法,用于验证 Excel 导出功能的正确性。
  • Dpz.Core.Infrastructure.ExcelNPOI 命名空间:这些命名空间包含了处理 Excel 文件的相关类和方法。

2. 测试数据

  • _testData_testData2:这两个列表分别存储了 TestDataTestData2 类型的测试数据。TestData 包含了用户的基本信息,而 TestData2 包含了编码、描述和标签等信息。

3. Setup 方法

  • Setup 方法:在每个测试之前执行,初始化测试数据。

4. 测试方法

  • TestBasicExport:测试基本的 Excel 导出功能。它验证导出的字节数组是否有效,并检查 Excel 文件的表头和数据行是否正确。

  • TestExportWithCustomColumns:测试自定义列导出功能。它定义了要导出的列,并验证导出的 Excel 文件中只包含指定的列。

  • TestMultipleSheetExport:测试多工作表导出功能。它准备多个工作表的数据并验证导出的 Excel 文件中是否包含正确数量的工作表及其内容。

  • TestExportWithCustomAction:测试自定义操作的导出功能。它定义了一个自定义操作,在导出时在 Excel 的第一行插入自定义标题,并验证该标题是否正确。

5. 辅助方法

  • SaveFile:一个私有静态方法,用于将导出的字节数组保存为 Excel 文件。它会在 temp_data 目录下创建一个新的 Excel 文件,文件名为一个新的 GUID。

6. 数据模型

  • TestDataTestData2 类:这两个类定义了导出数据的结构,使用了 ExportMark 特性来指定 Excel 中的列名和格式。TestData 包含了用户的基本信息,而 TestData2 包含了编码、描述和标签等信息。

7. 自定义列配置

  • CustomColumn 类:这是一个自定义列配置类,继承自 ExcelColumn,用于在导出时定义列的显示和隐藏。

总结

整体上,这段代码是一个完整的单元测试示例,展示了如何使用 NPOI 库导出 Excel 文件,并通过不同的测试方法验证导出功能的正确性。它涵盖了基本导出、自定义列、多个工作表和自定义操作等多种场景,确保了 Excel 导出功能的健壮性。

loading