将多个 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
属性 需要在复制后进行调整。
我正在使用 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
属性 需要在复制后进行调整。