将多个 Excel sheet 合并为一个 sheet

Merge multiple Excel sheets into one sheet

我正在使用 GemBox.Spreadsheet 处理一些 Excel 个文件,现在我需要将它们与一个 sheet.
合并为一个文件 我知道如何做 sheets copying,但这会导致多个 sheet。我需要的是一个输出 sheet,它将包含所有这些,一个接一个。

目前我正在做的是将每个 sheet 导出为 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 的样式吗?

为此,您可以使用 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");

此外,如果需要,您也可以使用 复制图像。

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