C#中使用EPPlus实现Excel单列护照数据筛选及多列拆分方案求助
基于EPPlus实现单列护照数据筛选、拆分的落地方案
1. 基础依赖引入
- 先通过NuGet安装EPPlus包,包管理控制台命令:
Install-Package EPPlus,dotnet CLI命令:dotnet add package EPPlus - 注意:EPPlus 5.x及以上版本商用需要购买付费授权,个人非商用可免费使用,对授权有要求可选择4.x最后一个无授权限制的稳定版本。
2. 核心实现逻辑
4000行数据量极小,可直接全量加载到内存处理,无需额外做性能优化。
2.1 加载Excel文件
// EPPlus 5.x版本必须加这行声明授权类型,4.x版本可省略 ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 商用场景改为LicenseContext.Commercial using var package = new ExcelPackage(new FileInfo("你的原始护照数据文件路径.xlsx")); var worksheet = package.Workbook.Worksheets.First(); // 取第一个工作表,可按需调整工作表索引/名称 int totalRow = worksheet.Dimension.End.Row; // 取工作表有效数据总行数 int sourceCol = 1; // 原始数据存储的列号,A列对应1,B列对应2,按需调整 int startProcessRow = 1; // 如果有表头就改为2,跳过第一行表头
2.2 定义拆分规则和目标列
以下示例为通用模板,你可以根据自己的实际数据格式替换匹配规则,支持分隔符拆分、固定长度截取、正则匹配等多种拆分方式
// 定义拆分后的目标字段和对应列号,示例:B列存护照号、C列存姓名、D列存国籍、E列存有效期 var targetColumnMap = new Dictionary<string, int>() { {"护照号", 2}, {"姓名", 3}, {"国籍", 4}, {"有效期", 5} }; // 可选:给目标列写入表头 foreach (var item in targetColumnMap) { worksheet.Cells[1, item.Value].Value = item.Key; startProcessRow = 2; // 有表头的场景下从第二行开始处理数据 }
2.3 逐行筛选+拆分写入
for (int row = startProcessRow; row <= totalRow; row++) { string rawData = worksheet.Cells[row, sourceCol].Text?.Trim() ?? string.Empty; // 第一步:筛选,不符合条件的行直接跳过,可自定义筛选规则 if (string.IsNullOrEmpty(rawData) || !rawData.Contains("护照号")) { // 也可以调用worksheet.DeleteRow(row)直接删除无效行,按需调整 continue; } // 第二步:拆分,以下为分隔符拆分示例,按需替换成你需要的拆分逻辑 var dataDict = rawData.Split('|') .Select(p => p.Split(':')) .Where(p => p.Length == 2) .ToDictionary(p => p[0].Trim(), p => p[1].Trim()); // 第三步:写入对应目标列 foreach (var item in targetColumnMap) { if (dataDict.TryGetValue(item.Key, out var value)) { worksheet.Cells[row, item.Value].Value = value; } } }
2.4 保存处理结果
package.SaveAs(new FileInfo("处理后的护照数据文件.xlsx"));
3. 优化建议
- 如果数据是固定格式的结构化字符串,用正则匹配精准度更高,比如护照号通常为E/K开头加8位数字,正则规则可写为
@"[EK]\d{8}" - 筛选条件可根据业务需求自定义,比如筛选有效期大于2025年、国籍为指定国家的数据,直接在逐行处理的逻辑中加判断条件即可
- 处理前建议先备份原始文件,避免操作失误导致数据丢失
内容的提问来源于stack exchange,提问作者jeawaantha
相关产品推荐
相关产品推荐

