2015-10-05 6 views
5

При написании инструмента для экспорта наборов результатов в 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. У кого-нибудь есть какие-то намеки на это?

ответ

3

Если я использую правильный полный URI для пространства имен, книга сохраняет и все хорошо, пока я не пытаюсь оценить формулу с помощью POI. Я использую рабочую книгу setForceFormulaRecalculation и работает, когда Excel открыт. Это все еще ошибка в POI, я верю, но мне нужно быстрое исправление, и это делает это для меня.

2

Примечание: Я понимаю, что это очень старый пост, но только в том случае, если кто в будущем может искать решения этого, как я только что столкнулся с таким же вопросом ...

Вы находитесь на правильный путь, но я не вижу, где вы применяете формулу к ячейке в фактической общей строке. Если вы не установите это значение, общая строка будет присутствовать, но будет пустой при открытии файла.

При создании таблицы

cttable.setTotalsRowShown(true); 
cttable.setTotalsRowCount(1); 
cttable.addNewAutoFilter(); 

При создании колонны

column.setTotalsRowFunction(STTotalsRowFunctionImpl.COUNT); 

После заполнения всех данных таблицы

Row totalsRow = sheet.createRow(tableLastRow); 
Cell totalsCell = totalsRow.createCell(lastColumnPosition); 
totalsCell.setCellFormula("SUBTOTAL(103,MYTABLE[Human])"); 

Вам нужно будет заполнить tableLastRow и lastColumnPosition для значений, специфичных для вашего кода. Это работает для меня с Apache POI 3.17 и Excel 2016.

Смежные вопросы