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

使用C#将多个Worksheets合并为单个Worksheet

使用C#合并多个Excel工作表到单个工作表

下面提供两种主流类库的实现方案,都是实际项目中常用的:

方案一:使用EPPlus类库

EPPlus是操作Excel的热门类库,适合处理.xlsx格式文件。

步骤说明

  • 安装EPPlus包:在NuGet包管理器中搜索并安装EPPlus
  • 核心逻辑:遍历目标工作簿的所有工作表,将每个工作表的数据(仅第一个表保留表头)复制到新工作表中

代码示例

using OfficeOpenXml;
using System.IO;

class ExcelMerger
{
    static void MergeWorksheets(string sourceFilePath, string outputFilePath)
    {
        // EPPlus 5+版本需设置许可证上下文(非商业使用)
        ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

        using (var package = new ExcelPackage(new FileInfo(sourceFilePath)))
        {
            var mergedWorksheet = package.Workbook.Worksheets.Add("合并结果");
            int currentRow = 1;

            foreach (var worksheet in package.Workbook.Worksheets)
            {
                int rowCount = worksheet.Dimension?.Rows ?? 0;
                int colCount = worksheet.Dimension?.Columns ?? 0;

                if (rowCount == 0) continue;

                // 第一个工作表保留表头
                if (currentRow == 1)
                {
                    worksheet.Cells[1, 1, 1, colCount].Copy(mergedWorksheet.Cells[currentRow, 1]);
                    currentRow++;
                }

                // 复制数据行(从第2行开始)
                worksheet.Cells[2, 1, rowCount, colCount].Copy(mergedWorksheet.Cells[currentRow, 1]);
                currentRow += rowCount - 1;
            }

            package.SaveAs(new FileInfo(outputFilePath));
        }
    }

    // 调用示例
    static void Main()
    {
        MergeWorksheets(@"C:\source.xlsx", @"C:\merged.xlsx");
    }
}

方案二:使用NPOI类库

NPOI是免费开源类库,支持.xls和.xlsx格式,适合兼容旧版本Excel的场景。

步骤说明

  • 安装NPOI包:在NuGet包管理器中搜索并安装NPOI和NPOI.OOXML
  • 核心逻辑:逐行读取各工作表数据,写入合并工作表,避免表头重复

代码示例

using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;

class ExcelMerger
{
    static void MergeWorksheets(string sourceFilePath, string outputFilePath)
    {
        using (var fs = new FileStream(sourceFilePath, FileMode.Open, FileAccess.Read))
        {
            var workbook = new XSSFWorkbook(fs);
            var mergedSheet = workbook.CreateSheet("合并结果");
            int currentRowNum = 0;
            bool isFirstSheet = true;

            foreach (ISheet sheet in workbook)
            {
                int rowCount = sheet.LastRowNum;
                if (rowCount < 0) continue;

                // 第一个工作表写入表头
                if (isFirstSheet)
                {
                    var headerRow = sheet.GetRow(0);
                    if (headerRow != null)
                    {
                        var newRow = mergedSheet.CreateRow(currentRowNum++);
                        CopyRow(headerRow, newRow);
                    }
                    isFirstSheet = false;
                }

                // 写入数据行
                for (int i = 1; i <= rowCount; i++)
                {
                    var sourceRow = sheet.GetRow(i);
                    if (sourceRow == null) continue;

                    var newRow = mergedSheet.CreateRow(currentRowNum++);
                    CopyRow(sourceRow, newRow);
                }
            }

            // 自动调整列宽
            for (int i = 0; i < mergedSheet.GetRow(0).LastCellNum; i++)
            {
                mergedSheet.AutoSizeColumn(i);
            }

            // 保存合并后的文件
            using (var outputFs = new FileStream(outputFilePath, FileMode.Create, FileAccess.Write))
            {
                workbook.Write(outputFs);
            }
        }
    }

    // 辅助方法:复制行数据及样式
    static void CopyRow(IRow sourceRow, IRow targetRow)
    {
        targetRow.Height = sourceRow.Height;
        for (int i = sourceRow.FirstCellNum; i < sourceRow.LastCellNum; i++)
        {
            var sourceCell = sourceRow.GetCell(i);
            var targetCell = targetRow.CreateCell(i);

            if (sourceCell != null)
            {
                targetCell.CellStyle = sourceCell.CellStyle;
                switch (sourceCell.CellType)
                {
                    case CellType.String:
                        targetCell.SetCellValue(sourceCell.StringCellValue);
                        break;
                    case CellType.Numeric:
                        targetCell.SetCellValue(sourceCell.NumericCellValue);
                        break;
                    case CellType.Boolean:
                        targetCell.SetCellValue(sourceCell.BooleanCellValue);
                        break;
                    case CellType.Formula:
                        targetCell.SetCellFormula(sourceCell.CellFormula);
                        break;
                    default:
                        targetCell.SetCellValue(sourceCell.StringCellValue);
                        break;
                }
            }
        }
    }

    // 调用示例
    static void Main()
    {
        MergeWorksheets(@"C:\source.xlsx", @"C:\merged.xlsx");
    }
}

注意事项

  • 若处理.xls格式文件,NPOI方案需替换XSSFWorkbook为HSSFWorkbook,并引用NPOI.HSSF.UserModel
  • 处理超大Excel文件时,建议优化为逐行流式读写,避免内存占用过高
  • EPPlus商业使用需购买授权,非商业使用可免费

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:45:35