У меня есть метод для записи данный в эксель файл. Он при больших значениях падает с ошибкой - нехватка памяти. Подскажите как грамотно переписать его для записи больших данных в SXSSFWorkbook.
public static void write(String filename, List<List<String[]>> data) {
FileOutputStream out = null;
XSSFWorkbook wb;
File f = new File(filename);
try {
wb= new XSSFWorkbook(new FileInputStream(f));
} catch (FileNotFoundException e) {
if (f.exists()) {
Syslog.info(null, "Cant open file " + filename + ".");
} else {
Syslog.info(null, "File not found.");
}
wb = new XSSFWorkbook();
e.printStackTrace();
} catch (IOException e) {
Syslog.info(null, "IO Exception;");
wb = new XSSFWorkbook();
e.printStackTrace();
}
int lstNum = 0;
for (Iterator<List<String[]>> lst = data.iterator(); lst.hasNext() && ((lstNum + 1) < data.size());) {
Sheet s = wb.getSheet("Исходник");
lstNum++;
List<String[]> rows = lst.next();
int rownum = 0;
for (Iterator<String[]> it = rows.iterator(); it.hasNext();) {
String[] strs = it.next();
Row r = s.createRow(rownum);
for (int cellnum = 0; cellnum < strs.length; cellnum++) {
Cell c = r.createCell(cellnum);
try {
double val = Double.parseDouble(strs[cellnum].replace(',', '.').trim());
c.setCellType(Cell.CELL_TYPE_NUMERIC);
c.setCellStyle(numStyle);
c.setCellValue(val);
} catch (Exception e) {
// Не число
try {
DateFormat format = new SimpleDateFormat("dd.MM.yyyy"); // hh:mm:ss
Date val = format.parse(strs[cellnum]);
c.setCellType(Cell.CELL_TYPE_NUMERIC);
c.setCellValue(val);
c.setCellStyle(dateStyle);
} catch (Exception e1) {
// Не дата
c.setCellValue(new XSSFRichTextString(strs[cellnum]));
}
}
}
rownum++;
}
if (rows.size() > 0) {
// Создаем стиль для заголовков
CellStyle titleStyle = wb.createCellStyle();
Font font = wb.createFont();
font.setBoldweight(Font.BOLDWEIGHT_BOLD);
titleStyle.setFont(font);
Row titles = s.getRow(0);
for (int i = 0; i < rows.get(0).length; i++) {
titles.getCell(i).setCellStyle(titleStyle);
}
if (titles != null)
titles = null;
}
rows = null;
s = null;
}
// Сохранение документа
try {
out = new FileOutputStream(filename);
wb.write(out);
wb.close();
out.close();
out = null;
wb = null;
} catch (IOException e) {
Syslog.error(null, e);
}
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости