Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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中使用ApachePOI删除Excel中的警告?_Java_Excel_Apache Poi - Fatal编程技术网

如何在JAVA中使用ApachePOI删除Excel中的警告?

如何在JAVA中使用ApachePOI删除Excel中的警告?,java,excel,apache-poi,Java,Excel,Apache Poi,我正在使用apachepoiapi在我的java应用程序中生成Excel工作表。excel中设置的数据以字符串类型动态显示对于第1列,值为字母数字。当我生成Excel时,它会给我绿色指示,并在单元格上警告“数字存储为文本”或“文本日期为两位数年份” 我想删除那个警告。 我发现,从excel中,我们可以将单元格标记为“忽略错误”,以忽略警告 如何以编程方式完成此任务,或者是否有其他替代方法来完成此任务 我还附上了一个屏幕截图,显示了带有绿色标记的警告 代码: if (cellValue != n

我正在使用
apachepoiapi
在我的java应用程序中生成Excel工作表。excel中设置的数据以字符串类型动态显示对于第1列,值为字母数字。当我生成Excel时,它会给我绿色指示,并在单元格上警告“数字存储为文本”或“文本日期为两位数年份”

我想删除那个警告。 我发现,从excel中,我们可以将单元格标记为“忽略错误”,以忽略警告

如何以编程方式完成此任务,或者是否有其他替代方法来完成此任务

我还附上了一个屏幕截图,显示了带有绿色标记的警告

代码:

if (cellValue != null && (shouldBeRightAlign))
{
 cellType = Cell.CELL_TYPE_NUMERIC;
}
else if (cellValue != null)
{
 cellType = Cell.CELL_TYPE_STRING;
}
cell.setCellValue(cellValue);

设置
单元格类型
如下:

HSSFRow row = sheet.createRow(sheet.getLastRowNum());
HSSFCell cell = row.createCell(0);
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
对于字母数字和
字符
单元格类型将为
单元格。单元格类型\u字符串
对于数字,单元格类型将为
单元格类型\u数字


您可以从和文档中获得有关单元格类型的更多信息。

旧的,但它仍然可以帮助.NET中使用NPOI的人

我试过了

cell.SetCellType(NPOI.SS.UserModel.CellType.NUMERIC); 
这根本没用。但是下面的代码可以工作

dCell.setCellValue(Convert.ToDouble(112.45)); //.NET syntax

dCell.setCellValue(new Double("123"));  // Java Syntax

我也面临同样的问题。我通过检查数据是否为整数/浮点并相应地设置条件(CELL_TYPE)来解决这个问题。请查找代码段:

if(!isInteger(data))
            {
            cell.setCellValue(data);
            }
            else
            {
                cell.setCellType(Cell.CELL_TYPE_NUMERIC);
                cell.setCellValue(Float.parseFloat(data));//.parseInt(data));   
            }
public static boolean isInteger(String s) {
    try { 
        java.lang.Float.parseFloat(s); 
    } catch(NumberFormatException e) { 
        return false; 
    }
    return true;
}
此处数据是数据源(excel/csv)列表数组中的字符串
这解决了绿色警告问题

显然,这在Apache POI中目前是不可能的。关于该主题,有许多错误报告/RFE:

实际属性(表示忽略此类警告的属性)以Excel持久格式存在,并按每个单元格记录。从bug报告中我可以看出,只是apachepoi没有公开它

要让您了解Excel的xlsx格式的外观,请执行以下操作:

</worksheet>
    ...
    <ignoredErrors>
        <ignoredError sqref="K192 E181 E186" numberStoredAsText="1"/>
    </ignoredErrors>    
</worksheet>

...
我在某个地方读到过,这只在
xlsx
(即OOXML)中持久化,而不是以
xls
格式持久化,这意味着如果Apache POI团队实现了这一点,它将在XSSF包中。


对我来说,上面的解决方案都不起作用,但最后用一种复杂的解决方法摆脱了警告:将值写成这样的公式

String asFormula = "\"" + value + "\"";
cell.setCellType(SXSSFCell.CELL_TYPE_FORMULA);
cell.setCellFormula(asFormula);
不要认为这总是一个好的解决方案,但在我的例子中,输出文件的值永远不会被修改。但它可能会帮助某些人


我正在使用ApachePOI的3.14版,以防有所不同(在解决方案之前,我尝试了几个不同的版本,但没有效果)。

我知道问题提出已经很久了,但仍然。。。 你试过这个吗:

DataFormat df = workbook.createDataFormat();
cellStyle.setDataFormat(df.getFormat("@"));

古老但仍然相关

您应该在文本中使用“.”作为小数分隔符,并将单元格格式设置为数字

还可以使用带有de模式“#.00”的数据格式,瞧!没有警告,一切都会好起来的

cell.setCellType(Cell.CELL_TYPE_NUMERIC);
cell.setCellValue(Double.parseDouble(data));
DataFormat format = hwb.createDataFormat();
CellStyle numbercellStyle = hwb.createCellStyle();
numbercellStyle.setDataFormat(format.getFormat("#.00"));
cell.setCellStyle(numbercellStyle);

很简单,您也可以在poi 4.1.1中使用以下代码


cell.setCellValue(Double.parseDouble(yourvalue))

你不能用数字、日期、字符串等适当的数据格式设置单元格值吗?我也尝试过,但仍然不起作用。@vels4j我这样做了,但仍然存在相同的问题。检查此答案的可能重复请参阅编辑的问题,我在其中提到,对于column1,值是字母数字。它可能有字符,也可能只有数字。但你仍然会得到警告,他的问题是删除warnings@CharveeShah检查编辑后的答案。您必须在Java端检查数据类型是否为
Character
,然后使用
CELL\u-type\u-STRING
CELL\u-type\u-NUMERIC
作为数字。@vels4j通过设置单元格类型,警告将被删除。@Vishrant数据类型将始终为字符串。该值不是具体的数字。它可以是数字,也可以是数字字母数字。@CharveeShah那么字符串是什么?CellType的用途是什么?值来自mysql查询。因此,第1列既有字母数字值,也有数字值。当只有数字值出现时,则显示绿色指示器。第5列的数据带有“,”值。在那个里也有绿色的指示器。我已经做了,但我仍然面临问题,因为在数据中我得到了1,00类型值和逗号,所以它给了我关于parseFloat方法的错误。你可以添加包含整数的列。private static ArrayList intColRef=new ArrayList(){{for(int i=0;所有值都是动态生成的,只是格式相同。在一种情况下,可能我拥有所有字符串值。或值的组合。我没有预定义的值。Apache POI实际上对HSSF和XSSF的这些忽略提供了大多数低级支持,它只是在等待有人提出一个合理的高级API设计,以一种更加用户友好的形式包装它们。如果你能想出一个好的方法,请为这些bug贡献力量!@Gagravarr。是的。但是在OOXML中,它非常简单,不需要任何抽象。你只需要一个新方法:
XSSFSheet.setIgnoredErrors(Set x,Set y)
然后忘记支持XLS格式的此功能。我添加了跟踪此.cell.setCellType(SXSSFCell.cell\u TYPE\u公式);这解决了我的问题,谢谢:)
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
cell.setCellValue(Double.parseDouble(data));
DataFormat format = hwb.createDataFormat();
CellStyle numbercellStyle = hwb.createCellStyle();
numbercellStyle.setDataFormat(format.getFormat("#.00"));
cell.setCellStyle(numbercellStyle);