Запись в xls с использованием POI для огромных данных и создание новой рабочей книги, если нужно [дублировать]

1

У меня есть код для записи в xls file usng POI, но я получаю ввод, для которого мы можем получить lacs строк, следовательно, он может превышать максимальный размер рабочей книги. В этом случае мне нужно записать данные в новую книгу и продолжать делать это каждый раз, когда данные исчерпывают размер рабочей книги. Мои вопросы: 1) Как узнать, когда исчерпана рабочая книга? 2) как я могу создать новый файл 3), где я должен хранить свои данные, пока я отслеживаю "нет". из xls.

Благодарю!

  • 0
    Вы определяете максимально возможный размер рабочей книги, а затем отслеживаете, сколько строк вы вставляете. Если вы пытаетесь вставить строку, которая будет превышать максимально возможный размер рабочей книги, вы создаете новую рабочую книгу и идете оттуда.
  • 0
    Спасибо Ceiling, как мне установить максимально возможный размер рабочей книги (Макс. Количество листов). Каков максимально возможный размер? Как я узнаю, когда этот предел будет достигнут. Я понял ваше решение, но не с чего начать :)
Показать ещё 2 комментария
Теги:
xls
apache-poi

1 ответ

0

Если входные данные превышают максимальный размер рабочей книги, вы можете использовать стиль "Большая сетка" для записи данных в книгу. Это позволит вам писать неограниченные данные в книгу.

/** * * @param zipfile the template file * @param sheets the Map with
* key "name of the sheet entry to substitute
* (eg xl/worksheets/sheet1.xml, xl/worksheets/sheet2.xml etc)" * and value "XML file with the sheet data" * @param out the stream to write the result to */

 private static void substitute(File zipfile, Map<String, File> sheets, OutputStream out) throws IOException { ZipFile zip = new ZipFile(zipfile); ZipOutputStream zos = new ZipOutputStream(out); @SuppressWarnings("unchecked") Enumeration<ZipEntry> en = (Enumeration<ZipEntry>) zip.entries(); while (en.hasMoreElements()) { ZipEntry ze = en.nextElement(); if(!sheets.containsKey(ze.getName())){ zos.putNextEntry(new ZipEntry(ze.getName())); InputStream is = zip.getInputStream(ze); copyStream(is, zos); is.close(); } } for (Map.Entry<String, File> entry: sheets.entrySet()) {//System.out.println("Key -->"+entry.getKey()); zos.putNextEntry(new ZipEntry(entry.getKey())); InputStream is = new FileInputStream(entry.getValue()); copyStream(is, zos); is.close(); } zos.close(); } private static void copyStream(InputStream in, OutputStream out) throws IOException { byte[] chunk = new byte[1024]; int count; while ((count = in.read(chunk)) >=0 ) { out.write(chunk,0,count); } }/** * Writes spreadsheet data in a Writer. * (YK: in future it may evolve in a full-featured API for streaming data in Excel) */public static class SpreadsheetWriter { private final Writer _out; private int _rownum; public SpreadsheetWriter(Writer out){ _out = out; } public void beginSheet() throws IOException { _out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + "<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">" ); _out.write("<sheetData>\n"); } public void endSheet() throws IOException { _out.write("</sheetData>"); _out.write("</worksheet>"); }/** * Insert a new row * * @param rownum 0-based row number */public void insertRow(int rownum) throws IOException { _out.write("<row r=\""+(rownum+1)+"\">\n"); this._rownum = rownum; }/** * Insert row end marker */public void endRow() throws IOException { _out.write("</row>\n"); } public void createCell(int columnIndex, String value, int styleIndex) throws IOException { String ref = new CellReference(_rownum, columnIndex).formatAsString(); _out.write("<cr=\""+ref+"\" t=\"inlineStr\""); if(styleIndex != -1) _out.write(" s=\""+styleIndex+"\""); _out.write(">"); _out.write("<is><t>"+value+"</t></is>"); _out.write("</c>"); } public void createCell(int columnIndex, String value) throws IOException { createCell(columnIndex, value, -1); } public void createCell(int columnIndex, double value, int styleIndex) throws IOException { String ref = new CellReference(_rownum, columnIndex).formatAsString(); _out.write("<cr=\""+ref+"\" t=\"n\""); if(styleIndex != -1) _out.write(" s=\""+styleIndex+"\""); _out.write(">"); _out.write("<v>"+value+"</v>"); _out.write("</c>"); } public void createCell(int columnIndex, double value) throws IOException { createCell(columnIndex, value, -1); } public void createCell(int columnIndex, Calendar value, int styleIndex) throws IOException { createCell(columnIndex, DateUtil.getExcelDate(value, false), styleIndex); } }

Вам просто нужно вызвать метод substitute() во время записи данных в книгу,

       ServletOutputStream out = null;
        out = response.getOutputStream();
        substitute(new File("template.xlsm"), sheets, out); 
        out.flush();
        out.close();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню