2014-05-06 246 views
8

我正在使用apache poi api在我的应用程序中使用java生成Excel工作表。在excel中设置的数据将通过字符串类型动态传递。 对于column1,值为字母数字。当我生成Excel时,它会给我一个警告的绿色指示“数字存储为文本”“文本日期,2位数年份” on cell。如何在JAVA中使用apache poi在Excel中删除警告?

我想删除该警告。 我发现从excel中我们可以标记一个单元格为'忽略错误',忽略这个警告。

如何以编程方式执行此操作,还是有任何其他方法可以实现此任务吗?

我也附上了绿色标记显示警告的截图。

enter image description here

代码:

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

你不能设置单元格值与适当的数据格式,如数字,日期,字符串等,? – vels4j

+0

我也试过这也,但仍然不工作.. – unknown

+0

@ vels4j我做到了,但仍然有同样的问题。 –

回答

1

设置cell type等:

HSSFRow row = sheet.createRow(sheet.getLastRowNum()); 
HSSFCell cell = row.createCell(0); 
cell.setCellType(Cell.CELL_TYPE_STRING); 
cell.setCellType(Cell.CELL_TYPE_NUMERIC); 

对于字母数字和Character细胞类型将是Cell.CELL_TYPE_STRING对数的,细胞类型将CELL_TYPE_NUMERIC

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

+1

请参阅已编辑的问题,其中我提到column1的值为字母数字。它可能有字符或只能是数字。 –

+2

但你仍然会收到警告,他的问题是删除警告 – vels4j

+0

@CharveeShah检查编辑的答案。如果数据类型是'Character',那么你必须在Java端检查,然后使用'CELL_TYPE_STRING'或'CELL_TYPE_NUMERIC'作为编号。 – Vishrant

0

旧但仍这将有助于从.NET有的一个谁使用NPOI

cell.SetCellType(NPOI.SS.UserModel.CellType.NUMERIC); 

这并没有帮助在所有尝试。但下面的代码将工作

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

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

该值不具体,它将是数字。它可以是数字或可以是字母数字。 –

+0

@CharveeShah什么是字符串呢? CellType的用途是什么? – Peru

+0

值来自mysql query.So第一列只有值字母数字或数字值。当只有数字值时,它显示绿色指标。而对于第5列数据来与“,”价值。在那也绿色指标是那里。 –

0

我正面临同样的问题。我通过检查数据来解决它,如果它是一个Integer/Float并相应地放置条件(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) 数组这解决了绿色警告的字符串。

+0

我已经这样做了,但仍然面临数据问题,因为我得到1,00类型值逗号,所以它给了我错误的parseFloat方法。 –

+0

您可以添加具有整数的列。私有静态的ArrayList intColRef =新的ArrayList (){{ \t \t对(INT I = 0; I <= 10;我++) \t \t { \t \t \t加载(ⅰ); \t \t} \t \t}};如果(!intColRef.contains(cellNum)) { cells.setCellValue(each); } else { cells.setCellType(Cell.CELL_TYPE_NUMERIC); cells.setCellValue(Integer.parseInt(each)); } –

+0

所有的值都是动态的,只有格式相同。在一种情况下,我可能有所有的字符串值。或值的组合。我没有预定义值。 –

2

显然这对于​​Apache POI目前不可行。有关于这个问题的一些bug报告/ RFEs的:

https://issues.apache.org/bugzilla/show_bug.cgi?id=58641

https://issues.apache.org/bugzilla/show_bug.cgi?id=54868

https://issues.apache.org/bugzilla/show_bug.cgi?id=46136

的实际属性(即说要忽略这些警告的属性)存在于Excel中持续格式并按每个小区记录。就我从错误报告中可以看出,Apache POI并不公开它。

为了给你什么,这看起来像在Excel的XLSX格式的想法:

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

我读的地方,这是坚持只在xlsx(即OOXML),而不是在xls格式,这意味着如果和当Apache POI团队实现这一点,它将在XSSF包中。

+0

对于HSSF和XSSF,Apache POI实际上拥有大部分对这些忽略的低级支持,它只是在等待有人提出了一个明智的高级API设计,并将它们包装成更友好的形式。如果你能想到一个好的方法来做到这一点,请为这些错误做出贡献! – Gagravarr

+0

@Gagravarr。是啊。但是在OOXML中,它非常简单,不需要抽象,恕我直言。你只需要一个新的方法:'XSSFSheet.setIgnoredErrors(Set x,Set y)',然后忘记支持XLS格式的这个特性。我已添加[RFE 58641](https://issues.apache.org/bugzilla/show_bug.cgi?id=58641)来跟踪此问题。 – peterh

0

对于我来说,没有上述工作的解决方案,但最终摆脱了警告带着几分令人费解的解决方法:书面方式的值这样的公式。

String asFormula = "\"" + value + "\""; 
cell.setCellType(SXSSFCell.CELL_TYPE_FORMULA); 
cell.setCellFormula(asFormula); 

不要以为它总是一个很好的解决方案,但在我的情况下,输出文件的值永远不会被修改。但它可能有助于某人。

我使用的是Apache POI的3.14版本,以防万一(在变通办法之前我已经尝试了几个不同的版本,没有任何影响)。

相关问题