2013-03-08 47 views
0

我試圖將數據從數據庫導出到Excel。我有導出的數據,當前存儲在一個ArrayList中(這可以更改)。我已經能夠將數據導出爲ex​​cel,但所有值都以字符串形式導出,我需要它們保留其數據類型,即貨幣/數字。使用POI將不同的數據類型寫入excel

我正在使用Apache POI,並且難以將字段的數據類型設置爲字符串以外的任何其他字段。我錯過了什麼嗎?有人可以建議我以更好的方式做到這一點?任何援助對此將不勝感激。

public static void importDataToExcel(String sheetName, ArrayList header, ArrayList data, File xlsFilename, int sheetNumber) 
     throws HPSFException, FileNotFoundException, IOException { 

    POIFSFileSystem fs = new POIFSFileSystem(); 
    HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(xlsFilename)); 
    HSSFSheet sheet = wb.createSheet(sheetName); 

    int rowIdx = 0; 
    short cellIdx = 0; 

    // Header 
    HSSFRow hssfHeader = sheet.createRow(rowIdx); 
    HSSFCellStyle cellStyle = wb.createCellStyle(); 
    cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
    for (Iterator cells = header.iterator(); cells.hasNext();) { 
     HSSFCell hssfCell = hssfHeader.createCell(cellIdx++); 
     hssfCell.setCellStyle(cellStyle); 
     hssfCell.setCellValue((String) cells.next()); 
    } 
    // Data 

    rowIdx = 1; 
    for (Iterator rows = data.iterator(); rows.hasNext();) { 
     ArrayList row = (ArrayList) rows.next(); 
     HSSFRow hssfRow = (HSSFRow) sheet.createRow(rowIdx++); 
     cellIdx = 0; 
     for (Iterator cells = row.iterator(); cells.hasNext();) { 
      HSSFCell hssfCell = hssfRow.createCell(cellIdx++); 
      hssfCell.setCellValue((String) cells.next()); 
     } 
    } 
    Logfile.log("sheetNumber = " + sheetNumber); 
    wb.setSheetName(sheetNumber, sheetName); 
    try { 
     FileOutputStream out = new FileOutputStream(xlsFilename); 
     wb.write(out); 
     out.close(); 
    } catch (IOException e) { 
     throw new HPSFException(e.getMessage()); 
    } 

} 
+0

你把什麼放到你的'List's中,它們都是原始的 - 你如何填充它們? – 2013-03-08 15:58:30

+0

爲什麼不把字符串解析成數字,然後用double來調用'setCellValue'? – Gagravarr 2013-03-08 16:00:55

+0

該列表是從數據庫查詢返回的結果。標題列表只是字符串,數據列表是雙精度和字符串的組合。 – user1274028 2013-03-08 16:01:00

回答

1

您需要檢查類你的價值,你施放前:

public static void importDataToExcel(String sheetName, List<String> headers, List<List<Object>> data, File xlsFilename, int sheetNumber) 
     throws HPSFException, FileNotFoundException, IOException { 

    POIFSFileSystem fs = new POIFSFileSystem(); 
    Workbook wb; 
    try { 
     wb = WorkbookFactory.create(new FileInputStream(xlsFilename)); 
    } catch (InvalidFormatException ex) { 
     throw new IOException("Invalid workbook format"); 
    } 
    Sheet sheet = wb.createSheet(sheetName); 

    int rowIdx = 0; 
    int cellIdx = 0; 

    // Header 
    Row hssfHeader = sheet.createRow(rowIdx); 
    CellStyle cellStyle = wb.createCellStyle(); 
    cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
    for (final String header : headers) { 
     Cell hssfCell = hssfHeader.createCell(cellIdx++); 
     hssfCell.setCellStyle(cellStyle); 
     hssfCell.setCellValue(header); 
    } 
    // Data 

    rowIdx = 1; 
    for (final List<Object> row : data) { 
     Row hssfRow = sheet.createRow(rowIdx++); 
     cellIdx = 0; 
     for (Object value : row) { 
      Cell hssfCell = hssfRow.createCell(cellIdx++); 
      if (value instanceof String) { 
       hssfCell.setCellValue((String) value); 
      } else if (value instanceof Number) { 
       hssfCell.setCellValue(((Number) value).doubleValue()); 
      } else { 
       throw new RuntimeException("Cell value of invalid type " + value); 
      } 
     } 
    } 
    wb.setSheetName(sheetNumber, sheetName); 
    try { 
     FileOutputStream out = new FileOutputStream(xlsFilename); 
     wb.write(out); 
     out.close(); 
    } catch (IOException e) { 
     throw new HPSFException(e.getMessage()); 
    } 
} 

我還增加了仿製藥 - 這使得代碼更大量的可讀性。您還需要儘可能避免使用實際的class,並使用interface,例如List而不是ArrayList和而不是HSSFRow

+0

非常感謝您的幫助 - 這正是我幾天來一直在努力的方向。再次感謝你,並有一個愉快的週末。 – user1274028 2013-03-08 16:23:23

+0

沒問題。如果有幫助,請接受答案。 – 2013-03-08 16:24:44

相關問題