POI解析Excel,解決長數字變成科學計數法或double的問題
阿新 • • 發佈:2019-01-27
最近在做專案的時候需要用的POI解析Excel,該Excel中資料型別較多,有日期型,整型,double型,文字型。但是在處理時碰見了以下兩個問題:
遇到數字型別時,雖然Excel中設定為文字型別,但是POI的Cell型別依然會變為數字型別,而且當數字比較長的時候,讀取出來的結果還會變成科學計數法的形式。
數字無論是否為小數還是整型,當使用cell.getNumbericCellValue()來讀取內單元格內容的時候,都會統一當成Double型別來處理。
為了解決以上問題,即獲取單元格的原始資料,統一用DecimalFormat對double進行格式化即可。如下:
DecimalFormat df = new DecimalFormat("0");
String cellText = df.format(cell.getNumericCellValue());
這裡附上獲取單元格內容的相關程式碼。
public class ExcelUtil {
private String val = null;
private SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd"); //日期格式yyyy-mm-dd
private DecimalFormat df = new DecimalFormat("0" ); //數字格式,防止長數字成為科學計數法形式,或者int變為double形式
List<ArrayList<String>> strLists = new ArrayList<ArrayList<String>>(); //存放Excel中的資料
/**
* @author: LS
* 2016-8-27 下午7:04:26
* @return List<ArrayList<String>>
* @throws FileNotFoundException,IOException,InvalidFormatException
* POI方式解析EXCEL表格(2007以上版本,xlsx)
*/
public List<ArrayList<String>> poiReadXExcel(String file) throws FileNotFoundException, IOException, InvalidFormatException {
FileInputStream input = new FileInputStream(new File(file)); //讀取的檔案路徑
XSSFWorkbook wb = new XSSFWorkbook(new BufferedInputStream(input));
XSSFSheet sheet = wb.getSheetAt(0); //獲取第一張表
int rowNum = sheet.getPhysicalNumberOfRows();//得到資料的行數
System.out.println("行數:" + rowNum);
strLists.clear();
//遍歷行
for (int i = 0; i < rowNum; i++)
{
List<String> strList = new ArrayList<String>();
XSSFRow row = sheet.getRow(i);
int colNum = row.getPhysicalNumberOfCells();//得到當前行中存在資料的列數
//遍歷列
for (int j = 0; j < colNum; j++) {
XSSFCell cell = row.getCell(j);
strList.add(getXCellVal(cell));
}
strLists.add(i, (ArrayList<String>) strList); //儲存該行
}
//列印
for (ArrayList<String> stringList : strLists) {
for (String str : stringList) {
System.out.print(str + " ");
}
System.out.println();
}
wb.close();
return strLists;
}
/**
* @author: LS
* 2016-8-25 下午7:40:05
* @param cell
* @return String
* 獲取單元格中的值
*/
private String getXCellVal(XSSFCell cell) {
switch (cell.getCellType()) {
case XSSFCell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
val = fmt.format(cell.getDateCellValue()); //日期型
} else {
val = df.format(cell.getNumericCellValue()); //數字型
}
break;
case XSSFCell.CELL_TYPE_STRING: //文字型別
val = cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_BOOLEAN: //布林型
val = String.valueOf(cell.getBooleanCellValue());
break;
case XSSFCell.CELL_TYPE_BLANK: //空白
val = cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_ERROR: //錯誤
val = "錯誤";
break;
case XSSFCell.CELL_TYPE_FORMULA: //公式
try {
val = String.valueOf(cell.getStringCellValue());
} catch (IllegalStateException e) {
val = String.valueOf(cell.getNumericCellValue());
}
break;
default:
val = cell.getRichStringCellValue() == null ? null : cell.getRichStringCellValue().toString();
}
return val;
}
}