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?).

Вижте custom-column-widths-in-excel -open-xml и изчисляване -column-widths-in-excel-open-xml за повече.

person JasonPlutext    schedule 18.07.2012