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

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值