2012-06-26 33 views
1

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

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

如何如果记录高于64000行分裂Excel文件创建Excel文件?

编辑:

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

如何获取行数?

回答

1

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

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

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

所以,你在产生方法主循环可能会是这个样子:

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

这将导致在根据需要创建尽可能多的excel文件时,每个包含不超过64000行的excel文件。第一个文件名为“employees.xls”,第二个文件名为“employees_1.xls”,等等。

0

存在,让从第n行的值,如果(的valueOf(64000))列不为空创建另一个EXCELL的方法

+0

can ypu请分享链接,我在哪里可以得到该方法?..方法是poi或resultset? – happy