首页  ·  知识 ·  编程语言
POI导出Excel时设置单元格类型为数值类型
网友  CSDN博客  JAVA  编辑:许我半盏清茶   图片来源:网络
最近做的一个ITFIN的项目中,后台需要用POI实现导出功能,导出的数据中有文本格式,也有货币格式,所以为了方便在将来导出的表格中做计算,存放货币的单元格需要设置为数值类型。

  导出的Excel的单元格都是文本格式(单元格左上角有个小三角):

这里写图片描述

  费了不少功夫,终于把“小三角”去掉了,这里总结并分享一下问题的解决方法。 

  通过poi导出excel的过程大致是这样的:

     规定单元格的格式 
        ↓ 
      创建单元格 
        ↓ 
     设置单元格的格式 
        ↓ 
     设置数据的格式 
        ↓ 
    把数据存放到单元格中 
        ↓ 
      通过IO流输出


背景POI导出Excel时设置单元格类型为数值类型


  要想存放数值的单元格以数值类型导出,其中最关键的步骤就是上面加粗的两步,设置单元格的格式和向单元格中存放数据。

  核心代码如下:


 /**

     * 导出Excel-胡玉洋-2015年11月11日

     * 

     *@param outPutParam Excel数据实体,包括要导出的excel标头、列标题、数据等

     * */

    private void createContentRows(ExcelParam outPutParam) {

        HSSFWorkbook workbook=new HSSFWorkbook(); //创建一个Excel文件

        // 遍历集合数据,产生数据行

        for (int i = 0; i < outPutParam.getContent().size(); i++) {

            int rowIndex = i + 2;

            HSSFRow contentRow = sheet.createRow(rowIndex);

            Map<String, Object> rowDate = outPutParam.getContent().get(i);

            //遍历列

            for (int j = 0; j < outPutParam.getTitleList().size(); j++) {       

                Title headTitle = outPutParam.getTitleList().get(j);//获取第i行第j列列标题

                String headerName = headTitle.getName();//获取第j列列标识

                Object data = rowDate.get(headerName);//获取第i行第j列所放数据

                HSSFCellStyle contextstyle =workbook.createCellStyle();

                HSSFCell contentCell = contentRow.createCell(j);                

                Boolean isNum = false;//data是否为数值型

                Boolean isInteger=false;//data是否为整数

                Boolean isPercent=false;//data是否为百分数

                if (data != null || "".equals(data)) {

                    //判断data是否为数值型

                    isNum = data.toString().matches("^(-?\\d+)(\\.\\d+)?$");

                    //判断data是否为整数(小数部分是否为0)

                    isInteger=data.toString().matches("^[-\\+]?[\\d]*$");

                    //判断data是否为百分数(是否包含“%”)

                    isPercent=data.toString().contains("%");

                }


                //如果单元格内容是数值类型,涉及到金钱(金额、本、利),则设置cell的类型为数值型,设置data的类型为数值类型

                if (isNum && !isPercent) {

                    HSSFDataFormat df = workbook.createDataFormat(); // 此处设置数据格式

                    if (isInteger) {

                        contextstyle.setDataFormat(df.getBuiltinFormat("#,#0"));//数据格式只显示整数

                    }else{

                        contextstyle.setDataFormat(df.getBuiltinFormat("#,##0.00"));//保留两位小数点

                    }                   

                    // 设置单元格格式

                    contentCell.setCellStyle(contextstyle);

                    // 设置单元格内容为double类型

                    contentCell.setCellValue(Double.parseDouble(data.toString()));

                } else {

                    contentCell.setCellStyle(contextstyle);

                    // 设置单元格内容为字符型

                    contentCell.setCellValue(data.toString());

                }

            }

        }

    }

最后导出的正确格式:

这里写图片描述

image.png

本文作者:网友 来源:CSDN博客
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读