Опитвам се да експортирам 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 файла.