При написании инструмента для экспорта наборов результатов в Excel я столкнулся с одной проблемой. Я успешно создаю таблицы с форматированием и фильтрами в заголовках столбцов, без проблем. Проблема в том, что я не могу понять, как заставить полные ряды «работать». Я хочу использовать истинные полные строки, чтобы они отвечали на применяемые фильтры, но до сих пор я могу либо получить строку с промежуточными итогами, которые функционируют, но не являются частью таблицы, или я могу получить пустую промежуточную строку.Apache POI Excel Table-TotalsRow
Я считаю, что должно быть какое-то волшебство, например, оценщик формулы или что-то подобное, но мне еще предстоит наткнуться на него в javadocs или примерном коде. Я использую код в this location со следующими изменениями. Внутри цикла, который устанавливает заголовки столбцов:
if(i == 0)
column.setTotalsRowLabel("Totals:");
else
column.setTotalsRowFunction(STTotalsRowFunctionImpl.COUNT);
Тогда вне цикла:
cttable.setTotalsRowShown(true);
cttable.setTotalsRowCount(1);
Не повезло, если добавить пустую строку для итогов, он отформатирован как часть таблицы , но никаких значений не видно. Если я устанавливаю формулу для любой из полных ячеек, эта формула работает, но Excel не любит таблицу и удаляет общую строку, хотя формула есть и работает, а не как общая строка.
Когда я смотрю на необработанный XML под ним, он практически неотличим от сохранения листа Excel для таблицы, в то время как рабочий лист значительно отличается.
ОБНОВЛЕНИЕ: Я давно был вдали от этого проекта, недавно вернулся к нему. Я отказался от POI, сделав это автоматически, и вместо этого обратился к попытке выполнить бэкдор через манипуляции с DOM.
Я так близко не могу отказаться. Все это сводится к проблеме пространства имен на последнем листе. Этот код:
Element b = (Element) wb.getSheetAt(0).getCTWorksheet().getSheetData().getRowList().get(4).getCArray()[3].getDomNode();
Element f = b.getOwnerDocument().createElementNS("main", "f");
b.removeAttribute("t");
b.removeChild(b.getElementsByTagName("v").item(0));
f.appendChild(b.getOwnerDocument().createTextNode("SUBTOTAL(103,MYTABLE[Human])"));
b.appendChild(f);
производит следующие действия в файле sheet1.xml:
<c r="D5">
<main:f>SUBTOTAL(103,MYTABLE[Human])</f>
</c>
Если я использую createElement ("е"), я получаю:
<c r="D5">
<f xmlns="">SUBTOTAL(103,MYTABLE[Human])</f>
</c>
Если я вручную отредактируйте лист внутри архива и удалите тег пространства имен или классификатор, он работает! Я не могу понять, как решить проблему NS без сохранения рабочей книги, а затем продолжить ее работу и устранить проблемы с файлом IO. У кого-нибудь есть какие-то намеки на это?