xlsx4j - Как установить ширину столбца в электронной таблице?

Я пытаюсь экспортировать JTable в файл XLSX с помощью xlsx4j, но у меня возникают проблемы с настройкой ширины столбцов. Мне удалось установить ширину по умолчанию для всех столбцов, но я бы хотел, чтобы ширина столбцов соответствовала длине данных автоматически:

public void exportToXLS() throws Exception
{           
    //Create the spreadsheet
    SpreadsheetMLPackage pkg = SpreadsheetMLPackage.createPackage();
    WorksheetPart sheet = pkg.createWorksheetPart(new PartName("/xl/worksheets/sheet1.xml"), "Sheet1", 1);

    //Set default format for rows and columns
    CTSheetFormatPr format = Context.getsmlObjectFactory().createCTSheetFormatPr();
    format.setDefaultColWidth(20.0);        
    format.setDefaultRowHeight(16.8);
    format.setCustomHeight(Boolean.TRUE);
    sheet.getJaxbElement().setSheetFormatPr(format);

    //Get a few JTable properties 
    int iSelectedTab = tabPane.getSelectedIndex();
    int[] rowsSelected = table[iSelectedTab].getSelectedRows();
    int iColumns = table[0].getColumnCount();
    int iCurrentRow;

    //Retrieve SheetData from sheet object
    SheetData sheetData = sheet.getJaxbElement().getSheetData();
    Row row;
    Cell cell;

    //Copy data from JTable to spreadsheet  
    for(int iRow=0; iRow < rowsSelected.length; iRow++)
    {                       
        iCurrentRow = rowsSelected[iRow];
        row = Context.getsmlObjectFactory().createRow();
        List<Cell>rowl = row.getC();
        for(int iCol = 0; iCol < iColumns; iCol++)
        {
            cell = Context.getsmlObjectFactory().createCell();              
            CTRst ctrst = new CTRst();
            ctrst.setT(table[iSelectedTab].getValueAt(iCurrentRow, iCol).toString());
            cell.setT(STCellType.INLINE_STR);
            cell.setIs(ctrst);              
            rowl.add(cell);

        }
        sheetData.getRow().add(row);            
    }

    //Set the columns widths
    List<Cols> lstCols = sheet.getJaxbElement().getCols();
    System.out.println("lstCols.size() is " + lstCols.size());
    for(int i = 0; i< lstCols.size(); i++)
    {
        List<Col> lstCol = lstCols.get(i).getCol();
        System.out.println("lstCol.size() is " + lstCol.size());
        for(int j=0; j<lstCol.size(); j++)
        {               
            lstCol.get(j).setBestFit(Boolean.TRUE);
            lstCol.get(j).setWidth(30.0);   
            System.out.println("Column " + i + " : " + j);
        }
    }

    //Save the spreadsheet to file
    pkg.save(new File("Export.xlsx"));              
}

Приведенный выше код отображается в консоли: lstCols.size() равен 0, поэтому после добавления строк и ячеек в SheetData определений столбцов нет.

С другой стороны, если я создам столбцы вручную следующим образом:

Cols cols = Context.smlObjectFactory.createCols();  
Col col = Context.smlObjectFactory.createCol();
col.setBestFit(Boolean.TRUE);
cols.getCol().add(col);
sheet.getJaxbElement().getCols().add(cols);

Я получаю катастрофическую ошибку в файле XLSX.


person kappa    schedule 18.07.2012    source источник


Ответы (1)


Из спецификации ECMA-376 (я просмотрел 3ed, раздел 18.3.1.17, p1774):

В этом примере показано, что к столбцу 4 (D) применено «наилучшее соответствие», которое также является пользовательской шириной. Кроме того, столбец 5 (E) указан как имеющий пользовательскую ширину и стиль, применяемый на уровне столбца (в отличие от уровня ячейки).

<cols>
<col min="4" max="4" width="12" bestFit="1" customWidth="1"/>
<col min="5" max="5" width="9.140625" style="3"/>
</cols>

Итак, похоже, вам просто нужно завершить определение объекта col, указав номер col (через атрибуты min/max).

<col min="2" max="2" bestFit="1"/>

дает столбец, который начинается с нулевой ширины, поэтому вы должны указать @width.

@bestFit, похоже, не делает того, что вы ожидаете (вы хотите что-то больше похожее на autoFit?).

См. раздел нестандартная-ширина-столбца-в-Excel. -open-xml и расчет -column-widths-in-excel-open-xml, чтобы узнать больше.

person JasonPlutext    schedule 18.07.2012