2014-09-24 21 views
0

我試圖用POI解析excel工作簿。在紙張,我有顯示爲一些數字:Apache POI:以字符串形式獲取數字,如excel中所示

(它是法國電話號碼,它總是以0開始,並有每2個數字的空格)。

我的需求是從excel單元格中獲得一個字符串,其中包含零和空格。

這裏是從我的調查,一些元素:

double doubleValue = cell.getNumericCellValue(); // worth 6.85856545E8 
String dataStringFormat = cell.getCellStyle().getDataStringFormat(); // worth 0#" "##" "##" "##" "## 

我想有是POI API的方式爲「dataStringFormat」適用於「中的doubleValue」獲得財產以後像06 85 85 65 45。

任何人都有我如何做到這一點的想法?

非常感謝。

編輯: 加格拉瓦爾讓我走了。他的

DataFormatter fmt = new DataFormatter(); 
String phoneNumber = fmt.formatCellValue(cell); 

仍然返回685856545但我感謝他,我找到了CellNumberFormatter類。並用以下代碼獲取我的06 85 85 65 45:

String stringFormat = cell.getCellStyle().getDataFormatString(); 
CellNumberFormatter fmt = new CellNumberFormatter(stringFormat); 
String phoneNumber = fmt.format(cell.getNumericCellValue()); // = 06 85 85 65 45 

我嘗試使用其他格式的技巧,但仍存在一些問題。 - 123 3/25變爲123 ??/?? (不支持部分格式?) - 1,23E + 09變1,23.1,E + 09

一些,因爲區域設置: - 123 456 789變爲123,456,789(分隔符爲千千萬萬我 '在法國',而不是''') - 123,12變成123.45(再次','是法語中的小數點分隔符,不是'。') - €變成了? (編碼在這裏?)

並且有時間和日期的奇怪行爲: -12:12:12 PM變成[$ -4.69] 12:00:42 AM([-4.69]是excel的一部分字符串格式,似乎並沒有被POI支持) -12/11/14變成01/01/04(我不明白那一個...)

我會嘗試調查這一點。

感謝您的幫助。

回答

3

Excel中的數字(除少數邊緣情況外)以浮點數形式存儲。 Java中的浮點數字格式化爲字符串時,將打印一個尾部小數點,並以科學(指數)格式(如果大)顯示,如圖所示

假設您真正想要的是「給我一個字符串看起來像Excel顯示的這個單元格「,然後不要調用cell.toString(),並且不要將數字double值+ print作爲字符串獲取。這些不會給你你需要的東西。

相反,你需要使用DataFormatter class,它提供了讀應用於單元格的Excel格式規則的方法,然後重新創建(因爲它最好的)那些用Java

你的代碼應該是:

DataFormatter fmt = new DataFormatter(); 

String phoneNumber = fmt.formatCellValue(cell); 

這將格式化基於在Excel中應用的格式規則的數量,所以你指望

+0

非常感謝。你的建議並不適合我(我不明白爲什麼),但它讓我走上了路,看到我的編輯,找到我找到的解決方法。 – 2014-09-25 08:31:48

+0

聽起來像你正在使用POI尚未完全處理的格式字符串。因此,您需要向Apache POI項目報告錯誤,並提供一個顯示問題的小電子表格,以便能夠修復 – Gagravarr 2014-09-25 09:58:49

+0

好的,我會用我用來測試的電子表格報告。謝謝你的幫助。 – 2014-09-25 11:50:02

-1

當您嘗試獲取數字小區字符串,你會得到一個錯誤應該返回尋找它。

您應該在獲取數字單元格之前將cellType設置爲像下面那樣的字符串。

` HSSFCell yourCell = sheet1.getRow(row).getCell(column); 
    yourCell.setCellType(Cell.CELL_TYPE_STRING); 
    String data = yourCell.getStringCellValue();` 
+0

您是否[嘗試閱讀您提到的方法的javadocs](https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29)?只有他們非常明確地表示你不應該使用'setCellType(Cell.CELL_TYPE_STRING);'來獲取數字單元格作爲字符串,因爲它沒有格式化! – Gagravarr 2016-06-13 09:45:51

+0

需要解決方案..它工作正常..檢查你的結局:)在給任何人-1之前想想。 – 2016-06-13 10:29:48

+0

它可能在某些情況下工作,但正如文檔中明確指出的那樣,它不會起作用。文檔也指出了正確的解決方案,所以建議人們使用已知有問題的東西不是一個好主意! – Gagravarr 2016-06-13 11:13:36

相關問題