当前位置: 首页 > 知识库问答 >
问题:

将多个Excel工作表合并为一个工作表

郑波
2023-03-14


我知道如何复制工作表,但这将导致多个工作表。我需要的是一个输出工作表,一个接一个地包含所有的工作表。

目前我正在做的是将每个工作表导出为< code>DataTable,然后逐个导入:

string[] files = { "Book1.xlsx", "Book2.xlsx", "Book3.xlsx" };

var destination = new ExcelFile();
var destinationSheet = destination.Worksheets.Add("Sheets");
int startRow = 0;

foreach (string file in files)
{
    var source = ExcelFile.Load(file);
    foreach (var sourceSheet in source.Worksheets)
    {
        var table = sourceSheet.CreateDataTable(new CreateDataTableOptions());
        destinationSheet.InsertDataTable(table, new InsertDataTableOptions() { StartRow = startRow });
        startRow += table.Rows.Count;
    }
}

destination.Save("Merged Output.xlsx");

但这样,我就失去了单元格样式和文本格式
有没有办法用DataTable保留样式?

共有1个答案

杜绍元
2023-03-14

编辑(2022-10-28):

在当前最新版本的geBox.电子表格中,还有另一组CellRange. CopyTo()重载方法,它们接受CopyOptions参数,您可以使用该参数指定要复制的内容。

例如,您可以指定还希望复制列宽和行高,如下所示:

range.CopyTo(destinationSheet, destinationSheet.Rows.Count, 0,
    new CopyOptions() { CopyTypes = CopyTypes.Default | CopyTypes.ColumnWidths | CopyTypes.RowHeights });

原件:

为此,您可以使用 CellRange.CopyTo 方法,如下所示:

string[] files = { "Book1.xlsx", "Book2.xlsx", "Book3.xlsx" };

var destination = new ExcelFile();
var destinationSheet = destination.Worksheets.Add("Sheets");

foreach (string file in files)
{
    var source = ExcelFile.Load(file);
    foreach (var sourceSheet in source.Worksheets)
    {
        var range = sourceSheet.GetUsedCellRange(true);
        range.CopyTo(destinationSheet, destinationSheet.Rows.Count, 0);
    }
}

destination.Save("Merged Output.xlsx");

请注意,CopyTo 将仅复制单元格的值和样式。

但如果需要,也可以使用类似的方法来复制列宽和行高。

string[] files = { "Book1.xlsx", "Book2.xlsx", "Book3.xlsx" };

var destination = new ExcelFile();
var destinationSheet = destination.Worksheets.Add("Sheets");

int lastColumn = 0;
foreach (string file in files)
{
    var source = ExcelFile.Load(file);
    foreach (var sourceSheet in source.Worksheets)
    {
        var range = sourceSheet.GetUsedCellRange(true);
        int startRow = destinationSheet.Rows.Count;
        range.CopyTo(destinationSheet, startRow, 0);

        for (int r = 0; r < range.Height; r++)
            destinationSheet.Rows[r + startRow].Height = sourceSheet.Rows[r].Height;

        for (; lastColumn < range.Width; lastColumn++)
            destinationSheet.Columns[lastColumn].Width = sourceSheet.Columns[lastColumn].Width;
    }
}

destination.Save("Merged Output.xlsx");

如果需要,你也可以用这个答案来复制图片。

您也可以使用相同的解决方案来复制形状和图表,它们都具有复制后需要调整的位置属性。

 类似资料:
  • 所以我有 1500 个 Excel 工作簿,每个工作簿都有 10 张结构完全相同的工作表。我尝试将多个Excel工作簿合并到一个文件中,并使用以下代码成功: 谢谢,努尔贝克

  • 我有一个Excel工作簿,其中包含36个不同的工作表,我每两周收到一次,工作表在所有标签上都有共同的标题,并且每个标签上都有不同的唯一标题,但每条记录都有一个唯一的ID,可以有多个记录。 我要做的是从所有的工作表中提取唯一的id,然后将每个工作表中的数据提取到一个工作表中,其中包含所有的公共标题和唯一标题。 我正在考虑使用下面帖子中的代码将其导入Access。连接表并将其导出回Excel中的一个工

  • 我有30张单独的工作表,需要合并成一张有多个选项卡的工作表。我可以使用下面的脚本来完成这项工作,但每次都会创建一个新的工作表。当30张单独的工作表中的一张或全部更新时,我只希望这个脚本更新或重写以前创建的“主工作表”。 我正在寻找一个表,其中包含从每个地区的标签。这将允许我与单独更新的所有信息共享一个主控表。

  • 我在同一个excel表中有3000个类似于这些表的表: PS:我只需要csv表中指定的信息

  • 本文向大家介绍Python将多个excel表格合并为一个表格,包括了Python将多个excel表格合并为一个表格的使用技巧和注意事项,需要的朋友参考一下 生活中经常会碰到多个excel表格汇总成一个表格的情况,比如你发放了一份表格让班级所有同学填写,而你负责将大家的结果合并成一个。诸如此类的问题有很多。除了人工将所有表格的内容一个一个复制到汇总表格里,那么如何用Python自动实现这些工作呢~

  • 然后另一个问题是工作簿的名称都不同,所有300个。是否有一个宏可以复制我打开的工作簿,而不是每次都输入实际的名称?