65.9K
CodeProject 正在变化。 阅读更多。
Home

如何使用 Excel Interop 和 C# 向电子表格添加透视表

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.58/5 (8投票s)

2016年6月21日

CPOL

3分钟阅读

viewsIcon

39619

使用 Excel Interop 和 C#,将数据透视表添加到基于电子表格中现有数据的 Excel 表格中的最直接方法。

数据透视操作

在 Excel 中使用数据透视表非常关键;它们允许您从侧面、由内而外和向后查看数据。我不确切知道这意味着什么,但了解如何创建数据透视表有时会派上用场,尤其是在您的雇主或客户要求使用数据透视表时。因此有了这个技巧。

以下技巧假定您已经拥有创建 Excel 电子表格并将数据放置在其上的代码。此技巧仅显示如何使用表格上的现有数据。 那么事不宜迟,以下是您需要执行的操作

添加一些声明(这假定您具有以下 using 子句:“using Excel = Microsoft.Office.Interop.Excel;"

static readonly object useDefault = Type.Missing;
PivotTable pivotTable;
Range pivotData;
Range pivotDestination;
PivotField descriptionPivotField;
PivotField shortnamePivotField;
PivotField itemcodePivotField;
PivotField pricePivotField;
string pivotTableName = @"SupercalifornialisticXPalbeauxdacious";

PivotField 将根据您的数据而有所不同 - 不仅是它们的名称(您不太可能将它们命名为 “shortnamePivotField” 和 “itemcodePivotField” 等),而且您想要的 PivotField 的数量也可能有所不同。

血腥的细节

现在编写必要的代码,以基于表格上的现有数据创建数据透视表

private void AddPivotTable()
{
    pivotData = _xlSheet.Range["A1:K1600"];
    pivotDestination = _xlSheet.Range["A1605", useDefault];
    _xlBook.PivotTableWizard(
            XlPivotTableSourceType.xlDatabase,
            pivotData,
            pivotDestination,
            pivotTableName,
            true,
            true,
            true,
            true,
            useDefault,
            useDefault,
            false,
            false,
            XlOrder.xlDownThenOver,
            0,
            useDefault,
            useDefault
    );

    // Set variables used to manipulate the Pivot Table.
    pivotTable = (PivotTable)_xlSheet.PivotTables(pivotTableName);
    
    shortnamePivotField = (PivotField)pivotTable.PivotFields(2);
    itemcodePivotField = (PivotField)pivotTable.PivotFields(3);
    descriptionPivotField = (PivotField)pivotTable.PivotFields(4);
    pricePivotField = (PivotField)pivotTable.PivotFields(7);

    // Format the Pivot Table.
    pivotTable.Format(XlPivotFormatType.xlReport2);
    pivotTable.InGridDropZones = false;
    pivotTable.SmallGrid = false;
    pivotTable.ShowTableStyleRowStripes = true;
    pivotTable.TableStyle2 = "PivotStyleLight1";

    // Page Field
    shortnamePivotField.Orientation = XlPivotFieldOrientation.xlPageField;
    shortnamePivotField.Position = 1;
    shortnamePivotField.CurrentPage = "(All)";
    
    // Row Fields
    descriptionPivotField.Orientation = XlPivotFieldOrientation.xlRowField;
    descriptionPivotField.Position = 1;
    itemcodePivotField.Orientation = XlPivotFieldOrientation.xlRowField;
    itemcodePivotField.Position = 2;

    // Data Field
    pricePivotField.Orientation = XlPivotFieldOrientation.xlDataField;
    pricePivotField.Function = XlConsolidationFunction.xlSum;
}

当然,必须保存表格,但假设已经在其他地方执行了此操作。

如您所见,上面的代码引用了 pivotData 值的硬编码数据范围(“A1:K1600”);您需要一个不同的范围,并且可能希望避免硬编码这些值,因为数据量可能会因易失性数据而异。pivotDestination 也是如此(上面显示的行值为 “A1605”),它在数据范围和数据透视表之间留下一行空行。同样,如果您的主数据范围是易失性的,您将不希望使用常量值对其进行硬编码。

当然,您需要在依赖数据写入表格后从代码中调用 AddPivotTable()

结果

对于上面显示的代码,这就是结果 - 绝不是完美的,但这是一个坚实的起点

...这是页面字段(简称)已下拉,准备好进行过滤的情况

放弃坏脾气的家伙

最后,将您使用的对象设置为 null

shortnamePivotField = null;
itemcodePivotField = null;
descriptionPivotField = null;
pivotDestination = null;
pivotData = null;
pivotTable = null;

关于 XlPivotField"Orientation" 值的说明

依我看,Excel Interop PivotTable 代码工作方式的问题之一是各种字段类型的命名,这似乎具有误导性,或者充其量并非最佳。

Excel.XlPivotFieldOrientation 的可能值(按字母顺序排列)为

  • xlColumnField
  • xlDataField
  • xlHiddenField
  • xlPageField
  • xlRowField

这些做什么/它们之间有何不同?从给定的名字来看,它并不总是很明显。我建议使用以下替换方式来更好地理解它们的raison d'etre

  • xlColumnField = xlDisplayField(在我的测试中,我没有看到它与 xlRowField 有任何区别)
  • xlDataField = xlCalculatedField(它确实是一个数据字段,但它们不都是吗?)
  • xlHiddenField = xlInitiallyHidden(它在复选框列表中可用,选中它将使其可见)
  • xlPageField = xlFilterField
  • xlRowField = xlDisplayField(在我的测试中,我没有看到它与 xlColumnField 有任何区别)

正如 Vonnegut 所说,“事情就是这样”

此技巧应该足以生成数据透视表;从那里,您可以调整和扭曲并扭转它以满足您的特定需求。

注意:此代码改编自文章“在 Excel 2007 中创建数据透视表”,可以在此处找到。

© . All rights reserved.