У меня есть следующий метод, который экспортирует значения данных таблицы в файл XLSX.
public static void export(String filePath, Collection<String> variableNamesList, List<Map<GroupByStruct, List<List<String>>>> tablesToExportList) {
BufferedOutputStream fileOutputStream = null;
if (filePath.endsWith(XLS_EXTENSION)) {
filePath = filePath.replace(XLS_EXTENSION, XLSX_EXTENSION);
}
if (!filePath.endsWith(XLS_EXTENSION) && !filePath.endsWith(XLSX_EXTENSION)) {
filePath = filePath + XLSX_EXTENSION;
}
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet(SHEET_NAME);
int beginRow = 1;
int beginColumn = 1;
int nbColumns = 0;
// Writes variables names into sheet title
beginRow = exportVariablesTitle(sheet, variableNamesList, beginRow, beginColumn);
List<TableObject> tableObjectList = convertToTableObjectList(tablesToExportList);
// Export data into sheet
for (TableObject tableObject : tableObjectList) {
tableObject.exportTableObject(sheet, beginRow, beginColumn);
beginRow += tableObject.getNbRows() + 2;
nbColumns = Math.max(nbColumns, tableObject.getnbColumns());
}
try {
File file = new File(filePath);
if (!file.exists()) {
file.createNewFile();
}
else {
file.delete();
file.createNewFile();
}
fileOutputStream = new BufferedOutputStream(new FileOutputStream(file));
workbook.write(fileOutputStream);
if (fileOutputStream != null) {
fileOutputStream.close();
}
}
catch (IOException ioe) {
DebugUtil.warning(ioe);
}
}
private static int exportVariablesTitle(XSSFSheet sheet, Collection<String> variableNamesList, int beginRow, int beginColumn) {
XSSFRow row = sheet.getRow(beginRow);
if (row == null) row = sheet.createRow(beginRow);
int curCol = beginColumn;
XSSFCell cell = row.getCell(curCol);
if (cell == null) cell = row.createCell(curCol);
// Adds variables row label
cell.setCellStyle(getTitleBorderStyle(sheet.getWorkbook()));
cell.setCellValue(VARIABLES_ROW_LABEL);
cell.setCellType(Cell.CELL_TYPE_STRING);
curCol++;
// Adds a variable name per column into the same row
for (String varName : variableNamesList) {
cell = row.getCell(curCol);
if (cell == null) cell = row.createCell(curCol);
cell.setCellStyle(getTitleBorderStyle(sheet.getWorkbook()));
cell.setCellValue(varName);
cell.setCellType(Cell.CELL_TYPE_STRING);
curCol++;
}
return beginRow + 2;
}
Фактически файл Excel экспортируется, и он работает правильно, если мы остаемся в linux. Но если мы go через windows откроем файл, у нас возникнут проблемы, появятся сообщения об ошибках, и мы увидим, что это пустоты или определенные символы, такие как бесконечность, которые не управляются.