Как добавить фильтры сводной таблицы с Microsoft.Office.Interop.Excel в C # - PullRequest
1 голос
/ 08 июня 2019

Я создаю сводную таблицу на основе файла 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));

1 Ответ

1 голос
/ 10 июня 2019

Как упомянуто выше Асгером, фильтр не может быть добавлен в поле страницы.Вместо этого должно быть установлено свойство видимости сводного элемента.

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;
    }
}
...