在处理带有数据透视表的Excel表格时,建议采用以下步骤:
将原始Excel文件读取到MemoryStream流中。
使用EPPlus打开MemoryStream流并读取原始工作簿中的数据。
在新的Excel工作簿中创建一个新的工作表。
将原始工作簿中的工作表复制到新的工作表。
在新的工作表中创建一个新的PivotTable对象。
从Original PivotTable中获取PivotTable的数据。
将数据复制到New PivotTable对象。
下面是使用C#代码的示例:
// 读取Excel文件到MemoryStream
MemoryStream stream = new MemoryStream(File.ReadAllBytes("orig_file.xlsx"));
// 使用EPPlus打开MemoryStream
using (var excel_pkg = new ExcelPackage(stream))
// 读取原始工作簿中的数据
var orig_workbook = excel_pkg.Workbook;
// 在新的工作簿中创建一个新的工作表
ExcelWorksheet new_worksheet = excel_pkg.Workbook.Worksheets.Add("New Sheet");
// 将原始工作簿中的工作表复制到新的工作表
ExcelWorksheet orig_worksheet = orig_workbook.Worksheets["Original Sheet"];
new_worksheet.Cells["A1"].LoadFromDataTable(orig_worksheet.Cells["A1"].Value as DataTable, true);
// 在新的工作表中创建一个新的PivotTable对象
var new_pivot_table = new_worksheet.PivotTables.Add(new_worksheet.Cells["N1"], new_worksheet.Cells["N1"], "New Pivot Table");
// 获取原始PivotTable对象的数据
var orig_pivot_table = orig_worksheet.PivotTables["Original Pivot Table"];
var data_fields = orig_pivot_table.DataFields.Select(x => x.SourceName).ToArray();
var row_fields = orig_pivot_table.RowFields.Select(x => x.SourceName).ToArray();
var col_fields = orig_pivot_table.ColumnFields.Select(x => x.SourceName).ToArray();
var filter_fields = orig_pivot_table.PageFields.Select(x => x.SourceName).ToArray();
// 复制数据到新的PivotTable对象
new_pivot_table.DataFields.Add(data_fields[0]);
new_pivot_table.RowFields.Add(row_fields[0]);
new_pivot_table.ColumnFields.Add(col