¿Cómo dividir el archivo de Excel si las filas están por encima de 64k usando apache-poi?

Estoy creando un archivo de Excel usando el siguiente código

public class ResultSetToExcel {
        private HSSFWorkbook workbook;
        private HSSFSheet sheet;
        private HSSFFont boldFont;
        private HSSFDataFormat format;
        private ResultSet resultSet;
        private FormatType[] formatTypes;

        public ResultSetToExcel(ResultSet resultSet, FormatType[] formatTypes, String sheetName) {
            workbook = new HSSFWorkbook();
            this.resultSet = resultSet;
            sheet = workbook.createSheet(sheetName);
            boldFont = workbook.createFont();
            boldFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
            format = workbook.createDataFormat();
            this.formatTypes = formatTypes;
        }

        public ResultSetToExcel(ResultSet resultSet, String sheetName) {
            this(resultSet, null, sheetName);
        }

        private FormatType getFormatType(Class _class) {
            if (_class == Integer.class || _class == Long.class) {
                return FormatType.INTEGER;
            } else if (_class == Float.class || _class == Double.class) {
                return FormatType.FLOAT;
            } else if (_class == Timestamp.class || _class == java.sql.Date.class) {
                return FormatType.DATE;
            } else {
                return FormatType.TEXT;
            }
        }

        public void generate(OutputStream outputStream) throws Exception {
            try {
                ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
                if (formatTypes != null && formatTypes.length != resultSetMetaData.getColumnCount()) {
                    throw new IllegalStateException("Number of types is not identical to number of resultset columns. "
                            + "Number of types: " + formatTypes.length + ". Number of columns: "
                            + resultSetMetaData.getColumnCount());
                }
                int currentRow = 0;
                HSSFRow row = sheet.createRow(currentRow);
                int numCols = resultSetMetaData.getColumnCount();
                boolean isAutoDecideFormatTypes;
                if (isAutoDecideFormatTypes = (formatTypes == null)) {
                    formatTypes = new FormatType[numCols];
                }
                for (int i = 0; i < numCols; i++) {
                    String title = resultSetMetaData.getColumnName(i + 1);
                    writeCell(row, i, title, FormatType.TEXT, boldFont);
                    if (isAutoDecideFormatTypes) {
                        Class _class = Class.forName(resultSetMetaData.getColumnClassName(i + 1));
                        formatTypes[i] = getFormatType(_class);
                    }
                }

                currentRow++; // Write report rows
                while (resultSet.next()) {
                    row = sheet.createRow(currentRow++);
                    for (int i = 0; i < numCols; i++) {
                        Object value = resultSet.getObject(i + 1);
                        writeCell(row, i, value, formatTypes[i]);
                    }
                }
                // Autosize columns
                for (int i = 0; i < numCols; i++) {
                    sheet.autoSizeColumn((short) i);
                }
                workbook.write(outputStream);
            } finally {
                outputStream.close();
            }
        }

        public void generate(File file) throws Exception {
            generate(new FileOutputStream(file));
        }

        private void writeCell(HSSFRow row, int col, Object value, FormatType formatType) throws NestableException {
            writeCell(row, col, value, formatType, null, null);
        }

        private void writeCell(HSSFRow row, int col, Object value, FormatType formatType, HSSFFont font)
                throws NestableException {
            writeCell(row, col, value, formatType, null, font);
        }

