Как добавить строки в существующую таблицу, используя Docx4J - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть рабочая книга с таблицей, в которой есть таблица («таблица» относится к функции вставки таблицы в интерфейсе Excel с заголовками столбцов и стрелками фильтров и т. Д. c). У меня возникают проблемы с определением, какие классы использовать для редактирования существующих строк таблицы или вставки новых строк в таблицу.

Я добился успеха (в немалой степени спасибо JasonPlutext ) с запись нового содержимого ячейки в существующие ячейки, а также создание совершенно новых ячеек / строк. Я бы предпочел не писать сначала строку заголовка и все строки данных, и они превращают их в таблицу с помощью API, но я хотел бы знать, знает ли кто-нибудь, как это должно быть сделано. Раньше я мог просто создать таблицу с количеством строк, которое, как я знал, мне понадобится, но в этом случае количество строк будет динамическим c. Я надеялся, что смогу просто сослаться на tablePart, и тогда будет какой-то метод для вставки в объект List.

Любое руководство приветствуется.

EDIT:

Так как конкретный пример, скажем, у меня есть рабочая книга и лист с существующей таблицей из 2 столбцов с 2 строками (включая заголовок), начиная с A1. Я могу открыть базовый xl> tables> table1. xml и увидеть это:


    <table xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="xr xr3" xmlns:xr="http://schemas.microsoft.com/office/spreadsheetml/2014/revision" xmlns:xr3="http://schemas.microsoft.com/office/spreadsheetml/2016/revision3" id="5" xr:uid="{FAABA541-34FC-423B-94F5-DDD8D784132E}" name="SummarySFTP" displayName="SummarySFTP" ref="A1:B2" totalsRowShown="0" headerRowDxfId="46" headerRowBorderDxfId="45" tableBorderDxfId="44">
        <autoFilter ref="A1:B2" xr:uid="{93499C15-75FB-4436-A9B9-0C1FCBD787F4}">
            <filterColumn colId="0" hiddenButton="0"/>
            <filterColumn colId="1" hiddenButton="0"/>
        </autoFilter>
        <tableColumns count="2">
            <tableColumn id="1" xr3:uid="{D4DA50CD-C581-4286-9B64-42B02B6646B6}" name="Status"/>
            <tableColumn id="2" xr3:uid="{9D4F40B3-B530-42E1-92E9-86D5632CA191}" name="Quantity" dataDxfId="43"/>
        </tableColumns>
        <tableStyleInfo showFirstColumn="0" showLastColumn="0" showRowStripes="1" showColumnStripes="0"/>
    </table>

Я вижу свои два столбца, атрибут ref тега root, а также блок autoFilter атрибут ref. Что я хочу сделать, это добавить новую строку так, чтобы область таблицы была A1: B3.

1 Ответ

0 голосов
/ 21 апреля 2020

Проверяя файл xlsx, содержащий таблицу в веб-приложении docx4j, он выглядит довольно просто.

Он генерирует код для содержимого части таблицы, например:

CTTable table = smlObjectFactory.createCTTable(); 
JAXBElement<org.xlsx4j.sml.CTTable> tableWrapped = smlObjectFactory.createTable(table); 
    // Create object for autoFilter
    CTAutoFilter autofilter = smlObjectFactory.createCTAutoFilter(); 
    table.setAutoFilter(autofilter); 
        autofilter.setRef( "A2:B4"); 
    // Create object for tableColumns
    CTTableColumns tablecolumns = smlObjectFactory.createCTTableColumns(); 
    table.setTableColumns(tablecolumns); 
        tablecolumns.setCount( new Long(2) );
        // Create object for tableColumn
        CTTableColumn tablecolumn = smlObjectFactory.createCTTableColumn(); 
        tablecolumns.getTableColumn().add( tablecolumn); 
            tablecolumn.setTotalsRowFunction(org.xlsx4j.sml.STTotalsRowFunction.NONE);
            tablecolumn.setName( "Column1"); 
            tablecolumn.setId( 1 );
        // Create object for tableColumn
        CTTableColumn tablecolumn2 = smlObjectFactory.createCTTableColumn(); 
        tablecolumns.getTableColumn().add( tablecolumn2); 
            tablecolumn2.setTotalsRowFunction(org.xlsx4j.sml.STTotalsRowFunction.NONE);
            tablecolumn2.setName( "Column2"); 
            tablecolumn2.setId( 2 );
    // Create object for tableStyleInfo
    CTTableStyleInfo tablestyleinfo = smlObjectFactory.createCTTableStyleInfo(); 
    table.setTableStyleInfo(tablestyleinfo); 
        tablestyleinfo.setName( "TableStyleMedium2"); 
    table.setTableType(org.xlsx4j.sml.STTableType.WORKSHEET);
    table.setHeaderRowCount( new Long(1) );
    table.setTotalsRowCount( new Long(0) );
    table.setName( "Table1"); 
    table.setId( 1 );
    table.setRef( "A2:B4"); 
    table.setDisplayName( "Table1"); 

Как только вы знаете, количество строк, вы можете увидеть, что вам нужно записать его в 2 местах, используя setRef и autofilter.setRef

...