精华内容
下载资源
问答
  • poi 设置单元格数值型

    2020-08-19 16:36:08
    cell.setValue(Double类型,或者integer类型的值即可); cell.setValue("");----------这样写,该单元格就不是数值型,不能参与计算。

    cell.setValue(Double类型,或者integer类型的值即可);

     

    cell.setValue("");----------这样写,该单元格就不是数值型,不能参与计算。

    展开全文
  • 最近做的一个ITFIN的项目中,导出的数据中有文本格式,也有货币格式,所以为了方便在将来导出的表格中做计算,存放货币先用正则表达式判断数据是否为数值型,如果为数值型,则设置单元格格式整数或者小数;...




    背 景


      最近做的一个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());
    				}
    			}
    		}
    	}
    

      如上,有两个比较重要的点:
      1、先用正则表达式判断数据是否为数值型,如果为数值型,则设置单元格格式为整数或者小数;
      2、然后往单元格中存放数据的时候要设置数据的格式为double类型,如果查看poi的源码HSSFCell.java会发现设置数据的方法如下,所以用setCellValue(double)方法即可。

    这里写图片描述


    优化

      到了这里,您可能以为万事大吉啊了,其实上面的代码有个陷阱,如果不经过大数据量的测试是发觉不出来的哦~~

      如果数据量大的话,系统可能会报错“The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook”,原因是style创建的次数太多了,解决这个问题的方法很简单,在循环体外面创建单元格格式contextstyle(即把它当成一个“全局”变量),不要在循环内部创建。

      正确的代码如下:

    	/**
    	 * 导出Excel-2015年11月11日
    	 * 
    	 *@param outPutParam Excel数据实体,包括要导出的excel标头、列标题、数据等
    	 * */
    	private void createContentRows(ExcelParam outPutParam) {
    		HSSFWorkbook workbook=new HSSFWorkbook(); //创建一个Excel文件
    		HSSFCellStyle contextstyle =workbook.createCellStyle();
    		// 遍历集合数据,产生数据行
    		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列所放数据
    				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());
    				}
    			}
    		}
    	}
    

      最后导出的正确格式:

    这里写图片描述




    【 转载请注明出处——胡玉洋《POI导出Excel时设置单元格类型为数值类型》


    展开全文
  • 最近做的一个ITFIN的项目中,后台需要用POI实现导出功能,导出的数据中有文本格式,也有货币格式,所以为了方便在将来导出的表格中做计算,存放货币的单元格需要设置为数值类型。  导出的Excel的单元格都是文本...

    最近做的一个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());
                    }
                }
            }
        }
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

      如上,有两个比较重要的点: 
      1、先用正则表达式判断数据是否为数值型,如果为数值型,则设置单元格格式为整数或者小数; 
      2、然后往单元格中存放数据的时候要设置数据的格式为double类型,如果查看poi的源码HSSFCell.java会发现设置数据的方法如下,所以用setCellValue(double)方法即可。

       这里写图片描述


    优化


      到了这里,您可能以为万事大吉啊了,其实上面的代码有个陷阱,如果不经过大数据量的测试是发觉不出来的哦~~

      如果数据量大的话,系统可能会报错“The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook”,原因是style创建的次数太多了,解决这个问题的方法很简单,在循环体外面创建单元格格式contextstyle(即把它当成一个“全局”变量),不要在循环内部创建。

      正确的代码如下:

        /**
         * 导出Excel-胡玉洋-2015年11月11日
         * 
         *@param outPutParam Excel数据实体,包括要导出的excel标头、列标题、数据等
         * */
        private void createContentRows(ExcelParam outPutParam) {
            HSSFWorkbook workbook=new HSSFWorkbook(); //创建一个Excel文件
            HSSFCellStyle contextstyle =workbook.createCellStyle();
            // 遍历集合数据,产生数据行
            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列所放数据
                    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());
                    }
                }
            }
        }
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

      最后导出的正确格式:

    这里写图片描述

    展开全文
  • 最近做项目遇到的坑,百度了半天导出都货币类型、自定义类型和常规类型,,,最后终于解决,在此记录一下 ... * 设置Excel单元格为数值类型便于公式运算 * * @param workbook * @param contextstyle

    最近做项目遇到的坑,百度了半天导出都为货币类型、自定义类型和常规类型,,,最后终于解决,在此记录一下

    其中contextstyle.setDataFormat(df.getFormat("0_ "));要特别注意"0_ ",下划线后面有一个空格!!!,缺少空格则不会导出为数值类型。

    注意空格!!!注意空格!!!注意空格!!!

    
    /**
         *  设置Excel单元格为数值类型便于公式运算
         *
         * @param workbook
         * @param contextstyle
         * @param cell
         * @param data
         */
        public static void setNumberFormat(SXSSFWorkbook workbook, CellStyle contextstyle, SXSSFCell cell,Object data){
            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("%");
            }
    
            //如果单元格内容是数值类型,设置data的类型为数值类型
            if (isNum && !isPercent) {
                // 此处设置数据格式
                DataFormat df = workbook.createDataFormat();
                if (isInteger) {
                    contextstyle.setDataFormat(df.getFormat("0_ "));//数据格式只显示整数
                }else{
                    contextstyle.setDataFormat(df.getFormat("0.00_ "));//保留两位小数点
                }
                // 设置单元格格式
                cell.setCellStyle(contextstyle);
                // 设置单元格内容为double类型
                cell.setCellValue(Double.parseDouble(data.toString()));
            } else {
                if (data != null && !"".equals(data)) {
                    cell.setCellStyle(contextstyle);
                    // 设置单元格内容为字符型
                    cell.setCellValue(data.toString());
                }
            }
        }
    
    展开全文
  • XSSFDataFormat format = wb.createDataFormat...如果getFormat()里参数“0”或者“0.00”,均显示自定义格式,不显示数值类型。 采用上面的代码则总是显示货币类型。网上查了很多资料都没有解决。不知道是什么问题。
  •  最近做的一个ITFIN的项目中,后台需要用POI实现导出功能,导出的数据中有文本格式,也有货币格式,所以为了方便在将来导出的表格中做计算,存放货币的单元格需要设置为数值类型。  导出的Excel的单元格都是文本...
  • JAVA POI导出Excel设置单元格类型

    千次阅读 2019-01-15 17:10:54
    HSSFRow Row = sheet.createRow(sheet.getLastRowNum()+1); Row.getCell(0).setCellType...//设置单元格为数值类型 Row.getCell(0).setCellType(HSSFCell.CELL_TYPE_STRING);//设置单元格为字符串类型 Row.get...
  • POI 设置Excel单元格为文本格式

    千次阅读 2013-03-23 13:16:16
    实际开发过程中通常用到的就是从数据库导出EXCEL表格了,JXL可以这样做,其实POI也可以(关于JXL与POI的异同可访问我之前总结的文章),之前写过POI对七种文档(当然也包括EXCEL)的内容读取操作的文章,这次要写的就...
  • 从数据库获取到数据100.10,使用poi设置到Excel单元格内,单元格里显示了100.10,可以上面的编辑框内显示100.099912323333,小数点后有了12位,这是什么?
  • Java操作EXCEL的利器一般都是POI和JXL,鄙人只是POI的忠实粉丝。(其实我是没有用过JXL)。 现在大多数的excel都是07以上的版本,所以我一般是用07的基础上使用POI。 一、读取单元格 单元格有样式和值,以及...
  • 在实际工作中,我们处理的Excel数据都不止限于字符数据,更多的是数字、日期、甚至公式等。 下面是单元格类型说明: 类型   CELL_TYPE_BLANK 空值(cell不空) CELL_TYPE_BOOLEAN
  •  //单元格格式  HSSFCellStyle style = workBook.createCellStyle();  style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//对齐方式  style.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框  style....
  • POI,HSSF,XSSF对excel单元格格式设置

    千次阅读 2013-10-22 14:29:00
    实际开发过程中通常用到的就是从数据库导出EXCEL表格了,JXL可以这样做,其实POI也可以(关于JXL与POI的异同可访问我之前总结的 文章 ),之前写过POI对七种文档(当然也包括EXCEL)的内容读取操作的 文章 ,这次要写的...
  • 1.对Excel表格进行处理可以达到消除出现小数后缀的情况,具体操作。... 在读取到单元格内容后,用数据格式化工具进行格式化为不带小数  的字符串例如:DecimalFormat dfs = new DecimalFormat("0");
  • (可以解析文本、日期、数值、公式单元格、布尔、空值)1、解析数值型保留两位小数,日期格式yyyy-mm-dd以及公式型单元格/** * 获取cell中的值 * @param cell * @return */ private String getCellValue...
  • SpringBoot中使用POI实现Excel导入到数据库(图文教程已实践): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/88660466 需求 在进行导入时,在导入数据库之前需要进行时间格式的验证,确保不会乱...
  • 本篇文章分享一些在做导入导出EXCEL功能时用到的工具类的一些代码。 /** * @param cell * @return ...当单元格的格式数字或其他格式时,这句代码就会报错,在开发时一定要注意。
  • 1,前提 ...3,判断文件类型是否表格 4,读取第一个工作页sheet 5, 读取标题栏 6,读取内容 import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; imp
  • 一、POI设置Excel表格的单元格格式(在导出Excel表时设置各个单元格格式) 1、Excel的单元格格式  图中的数据有数值、货币、时间、日期、文本等格式。这些数据格式在POI中的HSSFDataFormat类里都有相应的定义...
  • POI读取Excel中处理纯数字的单元格

    千次阅读 2013-07-24 17:39:31
    当用户在一个单元格中输入1000的时候,POI需要用getNumericCellValue()来获得值,此时尽管你在excel中将该单元格设置成Text。 如果你坚持用getStringCellValue()肯定报错如下: Cannot get a text value from ...
  • POI Excel转word 单元格部分下标及单元格内容居中 POI读数浮点问题解决 本文章只做记录,这次需求比较特殊,大家具体情况和需求具体解决 xlsx转docx 由于项目需求,对Excel转word有比较特殊的要求,尝试了...
  • 使用POI对EXCEL进行单元格的合并

    千次阅读 2015-12-04 15:37:28
    前段时间我们老大交给我一任务,就是让我使用POI将EXCEL中的单元格进行合并,于是我就使用了sheet.addMergedRegion(new Region(1,(short)2,5,(short)9)),简单的合并了第2-5行,和第3-10列这个区域,可是我后来了解到...
  • JAVA设置EXCEL单元格为文本格式

    万次阅读 2013-04-28 13:18:41
    //新增的四句话,设置CELL格式文本格式 HSSFCellStyle cellStyle2 = demoWorkBook.createCellStyle(); HSSFDataFormat format = demoWorkBook.createDataFormat(); cellStyle2.setDataF
  • 实际开发过程中通常用到的就是从数据库导出EXCEL表格了,JXL可以这样做,其实POI也可以(关于JXL与POI的异同可访问我之前总结的文章),之前写过POI对七种文档(当然也包括EXCEL)的内容读取操作的文章,这次要写的就...
  • 本例子使用的是HSSF,...设定输入类型为数值 import org.apache.poi.hssf.usermodel.DVConstraint; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 877
精华内容 350
关键字:

poi设置单元格为数值型