You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C# EPPlus将嵌套模型数据导出为指定格式Excel报表

使用EPPlus导出ECUPartHistory数据到Excel

实现思路

每个ECUPartHistory对象包含多条Carlines数据,导出时需要将主从结构扁平化:每条Carlines对应一行完整数据,主表字段重复填充到对应子表行中,适配Excel的行式存储逻辑。

完整代码示例

先确保已安装EPPlus NuGet包:Install-Package EPPlus

using OfficeOpenXml;
using System.IO;
using System.Collections.Generic;
using System.Linq;

public class ExcelExporter
{
    public void ExportECUPartHistory(List<ECUPartHistory> dataList, string outputPath)
    {
        // EPPlus 5+版本需指定许可证上下文,商用场景请切换为Commercial
        ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

        using (var package = new ExcelPackage())
        {
            var worksheet = package.Workbook.Worksheets.Add("ECU部件历史");

            // 写入表头
            var headers = new[]
            {
                "部件历史ID", "ECU名称", "迭代周期", "ECU版本", "ECU变体", "LU部件号",
                "车型ID", "车型名称", "起始年份", "结束年份", "变更年份"
            };

            for (int col = 0; col < headers.Length; col++)
            {
                worksheet.Cells[1, col + 1].Value = headers[col];
                // 表头样式优化(可选)
                worksheet.Cells[1, col + 1].Style.Font.Bold = true;
                worksheet.Cells[1, col + 1].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
                worksheet.Cells[1, col + 1].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightGray);
            }

            // 写入数据行
            int currentRow = 2;
            foreach (var ecuPart in dataList)
            {
                // 处理无车型数据的情况
                if (ecuPart.Carlines == null || !ecuPart.Carlines.Any())
                {
                    FillECUMainData(worksheet, currentRow, ecuPart);
                    currentRow++;
                    continue;
                }

                // 遍历每个车型,填充完整行数据
                foreach (var carline in ecuPart.Carlines)
                {
                    FillECUMainData(worksheet, currentRow, ecuPart);
                    FillCarlineData(worksheet, currentRow, carline);
                    currentRow++;
                }
            }

            // 自动调整列宽
            worksheet.Cells.AutoFitColumns();

            // 保存Excel文件
            package.SaveAs(new FileInfo(outputPath));
        }
    }

    // 提取主表数据填充逻辑,避免重复代码
    private void FillECUMainData(ExcelWorksheet worksheet, int row, ECUPartHistory ecuPart)
    {
        worksheet.Cells[row, 1].Value = ecuPart.PartHistID;
        worksheet.Cells[row, 2].Value = ecuPart.ECUName;
        worksheet.Cells[row, 3].Value = ecuPart.Sprint;
        worksheet.Cells[row, 4].Value = ecuPart.ECURelease;
        worksheet.Cells[row, 5].Value = ecuPart.ECUVariant;
        worksheet.Cells[row, 6].Value = ecuPart.LUPartNumber;
    }

    // 提取子表数据填充逻辑
    private void FillCarlineData(ExcelWorksheet worksheet, int row, Carlines carline)
    {
        worksheet.Cells[row, 7].Value = carline.CarlineID;
        worksheet.Cells[row, 8].Value = carline.CarLineName;
        worksheet.Cells[row, 9].Value = carline.From;
        worksheet.Cells[row, 10].Value = carline.To;
        worksheet.Cells[row, 11].Value = carline.ChangeYear;
    }
}

// 调用示例
// var exporter = new ExcelExporter();
// var ecuData = GetECUPartHistoryData(); // 替换为你的数据获取逻辑
// exporter.ExportECUPartHistory(ecuData, @"D:\ECU部件历史.xlsx");

关键说明

  • 扁平化处理:将嵌套的主从结构转换为Excel支持的二维表格,确保数据展示清晰
  • 许可证设置:EPPlus 5及以上版本必须指定许可证上下文,商用场景需购买官方授权
  • 空值兼容:Nullable<int>类型会自动导出为空单元格,无需额外处理
  • 代码复用:通过提取填充方法,减少重复代码,提升可维护性

内容的提问来源于stack exchange,提问作者Prasanth Aman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:31:14