【问题标题】:EPPlus / How to get data from pivot table? Or how to manipulate data easily?EPPlus / 如何从数据透视表中获取数据?或者如何轻松操作数据?
【发布时间】:2014-10-02 06:21:02
【问题描述】:

我在处理报告中的数据上浪费了很多时间。使用数据透视表是个好主意,但如何?我尝试了一些免费的PivotTable 课程,但它们缺少小计。

然后,另一种方法。对于excel 的报告输出,我使用EPPlus。它还支持可旋转的。问题是我们的一些客户没有 Office(OpenOffice、MicrosoftOffice 等),因此仅创建和保存 xlsx 文件是行不通的。我可以尝试使用EPPlus 的唯一方法是创建一个ExcelPackage,用数据填充工作表,然后用数据创建一个PivotTable

我有几个问题;

1) 我可以从 PivotTable 对象访问 PivotTable 字段和值的输出。 (到现在我都做不到)。

2) 与上述问题相关... xlsx 文件是否包含有关 PivotTables 的数据或仅包含创建 PivotTable 的规则(如表名、sourceRange、rowFields、columnFields、dataFields、聚合选项等)。我对此做了一个小测试。步骤如下:

  • 打开了一个新的 excel 文件。
  • 插入了一些原始数据。
  • 使用数据创建了数据透视表。
  • 更改了一些数据值。 (不刷新数据透视表)
  • 保存并关闭文件。
  • 重新打开文件。

实际上我的猜测是“数据透视表会根据新数据进行更新”,但我错了。它没有更新。这可能是“xlsx 文件不仅包含数据透视表的规则,还包含它的所有值”的证明。如果是这样,我希望在不保存文件的情况下访问该数据(并且我不需要任何办公程序)。

3) 任何其他方法都值得赞赏。

提前致谢

【问题讨论】:

  • Excel 数据透视表适用于 OpenOffice 和 LibreOffice。

标签: c# excel epplus


【解决方案1】:

我绝不是 EPPlus 方面的专家,但我在过去几个月一直在使用它,希望能对您的问题有所了解。

如果您在 EEP 中创建全新的 xlsx,将数据添加到工作表,创建指向数据/工作表的数据透视表并保存 - 那么数据透视表不包含任何数据。它仅包含在 excel 中打开文件时 PT 如何对数据进行切片的定义(正如您在一个问题中提到的那样)。

当您实际在 excel 中打开文件并保存时,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 的最终格式不起作用,它可能是您的最佳选择。

【讨论】:

  • 感谢您的精彩回答。它消除了我的疑虑。在我发布问题后,我在Pivot Table Options 中看到了类似Save source data while saving the file 的内容。事实上,我有对象。我刚刚创建了 excel,希望能够使用数据透视表进行操作。如果它不是一个选项,正如你提到的,那么LinqToObjects 对我来说是一个不错的选择。
猜你喜欢
  • 2017-07-25
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 2011-08-02
  • 2017-09-04
  • 1970-01-01
  • 2019-10-11
相关资源
最近更新 更多