        private void writeCell(HSSFRow row, int col, Object value, FormatType formatType, Short bgColor, HSSFFont font)
                throws NestableException {
            HSSFCell cell = HSSFCellUtil.createCell(row, col, null);
            if (value == null) {
                return;
            }
            if (font != null) {
                HSSFCellStyle style = workbook.createCellStyle();
                style.setFont(font);
                cell.setCellStyle(style);
            }
            switch (formatType) {
            case TEXT:
                cell.setCellValue(value.toString());
                break;
            case INTEGER:
                cell.setCellValue(((Number) value).intValue());
                HSSFCellUtil.setCellStyleProperty(cell, workbook, HSSFCellUtil.DATA_FORMAT, HSSFDataFormat
                        .getBuiltinFormat(("#,##0")));
                break;
            case FLOAT:
                cell.setCellValue(((Number) value).doubleValue());
                HSSFCellUtil.setCellStyleProperty(cell, workbook, HSSFCellUtil.DATA_FORMAT, HSSFDataFormat
                        .getBuiltinFormat(("#,##0.00")));

                break;
            case DATE:
                cell.setCellValue((Timestamp) value);
                HSSFCellUtil.setCellStyleProperty(cell, workbook, HSSFCellUtil.DATA_FORMAT, HSSFDataFormat
                        .getBuiltinFormat(("m/d/yy")));
                break;
            case MONEY:
                cell.setCellValue(((Number) value).intValue());
                HSSFCellUtil.setCellStyleProperty(cell, workbook, HSSFCellUtil.DATA_FORMAT, format
                        .getFormat("($#,##0.00);($#,##0.00)"));
                break;
            case PERCENTAGE:
                cell.setCellValue(((Number) value).doubleValue());
                HSSFCellUtil.setCellStyleProperty(cell, workbook, HSSFCellUtil.DATA_FORMAT, HSSFDataFormat
                        .getBuiltinFormat("0.00%"));
            }
            if (bgColor != null) {
                HSSFCellUtil.setCellStyleProperty(cell, workbook, HSSFCellUtil.FILL_FOREGROUND_COLOR, bgColor);
                HSSFCellUtil
                        .setCellStyleProperty(cell, workbook, HSSFCellUtil.FILL_PATTERN, HSSFCellStyle.SOLID_FOREGROUND);
            }
        }

        public enum FormatType {
            TEXT, INTEGER, FLOAT, DATE, MONEY, PERCENTAGE
        }
    }

Y la clase implementando el código anterior

ResultSetToExcel resultSetToExcel = new ResultSetToExcel(rs,        new ResultSetToExcel.FormatType[] { ResultSetToExcel.FormatType.TEXT, ResultSetToExcel.FormatType.TEXT,            ResultSetToExcel.FormatType.INTEGER, ResultSetToExcel.FormatType.MONEY }, "Employee List");    resultSetToExcel.generate(new File("c:\\employees.xls"));

¿Cómo dividir los archivos de Excel si los registros están por encima de 64000 filas?

Editar:

¿Cómo puedo obtener el recuento de filas de la hoja de Excel en POI? y si es 64k, ¿cómo crear un nuevo Excel?

¿Cómo obtener los recuentos de filas?

Respuesta 1

Le sugiero que modifique su método de generación de la siguiente manera:

a) Asegúrese de que no genera más de 64000 filas en una hoja de cálculo.

b) Haga que devuelva un valor booleano: verdadero si no quedan más filas en ResultSet; de lo contrario, falso.

Entonces, su bucle principal en el método de generación podría verse así:

boolean allRowsDone = true;              
currentRow++; 
while (resultSet.next()) {
    row = sheet.createRow(currentRow++); 
    for (int i = 0; i < numCols; i++) { 
        Object value = resultSet.getObject(i + 1); 
        writeCell(row, i, value, formatTypes[i]); 
     }
     if (currentRow >= 64000) {
         allRowsDone = false;
         break; 
}
// put the rest of your code here
return allRowsDone;

Luego, en el programa de llamadas, puede hacer algo como lo siguiente:

String baseFile = "c:\\employees";
String fileName = baseFile + ".xls";
int fileCount = 1;
while (true) {
    boolean done = resultSetToExcel.generate(new File(fileName));
    if (done) break;
    fileName = baseFile + "_" + fileCount + ".xls";
    fileCount++;
}

Esto daría como resultado la creación de tantos archivos de Excel como sea necesario, cada archivo de Excel no contiene más de 64000 filas. El primer archivo se llama "employee.xls", el segundo se llama "employee_1.xls", y así sucesivamente.

Respuesta: 2

Tengo un código Java simple con tres clases principales. Quiero construir 3 JAR diferentes a partir de él y luego agregar esos JAR a mi Dockerfile y llamar a cada JAR en una imagen Docker diferente. ¿Cómo puedo hacerlo?

Situación siguiente: necesito un contenedor para datos con un rowindex. Actualmente utilizamos una ArrayList normal dentro de los modelos de tabla y actualizamos los números de tabla a mano (con algoritmos locos, para mantenerlos actualizados ...

He estado recibiendo com.google.gson.JsonSyntaxException al llamar a Gson.fromJson (), así que agregué una lógica catch (Exception), ¡pero el error nunca se detecta y simplemente se arroja! Esto es lo que yo ...

Respetado señor / señora, tengo un fortran exe que toma un archivo de entrada y produce el archivo de salida haciendo alguna manipulación en el archivo de entrada. Puedo ejecutar el comando en la terminal de Linux. (Creo que fortran ...