我浪费了很多时间来处理报告中的数据。使用数据透视表是一个好主意,但如何?我尝试了一些免费的PivotTable
课程,但他们缺少小计。
然后,另一种方法。对于我使用excel
的{{1}}报告输出。它还支持pivottable。问题是我们的一些客户没有办公室(OpenOffice,MicrosoftOffice等),因此只创建和保存EPPlus
文件不起作用。我可以使用xlsx
尝试的唯一方法是创建EPPlus
,填充包含数据的工作表,然后创建包含数据的ExcelPackage
。
我有几个问题;
1)从PivotTable
对象可以访问PivotTable
字段和值的输出。 (到目前为止我不能)。
2)与上述问题相关... PivotTable
文件是否包含有关xlsx
的数据或仅包含创建PivotTable
的规则(如表名,sourceRange, rowFields,columnFields,dataFields,aggregate options等)。我对此做了一个小测试。步骤如下:
实际上我的猜测是"数据透视表会根据新数据"更新,但我错了。它没有更新。这可能是" xlsx文件的证明,不仅包含数据透视表的规则,还包含它的所有值"。如果是这样,我希望在不保存文件的情况下访问该数据(我不需要任何办公程序)。
3)任何其他方法都表示赞赏。
提前致谢
答案 0 :(得分:5)
我绝不是EPPlus的专家,但过去几个月一直在使用它,希望能够解释你的问题。
如果在EEP中创建全新的xlsx,将数据添加到工作表,创建指向数据/工作表的数据透视表,并保存它 - 那么数据透视表不包含任何数据。它只包含在excel中打开文件时PT应如何切片数据的定义(正如您在一个问题中提到的那样)。
当您在excel中实际打开文件并保存IT 时,excel所做的是复制PT所依赖的所有数据并将其放入数据透视表缓存中。这就是为什么你可以删除包含数据的原始单元格,保存文件,然后在excel中重新打开它(可能必须解除一些错误),并仍然看到带有数据的PT。您甚至可以双击PT中的一个数据单元格,excel会将相关数据中的部分或全部(取决于您单击的单元格)重新生成到新工作表中。
是的,由于此数据透视表缓存,您的猜测实际上是错误的。您必须告诉excel更新正确的功能区中的数据源(假设数据仍在那里)以显示新数据。
因此,要访问数据,您可以通过进入PivotTable.WorkSheet对象并从中拉出数据来确定它所在的位置。您可以在我在此处创建的扩展方法中看到我是如何做到的:
Create Pivot Table Filters With EPPLUS
另一种选择是从xlsx中提取实际的worksheet.xml文件。 xlsx文件(以及任何其他MS Office。??? x文件)只是重命名的ZIP文件。因此,您可以使用标准.NET方法从zip中获取xml文件,并使用类似LinqToXml的内容来提取数据。所以像这样:
var zip = new ExcelPackage(file).Package;
var recordspart = zip.GetPart(new Uri("/xl/worksheets/sheet1.xml", UriKind.Relative));
var recordsxml = XDocument.Load(recordspart.GetStream());
它不会完全执行所有XML操作,但如果XLSX的最终格式不起作用,它可能是您的最佳选择。