Преобразовать XSSFWorkbook в SXSSFWorkbook

354
16 ноября 2017, 02:36

У меня есть метод для записи данный в эксель файл. Он при больших значениях падает с ошибкой - нехватка памяти. Подскажите как грамотно переписать его для записи больших данных в 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);
        }
    }
READ ALSO
Несколько реализаций для одного класса

Несколько реализаций для одного класса

Для android существует такая вещь как ProductFlavorsХочется получиться тоже самое и для простой java и в итоге получить jar'ник

248
LibGDX (де)активация кнопки

LibGDX (де)активация кнопки

Изучал раньше Android там можно было сделать кнопку неактивной (setEnabled) , так вот как в libGDX такое реализовывается ? Уже есть что то готовое или самому...

262
Не подгружаются данные с Firebase

Не подгружаются данные с Firebase

При попытке вывести данные из Firebase выдается ошибкаВ чем может быть проблема? P

361