














如果你需要合并多个Excel文件,并且保持原表格的数字格式(如日期、货币、百分比等),可以使用 EPPlus(一个强大的.NET Excel操作库)。以下是完整的解决方案,使用C#和EPPlus实现。
.xlsx)到一个文件。通过NuGet安装EPPlus:
Install-Package EPPlus -Version 5.8.8
(如果你用的是.NET Core 3.1+,可以直接用 Install-Package EPPlus,最新版已支持跨平台。)
using OfficeOpenXml;
using System;
using System.IO;
using System.Linq;
class ExcelMerger
{
static void Main(string[] args)
{
// 设置EPPlus许可证(社区版免费)
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
// 输入文件夹(存放待合并的Excel文件)
string inputFolder = @"C:\ExcelFiles\";
// 输出文件(合并后的Excel)
string outputFile = @"C:\MergedExcel.xlsx";
// 获取所有Excel文件
var excelFiles = Directory.GetFiles(inputFolder, "*.xlsx");
// 创建一个新的Excel包(最终合并的文件)
using (var mergedPackage = new ExcelPackage(new FileInfo(outputFile)))
{
// 遍历每个Excel文件
foreach (var file in excelFiles)
{
using (var sourcePackage = new ExcelPackage(new FileInfo(file)))
{
// 遍历当前Excel的所有Sheet
foreach (var sourceSheet in sourcePackage.Workbook.Worksheets)
{
// 在合并后的Excel中创建同名Sheet(如果已存在则追加数据)
string sheetName = sourceSheet.Name;
var targetSheet = mergedPackage.Workbook.Worksheets.FirstOrDefault(s => s.Name == sheetName);
if (targetSheet == null)
{
// 如果Sheet不存在,直接复制整个Sheet(保留格式)
targetSheet = mergedPackage.Workbook.Worksheets.Add(sheetName, sourceSheet);
}
else
{
// 如果Sheet已存在,仅复制数据(保留格式)
int targetRow = targetSheet.Dimension?.End.Row ?? 1; // 获取目标Sheet的最后一行
int sourceRowCount = sourceSheet.Dimension.Rows;
int sourceColCount = sourceSheet.Dimension.Columns;
// 复制数据(逐行逐列,保留格式)
for (int row = 1; row <= sourceRowCount; row++)
{
for (int col = 1; col <= sourceColCount; col++)
{
// 复制单元格(值 + 格式)
var sourceCell = sourceSheet.Cells[row, col];
var targetCell = targetSheet.Cells[targetRow + row, col];
// 复制值
targetCell.Value = sourceCell.Value;
// 复制样式(数字格式、字体、颜色等)
targetCell.StyleID = sourceCell.StyleID; // 直接复用StyleID更高效
}
}
}
}
}
}
// 保存合并后的Excel
mergedPackage.Save();
Console.WriteLine($"合并完成!文件已保存到: {outputFile}");
}
}
}
EPPlus通过 StyleID 直接复用原单元格的样式,确保:
yyyy-mm-dd)$#,##0.00)0.00%)Add方法保留格式)。StyleID 而不是逐个设置样式属性,减少内存占用。sourcePackage 和 mergedPackage 的作用域,避免内存泄漏。File1.xlsx)| A | B | C |
|---|---|---|
| 2023-01-01 | $100.00 | 50% |
| Product | Price | Qty |
File2.xlsx)| A | B | C |
|---|---|---|
| 2023-02-01 | $200.00 | 75% |
| Service | Fee | Count |
MergedExcel.xlsx)| A | B | C |
|---|---|---|
| 2023-01-01 | $100.00 | 50% |
| Product | Price | Qty |
| 2023-02-01 | $200.00 | 75% |
| Service | Fee | Count |
格式完全保留!
if (sourceSheet.Name == "Sales") // 只合并名为"Sales"的Sheet
{
// 合并逻辑
}
ExcelRange.LoadFromArrays 批量写入数据。mergedPackage.Workbook.CalcMode = ExcelCalcMode.Manual;
封装为.exe,支持参数输入:
ExcelMerger.exe -input "C:\Input" -output "C:\Output\Merged.xlsx"
如果需要进一步优化(如异步处理、更复杂格式),可以继续扩展!
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。