如何防止为数据透视表(C#/ Excel Interop)生成Total和Grand Total行?

时间:2016-07-25 21:53:28

标签: c# excel-interop

我有一个类似的数据透视表:

enter image description here

但请注意,它运动的是" Total"每一行"真实"行;另外," Grand Total"排在最后。这些都是多余的 - 这些数据不需要总计。

我想也许是因为我需要更改传递给PivotTableWizard方法的一个args" true"为了假,我发现this documentation for it并且认为修复将是将第五和第六个args的val从true更改为false,如下所示:

 _xlBook.PivotTableWizard(
        Excel.XlPivotTableSourceType.xlDatabase,
        pivotData,
        pivotDestination,
        pivotTableName,
        false, //true,
        false, //true,
        true,
        true,
        useDefault,
        useDefault,
        false,
        false,
        Excel.XlOrder.xlDownThenOver,
        0,
        useDefault,
        useDefault
);

......但它没有任何区别 - 我仍然得到那些流氓/虚假的" Total"行。

如何防止生成/显示Totals行?

更新

This MS page具体表明设置" RowGrand" arg为true将显示行的总计,以及下一个arg," ColumnGrand"同样的设计。

然而,像我一样将这些val设置为false:

static readonly object useDefault = Type.Missing;
string pivotTableName = @"Pivot Test";
. . .
pivotData = _xlSheet.Range["A1:D25"];
pivotDestination = _xlSheet.Range["F7", useDefault];
_xlBook.PivotTableWizard(
        Excel.XlPivotTableSourceType.xlDatabase, // SourceType
        pivotData,                               // SourceData
        pivotDestination,                        // TableDestination
        pivotTableName,                          // TableName
        false, //true,                           // RowGrand
        false, //true,                           // ColumnGrand
        true,                                    // SaveData
        true,                                    // HasAutoFormat
        useDefault,                              // AutoPage
        useDefault,                              // Reserved
        false,                                   // BackgroundQuery
        false,                                   // OptimizeCache
        Excel.XlOrder.xlDownThenOver,            // PageFieldOrder
        0,                                       // PageFieldWrapCount
        useDefault,                              // ReadData
        useDefault                               // Connection
);

...没有区别 - 数据透视表仍显示不需要的总数 - ISIS在这里发生了什么?

更新2

我使用MS帖子here作为基础改变了一点,并想出了这个:

private void GeneratePivotTableOnSheet2()
{
    // Select a range of data for the Pivot Table.
    pivotData = _xlSheet.get_Range("A1", "D25");

    // Select location of the Pivot Table.
    pivotDestination = _xlSheet.get_Range("A32", useDefault);

    // Add a Pivot Table to the Worksheet.
    _xlBook.PivotTableWizard(
        Excel.XlPivotTableSourceType.xlDatabase,
        pivotData,
        pivotDestination,
        pivotTableName2,
        true,
        true,
        true,
        true,
        useDefault,
        useDefault,
        false,
        false,
        Excel.XlOrder.xlDownThenOver,
        0,
        useDefault,
        useDefault
        );

    // Set variables for used to manipulate the Pivot Table.
    pivotTable =
        (Excel.PivotTable)_xlSheet.PivotTables(pivotTableName2);
    titlePivotField = ((Excel.PivotField)pivotTable.PivotFields(1));
    authorPivotField = ((Excel.PivotField)pivotTable.PivotFields(2));
    //pubyearPivotField = ((Excel.PivotField)pivotTable.PivotFields(3));

    // Format the Pivot Table.
    pivotTable.Format(Excel.XlPivotFormatType.xlReport2);
    pivotTable.InGridDropZones = false;

    // Set Sales Region as a Row Field.
    titlePivotField.Orientation =
        Excel.XlPivotFieldOrientation.xlRowField;
    authorPivotField.Orientation =
        Excel.XlPivotFieldOrientation.xlRowField;
    //pubyearPivotField.Orientation =
    //    Excel.XlPivotFieldOrientation.xlRowField;

    _xlSheet.Columns.AutoFit();

    Directory.CreateDirectory(PivotTablePracticeConstsAndUtils.OUTPUT_DIRECTORY);
    String _uniqueFolder = PivotTablePracticeConstsAndUtils.OUTPUT_DIRECTORY;
    string filename = String.Format("{0}\\TwainBooks.xlsx", _uniqueFolder);
    if (File.Exists(filename))
    {
        File.Delete(filename);
    }

    _xlBook.SaveAs(filename, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

    MessageBox.Show("File has been written");
}

有了这个,结果有点有希望,但仍然令人困惑;这就是原因:

如果我声明两个PivotFields(标题和作者),然后通过选择生成的电子表格上的复选框选择第三个(发布年份),然后过滤其中一个值,数据将显示在数据透视表中。在此之前,只显示列标题 - 我必须手动检查" pub year" AND过滤数据(不保留列默认选择的" All"值)以查看任何数据。

它应该显示来自git-go的所有数据,正确(所有"所有" s)?

然后为什么要添加" pub year" PivotField在手动完成时工作(有点),但是如果我尝试以编程方式添加它(上面代码中已注释掉的" pubyearPivotField"行),它不会?!?

IOW和总结:很多持续不断的刺激,但还没有珍珠。

更新3

这绝对比Goofy和Barney Feif连接起来更加愚蠢:使用代码将Author PivotField设置为Page类型,Title和YearPublished设置为Row Type,打开工作表时数据透视表中不会显示任何数据。

但是,如果我取消选中"年份发布"然后重新检查它(从git-go检查)数据显示。

所以这显然是一个Excel Interop错误;但有没有办法以编程方式取消选中,然后检查该字段?

更新4

我也尝试了这个:

pubyearPivotField.EnableItemSelection = false;
pubyearPivotField.EnableItemSelection = true;

......但它没有用。

更新5

因此,当我取消选中时,我想要记录一个发生了什么的宏,然后重新检查" YEAR PUBLISHED"复选框。

这是记录的内容:

Sub MacroUncheckCheckPTField()
'
' MacroUncheckCheckPTField Macro
'

'
    ActiveSheet.PivotTables("PivotTest3").PivotFields("Sum of YEAR PUBLISHED"). _
        Orientation = xlHidden
    ActiveSheet.PivotTables("PivotTest3").AddDataField ActiveSheet.PivotTables( _
        "PivotTest3").PivotFields("YEAR PUBLISHED"), "Sum of YEAR PUBLISHED", xlSum
End Sub

我不知道为什么"总和"是其中的一部分。我没有设置数据字段;有一个(假的/不需要的)" Grand Total"数据透视表底部的行总结了一年(当然,没有任何意义/没有价值)。

但我不知道如何处理该宏 - 也就是说,如何将其转换为C#。

当我尝试here时,我得到了" 转换错误:代码无法转换。细节: - 第1行第1列:预期的EOF 请检查原始代码中的任何错误,然后重试。"

是的,那是" VB"而不是" VBA"但我认为值得一试。

我在表格中所做的全部(手动)首先取消选中" Year Published"复选框,然后重新检查;这就是使数据显示在数据透视表中所需的全部内容。这就是它的样子:

enter image description here

我试过这个(设置只允许在PageFields上使用CurrentPage val):

authorPivotField.CurrentPage = "(All)";

......但没有任何区别。

更新6

我尝试将此作为宏的VBA到C#转换:

_xlSheet.PivotTables("PivotTest3").PivotFields("Sum of YEAR PUBLISHED")._Orientation = Excel.XlPivotFieldOrientation.xlHidden;
_xlSheet.PivotTables("PivotTest3").AddDataField(_xlSheet.PivotTables("PivotTest3")
    .PivotFields("YEAR PUBLISHED"), "Sum of YEAR PUBLISHED", Excel.XlConsolidationFunction.xlSum);

...但是这会爆发:" 无法获取数据透视表类的PivotFields属性"

更新7

因此,对于我的思维方式,Excel Interop数据透视表代码的工作方式存在的问题之一就是各种字段类型的命名,这对我来说似乎有误导性,或者至多不是最优的。

Excel.XlPivotFieldOrientation的可能值为:

xlColumnField
xlDataField
xlHiddenField
xlPageField
xlRowField

在这些国家,这些人做了什么/他们如何区别,每个人都来自弟兄们?从给予他们的基督徒名字来看,并不总是显而易见的。我建议将这些替代品作为一种更好地理解他们存在理由的方式:

xlColumnField = xlDisplayField (in my tests, I see no difference between this and xlRowField)
xlDataField = xlCalculatedField (it is a data field, but aren't they all?)
xlHiddenField = xlInitiallyHidden (it is available in the checkbox list, and checking it will visiblize it)
xlPageField = xlFilterField
xlRowField = xlDisplayField (in my tests, I see no difference between this and xlColumnField)

1 个答案:

答案 0 :(得分:0)

这绝不是完美的(数据透视表中没有数据显示,直到我首先取消选中,然后重新检查,“”对话框中的“Year Published”复选框),但它确实回答了问题(消除了总行数) ):

// Select a range of data for the Pivot Table.
pivotData = _xlSheet.get_Range("A1", "D25");

// Select location of the Pivot Table.
pivotDestination = _xlSheet.get_Range("A30", useDefault);

// Add a Pivot Table to the Worksheet.
_xlBook.PivotTableWizard(
    Excel.XlPivotTableSourceType.xlDatabase,
    pivotData,
    pivotDestination,
    pivotTableName3,
    true,
    true,
    true,
    true,
    useDefault,
    useDefault,
    false,
    false,
    Excel.XlOrder.xlDownThenOver,
    0,
    useDefault,
    useDefault
    );

// Set variables for used to manipulate the Pivot Table.
pivotTable =
    (Excel.PivotTable)_xlSheet.PivotTables(pivotTableName3);
titlePivotField = ((Excel.PivotField)pivotTable.PivotFields(1));
authorPivotField = ((Excel.PivotField)pivotTable.PivotFields(2));
pubyearPivotField = ((Excel.PivotField)pivotTable.PivotFields(3));
statusPivotField = ((Excel.PivotField)pivotTable.PivotFields(4));

// Format the Pivot Table.
pivotTable.Format(Excel.XlPivotFormatType.xlReport2);
pivotTable.InGridDropZones = false;

// Set Page Field
authorPivotField.Orientation =
    Excel.XlPivotFieldOrientation.xlPageField;

// Set Row Field[s]
titlePivotField.Orientation =
    Excel.XlPivotFieldOrientation.xlRowField;
pubyearPivotField.Orientation =
    Excel.XlPivotFieldOrientation.xlRowField;
statusPivotField.Orientation =
    Excel.XlPivotFieldOrientation.xlHidden;

authorPivotField.CurrentPage = "(All)";

_xlSheet.Columns.AutoFit();

为什么它确实起作用(特别是因为传递给PivotTableWizard的两个“总计”参数是“真实的”),我不会理解,但是......