簡體   English   中英

如何在 C# 中使用 Microsoft.Office.Interop.Excel 添加數據透視表過濾器

[英]How to add pivot table filters with Microsoft.Office.Interop.Excel in C#

我基於 Excel (.xlsx) 文件創建了一個數據透視表。 該程序將字段添加到行、值和過濾器。 使用 PivotFilters.Add2 會導致 0x800a03ec 錯誤,從而終止程序。 如何正確使用PivotFilters.Add2

我嘗試對具有不同數據類型的不同字段進行過濾。 另外,我嘗試在未使用參數的地方使用Type.Missing 對於 VB,這種方法的信息似乎很多,但對於 C# 卻沒有那么多。

在過濾器中選擇的項目應該在最后一行的兩個日期之間。

    var xlApp = new Microsoft.Office.Interop.Excel.Application();
    xlApp.Visible = true;
    var workBook = xlApp.Workbooks.Open(spreadsheetLocation);
    var workSheet1 = (Microsoft.Office.Interop.Excel.Worksheet)workBook.Sheets["Data"];
    var workSheet2 = (Microsoft.Office.Interop.Excel.Worksheet)workBook.Sheets.Add();

    Microsoft.Office.Interop.Excel.Range last = workSheet1.Cells.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell, Type.Missing);
    Microsoft.Office.Interop.Excel.Range range = workSheet1.get_Range("A1", last);

    Microsoft.Office.Interop.Excel.PivotCaches pivotCaches = null;
    Microsoft.Office.Interop.Excel.PivotCache pivotCache = null;
    Microsoft.Office.Interop.Excel.PivotTable pivotTable = null;
    Microsoft.Office.Interop.Excel.PivotFields pivotFields = null;
    Microsoft.Office.Interop.Excel.PivotField filterField = null;
    Microsoft.Office.Interop.Excel.PivotField accNumField = null;
    Microsoft.Office.Interop.Excel.PivotField amountPaidField = null;

    pivotCaches = workBook.PivotCaches();
    pivotCache = pivotCaches.Create(XlPivotTableSourceType.xlDatabase, range);

    pivotTable = pivotCache.CreatePivotTable(workSheet2.Cells[1,1]);
    pivotFields = (Microsoft.Office.Interop.Excel.PivotFields)pivotTable.PivotFields();
    amountPaidField = (Microsoft.Office.Interop.Excel.PivotField)pivotFields.Item("AmountPaid");
    amountPaidField.Orientation = Microsoft.Office.Interop.Excel.XlPivotFieldOrientation.xlDataField;
    amountPaidField.NumberFormat = "$#,###,###.00";

    accNumField = (Microsoft.Office.Interop.Excel.PivotField)pivotFields.Item("AccNumber");
    accNumField.Orientation = Microsoft.Office.Interop.Excel.XlPivotFieldOrientation.xlRowField;

    filterField = (Microsoft.Office.Interop.Excel.PivotField)pivotFields.Item("AccDate");
    filterField.Orientation = Microsoft.Office.Interop.Excel.XlPivotFieldOrientation.xlPageField;
    filterField.EnableMultiplePageItems = true;
    filterField.PivotFilters.Add2(XlPivotFilterType.xlDateBetween, Type.Missing, DateTime.Now.AddDays(-30), DateTime.Now.AddDays(-20));
  #First it deletes two rows and then it creates a pivot table#
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Microsoft.Office.Interop.Excel;
    
    
    namespace ConsoleApplication4
    {
        class Program
        {
            public static string Column(int column)
            {
                column--;
                if (column >= 0 && column < 26)
                    return ((char)('A' + column)).ToString();
                else if (column > 25)
                    return Column(column / 26) + Column(column % 26 + 1);
                else
                    throw new Exception("Invalid Column #" + (column + 1).ToString());
            }
    
            static void Main(string[] args)
    
            {
               
    
                try
                {
                    string path = @"C:\Users\UX155512\Documents\Book1fd.xlsx";
                    var excelFile = new Application();
                    Workbook workBook = excelFile.Workbooks.Open(path);
                    Worksheet workSheet = workBook.Worksheets[1];
                    Worksheet pivotSheet = workBook.Worksheets.Add(
                        System.Reflection.Missing.Value,
                        workBook.Worksheets[workBook.Worksheets.Count],
                        1,
                        System.Reflection.Missing.Value);
    
    
    
    
                    Range last = workSheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell, Type.Missing);
                    int lastRow = last.Row;
                    int lastCol = last.Column;
                    string lastColVal = Column(lastCol);
                    string lastFilledCol = lastColVal + lastRow.ToString();
                    Console.WriteLine(lastFilledCol);
                    Console.WriteLine(lastColVal);
                  
                    Console.WriteLine(lastRow);
                    Console.WriteLine(lastCol);
    
                   
                    for (int i = 1; i <= lastRow; i++)
                    {
                        if (workSheet.Cells[1][i].Value == ("HDR"))
                        {
                            workSheet.Rows[i].Delete();
                            Console.WriteLine("The Row Containing HDR has been deleted");
                        }
                        if (workSheet.Cells[1][i].Value == ("TRL"))
                        {
                            workSheet.Rows[i].Delete();
                            Console.WriteLine("The Row Containing TLR has been deleted");
                        }
    
                    }
    
    
                   
                    Range lastRange = workSheet.Range["A1", lastFilledCol];
    
                    
    
                    
                    pivotSheet.Name = "Pivot Table";
                   
                    Range range = pivotSheet.Cells[1, 1];
                    PivotCache pivotCache = (PivotCache)workBook.PivotCaches().Add(XlPivotTableSourceType.xlDatabase, lastRange);
                    PivotTable pivotTable = (PivotTable)pivotSheet.PivotTables().Add(PivotCache: pivotCache, TableDestination: range);
                    PivotField pivotField = (PivotField)pivotTable.PivotFields("Plan Number");
                    pivotField.Orientation = XlPivotFieldOrientation.xlRowField;
    
                    PivotField pivotField2 = (PivotField)pivotTable.PivotFields("Source");
                    pivotField2.Orientation = XlPivotFieldOrientation.xlColumnField;
    
                    PivotField pivotField3 = (PivotField)pivotTable.PivotFields("Total");
                    pivotField3.Orientation = XlPivotFieldOrientation.xlDataField;
                    pivotField3.Function = XlConsolidationFunction.xlSum;
                   
    
                 
                    workBook.SaveAs(@"C:\Users\UX155512\Documents\Excel Dump\Trial9.xlsx");
                    workBook.Close();
                    
    
                   
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex);
                   
                }
    
                Console.Read();
            }
        }
    }

正如 Asger 上面提到的,過濾器不能添加到頁面字段。 相反,必須設置數據透視項的可見性屬性。

var pivotItems = filterField.PivotItems();
DateTime date = Convert.ToDateTime(item.Name);
foreach (var item in pivotItems)
{
    item.Visible = false;
    if (date < DateTime.Now.AddDays(-30) || date > DateTime.Now.AddDays(-20))
    {
        item.Visible = true;
    }
}

找到幾乎所有互操作問題的答案的最佳方法是記錄一個宏,然后檢查源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM