如果使用apache-poi的行高于64k,如何分割excel文件?

我正在使用下面的代码创buildexcel文件

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 } } 

和类实现上面的代码

 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")); 

如果logging高于64000行,如何分割excel文件?

编辑:

如何获得POI中Excel表的行数? 如果是64k如何创build新的excel?

如何获得行数?

我build议你修改你的生成方法如下:

a)确保在一个电子表格中生成不超过64000行。

b)让它返回一个布尔值 – 如果ResultSet中没有剩余的行,则返回true,否则返回false。

所以,您在generate方法中的主循环可能看起来像这样:

 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; 

然后,在调用程序中,您可以执行以下操作:

 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++; } 

这将导致您创build尽可能多的Excel文件,每个Excel文件包含不超过64000行。 第一个文件命名为“employees.xls”,第二个命名为“employees_1.xls”,依此类推。

如果(valueOf(64000))列不为空,则有一个方法从第n行给出值创build另一个excell