框架使用POI導入與導出Excel出現的問題
在使用Java進行Excel導入導出數據的基礎上,挪到框架裏出現的問題
1.workbook.close();報錯
public static Workbook getWorkbook(InputStream inputStream, String fileType) throws IOException {
Workbook workbook = null;
if (fileType.equalsIgnoreCase(XLS)) {
workbook = new HSSFWorkbook(inputStream);
} else if (fileType.equalsIgnoreCase(XLSX)) {
workbook = new XSSFWorkbook(inputStream);
}
return workbook;
}
在普通Java項目里正常
if (null != workbook) {
workbook.close();
}
在框架項目裏報錯,各種方式都試了依然解決不掉,後來直接把workbook.close();刪掉就好了!!!!
if (null != workbook) {
}
原因:在Java項目裏org.apache.poi.ss.usermodel.Workbook接口有close方法,且org.apache.poi.hssf.usermodel.HSSFWorkbook;類實現了close方法,所以可以正常關閉。
在框架項目裏:
org.apache.poi.hssf.usermodel.HSSFWorkbook;
org.apache.poi.ss.usermodel.Workbook;
雖然引入了jar包,但是無法尋找到source!!!,在eclipse 把鼠標放在HSSFWorkbook上按住ctrl點擊鼠標,出現source not found,很顯然這裏的HSSFWorkbook並沒有發揮它的作用,那它的方法close自然也不能使用,這裏推測是jar包版本問題,所以報錯。
2.NUMERIC報錯
在普通Java項目裏NUMERIC、STRING等是正確的:
switch (cell.getCellType()) {
case NUMERIC: //數字
Double doubleValue = cell.getNumericCellValue();
// 格式化科學計數法,取一位整數
DecimalFormat df = new DecimalFormat("0");
returnValue = df.format(doubleValue);
break;
case STRING: //字符串
returnValue = cell.getStringCellValue();
break;
case BOOLEAN: //布爾
Boolean booleanValue = cell.getBooleanCellValue();
returnValue = booleanValue.toString();
break;
case BLANK: // 空值
break;
case FORMULA: // 公式
returnValue = cell.getCellFormula();
break;
case ERROR: // 故障
break;
default:
break;
}
在框架項目裏應該如下調整:
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC: //數字
Double doubleValue = cell.getNumericCellValue();
// 格式化科學計數法,取一位整數
DecimalFormat df = new DecimalFormat("0");
returnValue = df.format(doubleValue);
break;
case HSSFCell.CELL_TYPE_STRING: //字符串
returnValue = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_BOOLEAN: //布爾
Boolean booleanValue = cell.getBooleanCellValue();
returnValue = booleanValue.toString();
break;
case HSSFCell.CELL_TYPE_BLANK: // 空值
break;
case HSSFCell.CELL_TYPE_FORMULA: // 公式
returnValue = cell.getCellFormula();
break;
case HSSFCell.CELL_TYPE_ERROR: // 故障
break;
default:
break;
}
原因:
在Java項目裏:NUMERIC是來自CellType
org.apache.poi.ss.usermodel.CellType.NUMERIC
在框架項目裏:NUMERIC是來自Cell名字變成了CELL_TYPE_NUMERIC
org.apache.poi.ss.usermodel.Cell.CELL_TYPE_NUMERIC
其他幾個常量也是如此,版本問題而已。
3.寫出excel文件時設置樣式出錯
在普通Java裏如下代碼設置輸出的Excel文件格式是正確的:
CellStyle style = workbook.createCellStyle();
//對齊方式設置
style.setAlignment(HorizontalAlignment.CENTER);
//邊框顏色和寬度設置
style.setBorderBottom(BorderStyle.THIN);
style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); // 下邊框
style.setBorderLeft(BorderStyle.THIN);
style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); // 左邊框
style.setBorderRight(BorderStyle.THIN);
style.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 右邊框
style.setBorderTop(BorderStyle.THIN);
style.setTopBorderColor(IndexedColors.BLACK.getIndex()); // 上邊框
//設置背景顏色
style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//粗體字設置
Font font = workbook.createFont();
font.setBold(true);
style.setFont(font);
return style;
在框架項目裏做如下調整:
CellStyle style = workbook.createCellStyle();
//對齊方式設置
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//邊框顏色和寬度設置
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); // 下邊框
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); // 左邊框
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 右邊框
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setTopBorderColor(IndexedColors.BLACK.getIndex()); // 上邊框
//設置背景顏色
style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
//粗體字設置
Font font = workbook.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
style.setFont(font);
return style;