POI解析Excel,解决长数字变成科学计数法或double的问题

最近在做项目的时候需要用的POI解析Excel,该Excel中数据类型较多,有日期型,整型,double型,文本型。但是在处理时碰见了以下两个问题:

  1. 遇到数字类型时,虽然Excel中设置为文本类型,但是POI的Cell类型依然会变为数字类型,而且当数字比较长的时候,读取出来的结果还会变成科学计数法的形式。

  2. 数字无论是否为小数还是整型,当使用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;
}
}

Java读写Excel的三种方式见http://blog.csdn.net/sunglee_1992/article/details/53033644

你可能感兴趣的:(java,poi,Excel)