Excel互操作和DataField方向

时间:2014-02-28 13:51:04

标签: c# excel interop pivot-table

我正在编写一个C#程序,它打开并读取一个Excel文档并创建一个带有一些字段的数据透视表。添加了一个以Rows为导向的字段。其余的是计算数据字段。一切正常,数据添加正常。只有一个问题。计算的数据字段也作为行添加,但我希望将它们作为列。在Excel中,手动执行此操作意味着将值从行拖动到列。但是,我如何以编程方式实现相同的目标?

我的代码:

 Excel.PivotTable pivot1 = xlSheet.PivotTableWizard(
                 Excel.XlPivotTableSourceType.xlDatabase, // source type
                 pivotRange, // source
                 xlSheet.get_Range(Constants.PLACE_PIVOT_1), //destination
                 "Grade", // table name 
                 false,
                 false,
                 true,
                 false,
                 missing,
                 missing,
                 false,
                 false,
                 Excel.XlOrder.xlDownThenOver,
                 missing,
                 missing,
                 missing);

            Excel.PivotField betygField =
                (Excel.PivotField)pivot1.PivotFields("Grade type");
            betygField.Orientation =
                Excel.XlPivotFieldOrientation.xlRowField;
            betygField.Position = 1;

            // int dataIndex = 2;
            for (int f = Constants.START_START_SAMMAN; f < columns; f++) //add some array of columns as DataFields
            {
                string name = Convert.ToString(xlSheet.Cells[Constants.BEGIN_STAT_SAMMAN_Y, f].Value);

                Excel.PivotField f1 = pivot1.AddDataField((Excel.PivotField)pivot1.PivotFields(name),
                    String.Format("Sume of {0}", name), Excel.XlConsolidationFunction.xlSum);
                Excel.PivotField f2 = pivot1.AddDataField((Excel.PivotField)pivot1.PivotFields(name),
                    String.Format("Avg. of {0}", name), Excel.XlConsolidationFunction.xlAverage);

                f1.Orientation =
                Excel.XlPivotFieldOrientation.xlDataField;
                f1.NumberFormat = "0.00";

                f2.Orientation =
                Excel.XlPivotFieldOrientation.xlDataField;
                f2.NumberFormat = "0.00";
            }

            pivot1.GrandTotalName = "Totalt";
            pivot1.RowGrand = true;
            pivot1.ColumnGrand = true;
            pivot1.TableStyle2 = "PivotStyleLight16";

1 个答案:

答案 0 :(得分:4)

你可能已经知道这个伎俩......

如果您知道如何直接在Excel中执行某些操作并且希望以编程方式实现相同的操作,则可以充分利用宏录制器(在开发人员工具中,请参见第一个屏幕截图)。之后,你必须使用互操作Excel将VBA宏转换为C#,但如果你知道一点VB应该不难。

How to find the macro recorder

然后,对于您的问题,我记录了将列字段拖放到行部分的操作。感谢宏记录,您可以通过选择目标字段对象并更改其属性 Orientation Position 来实现这一目标。

The drag and drop action

The recorded macro