使用 Excel Interop C# 过滤掉枢轴 table 中的(空白)行

Filter out (blank) row in pivot table with Excel Interop C#

我有一个 excel,其中包含三个工作表、原始数据、数据透视表 table 和数据透视图。 由于原始数据会被行数未知的代码更新,所以我选择整列作为数据源。刷新数据透视表 table 时,它总是会在原始数据中得到一些空行,因此数据透视表 table 中会有一个(空白)行。

我想过滤掉同一程序中的(空白)行。到目前为止,我已经阅读了 excel 文件,但我不知道如何只过滤(空白)行,谢谢。

        Application exApp = new Application();
        Workbook exWbk = exApp.Workbooks.Open(targetPath);
        PivotTable pivotTb = exWbk.Sheets[1].pivotWorkSheet.PivotTables("Report");
  1. 将原始数据设为Table而不是标准范围。单击数据内的任意位置,然后在功能区的 "Insert" 选项卡中,select "Table," 和 Excel 将自动将您的范围变成 table。

A Table 与范围相比有很多优势,其中最重要的一点是它会在添加或删除行时自动调整大小。如果您的自动刷新以某种方式 而不是 删除行(只是内容),则可以通过这样的方式解决(假设 "Table1" 是您的 Table 的名称) :

Excel.ListObject lo = exWbk.Worksheets["Sheet1"].ListObjects["Table1"];
foreach (Excel.ListRow rw in lo.ListRows)
{
    if (exApp.WorksheetFunction.CountA(rw.Range) == 0)
        rw.Delete();
}
  1. 将数据透视表 table 的数据源更改为 Table(在 Excel 内 -- 永久)。这应该省略任何空白行。

  2. 刷新你的数据透视表table:

    pivotTb.RefreshTable();

如果您真的不想将范围转换为 table,那么我建议您动态修改数据透视表的源数据 table。

下面是一个示例,说明如何动态更改枢轴 table 的范围,使用 A1:C8 作为示例范围:

Excel.Range r = exWbk.Worksheets["Sheet1"].Range["A1:C8"];
Excel.PivotCache pc = exWbk.PivotCaches().Create(
    Excel.XlPivotTableSourceType.xlDatabase, r);
pivotTb.ChangePivotCache(pc);
pivotTb.RefreshTable();

不乏关于如何定义使用范围的建议,但以防万一你没有办法:

How to get the range of occupied cells in excel sheet