2014-05-06 243 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版本,以防萬一(在變通辦法之前我已經嘗試了幾個不同的版本,沒有任何影響)。

相關問題