Как правильно обновить фильтры сводной таблицы в OpenXML, не нарушая сводную таблицу?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно обновить фильтры сводной таблицы в OpenXML, не нарушая сводную таблицу?

Сообщение Anonymous »

Я работаю над документом Excel с использованием OpenXML, и мне нужно программно обновить фильтры сводной таблицы. В частности, я хочу изменить фильтр, примененный к полю (например, «Пол»), чтобы отобразить «F» (женщина) и скрыть «M» (мужчина).
Ниже приведен код, который я использую, где я пытаюсь манипулировать SharedItems CacheField, соответствующим полю «Пол»:

Код: Выделить всё

[HttpPost("update-filter")]
public async Task UpdatePivotFilter()
{
if (!System.IO.File.Exists(_filePath))
return NotFound($"File not found: {_filePath}");

try
{
using (SpreadsheetDocument document = SpreadsheetDocument.Open(_filePath, true))
{
WorkbookPart workbookPart = document.WorkbookPart;
Sheet sheet = workbookPart.Workbook.Descendants().FirstOrDefault(s => s.Name == "PivotTableSheet");

if (sheet == null)
return BadRequest("Sheet not found.");

WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);
PivotTablePart pivotTablePart = worksheetPart.PivotTableParts.FirstOrDefault();

if (pivotTablePart == null)
return BadRequest("No PivotTable found in the sheet.");

PivotTableCacheDefinitionPart pivotCacheDefinitionPart = pivotTablePart.PivotTableCacheDefinitionPart;
var cacheFields = pivotCacheDefinitionPart.PivotCacheDefinition.CacheFields.Elements();

CacheField genderField = cacheFields.FirstOrDefault(f => f.Name == "Gender");

if (genderField == null)
return BadRequest("Field 'Gender' not found in the PivotTable.");

var sharedItems = genderField.SharedItems;

// Attempt to filter out "M" and keep "F"
for (int i = 0; i < sharedItems.Count; i++)
{
var item = sharedItems.ElementAt(i);

if (item.InnerText == "F")
{

//item.Val
}
else if (item.OuterXml.Contains("M"))
{
// Hide 'M'
item.Remove();
sharedItems.Count--;
i--;
}
}

pivotCacheDefinitionPart.PivotCacheDefinition.Save();
}

return Ok("PivotTable filter updated.");
}
catch (Exception ex)
{
return StatusCode(500, $"Error updating the filter: {ex.Message}");
}
}
Проблема:
Когда я удаляю элемент, соответствующий «M», из SharedItems, вся сводная таблица исчезает и остается только статические значения (числа). вместо исходной структуры сводной таблицы. Это происходит после удаления первого элемента из SharedItems.
Я использую Remove(), потому что не могу найти альтернативного метода или атрибута, похожего на «Скрыть», который позволил бы мне скрыть Значения «M», не удаляя их полностью. Я могу получить доступ к фильтрам и проверить значения полей, но в тот момент, когда я пытаюсь удалить или изменить любой элемент из SharedItems, структура сводной таблицы нарушается.
Любая помощь или предложения будут очень полезны. оценил.

Подробнее здесь: https://stackoverflow.com/questions/791 ... -the-pivot
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»