-
그런 내용의 Excel 파일이 있습니다.
-
A1 : SomeString
-
A2 : 2
모든 필드는 문자열 형식으로 설정됩니다.
-
-
POI를 사용하여 java에서 파일을 읽으면 A2가 숫자 셀 형식임을 나타냅니다.
- 문제는 A2의 값이 2 또는 2.0 일 수 있으며 (및 구별 할 수 있기를 원함) 사용할 수 없다는 것
.toString()
입니다.
문자열로 값을 읽으려면 어떻게해야합니까?
답변
나는 같은 문제가 있었다. 내가 그랬어 cell.setCellType(Cell.CELL_TYPE_STRING);
관계없이 사용자가 셀을 포맷하는 방법의 문제를 해결 문자열 값을 읽기 전에.
답변
나는 당신이 질문을 할 때 우리 가이 수업을 다시 받았다고 생각하지 않지만 오늘은 쉬운 대답이 있습니다.
당신이하고 싶은 것은 DataFormatter 클래스를 사용하는 것 입니다. 이 셀을 전달하면 Excel에서 해당 셀에 대해 표시하는 내용이 포함 된 문자열을 반환하는 것이 가장 좋습니다. 문자열 셀을 전달하면 문자열이 다시 나타납니다. 서식 규칙이 적용된 숫자 셀에 전달하면 규칙에 따라 숫자의 서식이 지정되고 문자열이 다시 나타납니다.
귀하의 경우, 숫자 셀에 정수 서식 규칙이 적용되어 있다고 가정합니다. DataFormatter에 해당 셀의 서식을 지정하도록 요청하면 정수 문자열이 포함 된 문자열이 반환됩니다.
또한 많은 사람들이 할 것을 제안 cell.setCellType(Cell.CELL_TYPE_STRING)
하지만 Apache POI JavaDocs는 당신이 이것을해서는 안된다고 분명히 말하고 있습니다 ! javadocs 가 형식화가 남은 문자열로 변환하는 유일한 방법은 DataFormatter 클래스 를 사용하는 것만 설명 하므로 setCellType
호출을 수행하면 형식화가 느려 집니다.
답변
아래 코드는 모든 유형의 셀에 적합합니다.
InputStream inp =getClass().getResourceAsStream("filename.xls"));
Workbook wb = WorkbookFactory.create(inp);
DataFormatter objDefaultFormat = new DataFormatter();
FormulaEvaluator objFormulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) wb);
Sheet sheet= wb.getSheetAt(0);
Iterator<Row> objIterator = sheet.rowIterator();
while(objIterator.hasNext()){
Row row = objIterator.next();
Cell cellValue = row.getCell(0);
objFormulaEvaluator.evaluate(cellValue); // This will evaluate the cell, And any type of cell will return string value
String cellValueStr = objDefaultFormat.formatCellValue(cellValue,objFormulaEvaluator);
}
답변
셀 유형을 수정하는 것이 바람직하지 않은 경우 다음 방법을 권장합니다.
if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
String str = NumberToTextConverter.toText(cell.getNumericCellValue())
}
NumberToTextConverter는 정밀도 손실없이 Excel의 규칙을 사용하여 이중 값을 텍스트로 올바르게 변환 할 수 있습니다.
답변
Poi의 JavaDocs ( https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Cell.html#setCellType%28int%29 ) 에서 이미 언급했듯이 다음을 사용하지 마십시오.
cell.setCellType(Cell.CELL_TYPE_STRING);
그러나 사용 :
DataFormatter df = new DataFormatter();
String value = df.formatCellValue(cell);
답변
예, 이것은 완벽하게 작동합니다
추천 :
DataFormatter dataFormatter = new DataFormatter();
String value = dataFormatter.formatCellValue(cell);
낡은:
cell.setCellType(Cell.CELL_TYPE_STRING);
cell
수식을 사용 하여 값을 검색하는 데 문제가 있어도 여전히 작동합니다.
답변
시험:
new java.text.DecimalFormat("0").format( cell.getNumericCellValue() )
숫자를 올바르게 형식화해야합니다.