Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Apache POI写入数据时删除excel单元格中小数点的单元格格式_Java_Excel_Spring_Apache Poi - Fatal编程技术网

Java 使用Apache POI写入数据时删除excel单元格中小数点的单元格格式

Java 使用Apache POI写入数据时删除excel单元格中小数点的单元格格式,java,excel,spring,apache-poi,Java,Excel,Spring,Apache Poi,我使用ApachePOI将一个Excel函数写入一个单元格,并对该函数进行求值。我需要做的是删除单元格中的所有小数点。目前,每个单元格值的末尾都会出现不必要的两个零。单元格格式如下所示。但它总是在最后得到两个零 XSSFCellStyle cellStyle = cell.getCellStyle(); DataFormat df = workbook.createDataFormat(); cellStyle.setDataFormat(df.getFormat(

我使用ApachePOI将一个Excel函数写入一个单元格,并对该函数进行求值。我需要做的是删除单元格中的所有小数点。目前,每个单元格值的末尾都会出现不必要的两个零。单元格格式如下所示。但它总是在最后得到两个零

     XSSFCellStyle cellStyle = cell.getCellStyle();
     DataFormat df = workbook.createDataFormat();
     cellStyle.setDataFormat(df.getFormat("###,##0"));
     cell.setCellStyle(cellStyle);


     if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
          evaluator.evaluateFormulaCell(cell);
      }
我参考了以下URL和其他几个站点,但找不到修复错误的方法

  • 注意
    我在Spring 4.3.1.RELEASE中使用Apache POI 3.14版。

    尝试为工作簿创建单元格样式,并将此样式与
    “#,##0”
    数字格式应用于列中的所有单元格:

    CellStyle style = workbook.createCellStyle();
    DataFormat format = workbook.createDataFormat();
    style.setDataFormat(format.getFormat("#,##0"));
    cell.setCellStyle(style);
    
    从工作簿创建样式是最佳方式,并且不会使内存过载

    您还可以调整公式,将数字四舍五入到小数点后0位:

    =ROUND(A1,0)
    

    尝试为工作簿创建单元格样式,并使用
    “#,##0”
    数字格式为列中的所有单元格应用此样式:

    CellStyle style = workbook.createCellStyle();
    DataFormat format = workbook.createDataFormat();
    style.setDataFormat(format.getFormat("#,##0"));
    cell.setCellStyle(style);
    
    从工作簿创建样式是最佳方式,并且不会使内存过载

    您还可以调整公式,将数字四舍五入到小数点后0位:

    =ROUND(A1,0)
    

    所以基本上,如果您在java中使用POI库,数字列单元格总是返回双精度格式,因为POI只支持双精度数字格式,我提到了链接

    如果您希望获得列中所示的原始值,那么要克服这个问题,下面是一个简单的解决方案

    cell.getNumericCellValue()
    返回一个结果时,如果它是一个没有小数点的正常数字,则返回一个小数点0。例如,如果它显示在工作表410中,则返回410.0

    因此,当您尝试从单元格中获取值时,需要添加以下代码以获得准确的结果

    例如
    String cellValue=format(cell.getNumericCellValue()+)

    public static String format(String val){
        String stringVal = String.valueOf(val);
        String[] number = stringVal.split( "[.]" );
        if(number.length>1 && number[1].equalsIgnoreCase("0")){
            return number[0];                               
        } else {
            return val;
        }
    }
    

    所以基本上,如果您在java中使用POI库,数字列单元格总是返回双精度格式,因为POI只支持双精度数字格式,我提到了链接

    如果您希望获得列中所示的原始值,那么要克服这个问题,下面是一个简单的解决方案

    cell.getNumericCellValue()
    返回一个结果时,如果它是一个没有小数点的正常数字,则返回一个小数点0。例如,如果它显示在工作表410中,则返回410.0

    因此,当您尝试从单元格中获取值时,需要添加以下代码以获得准确的结果

    例如
    String cellValue=format(cell.getNumericCellValue()+)

    public static String format(String val){
        String stringVal = String.valueOf(val);
        String[] number = stringVal.split( "[.]" );
        if(number.length>1 && number[1].equalsIgnoreCase("0")){
            return number[0];                               
        } else {
            return val;
        }
    }
    

    单元格样式是工作簿范围,Excel的最大值非常低。如果你一开始只创建一次样式并重新使用它会发生什么?@Gagravarr,谢谢你的想法。但是我只发布了所需的代码。我对列中的每个单元格都使用这种样式。不管怎样,你有什么办法解决我的问题吗?单元格样式是工作簿范围,Excel的最大值很低。如果你一开始只创建一次样式并重新使用它会发生什么?@Gagravarr,谢谢你的想法。但是我只发布了所需的代码。我对列中的每个单元格都使用这种样式。不管怎样,你有什么办法解决我的问题吗?这样我以前的手机风格就消失了。所以我所做的就是得到前面的cellstyle,如下所示,
    XSSFCellStyle-cellstyle=cell.getCellStyle()style.cloneStyleFrom(cellStyle)XSSFCellStyle-cellstyle=cell.getCellStyle()style.cloneStyleFrom(cellStyle)