답변:
나는 같은 문제가 있었다. 내가 그랬어 cell.setCellType(Cell.CELL_TYPE_STRING);
관계없이 사용자가 셀을 포맷하는 방법의 문제를 해결 문자열 값을 읽기 전에.
나는 당신이 질문을 할 때 우리 가이 수업을 다시 받았다고 생각하지 않지만 오늘은 쉬운 대답이 있습니다.
당신이하고 싶은 것은 DataFormatter 클래스를 사용하는 것 입니다. 이 셀을 전달하면 Excel에서 해당 셀에 대해 표시하는 내용이 포함 된 문자열을 반환하는 것이 가장 좋습니다. 문자열 셀을 전달하면 문자열이 다시 나타납니다. 서식 규칙이 적용된 숫자 셀에 전달하면 규칙에 따라 숫자의 서식이 지정되고 문자열이 다시 나타납니다.
귀하의 경우, 숫자 셀에 정수 서식 규칙이 적용되어 있다고 가정합니다. DataFormatter에 해당 셀의 서식을 지정하도록 요청하면 정수 문자열이 포함 된 문자열이 반환됩니다.
또한 많은 사람들이 할 것을 제안 cell.setCellType(Cell.CELL_TYPE_STRING)
하지만 Apache POI JavaDocs는 당신이 이것을해서는 안된다고 분명히 말하고 있습니다 ! javadocs 가 형식화가 남은 문자열로 변환하는 유일한 방법은 DataFormatter 클래스 를 사용하는 것만 설명 하므로 setCellType
호출을 수행하면 형식화가 느려 집니다.
When passed a null or blank cell, this method will return an empty String (""). Formulas in formula type cells will not be evaluated.
아래 코드는 모든 유형의 셀에 적합합니다.
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);
}
getCreationHelper().createFormulaEvaluator()
메서드를 통해 수식 평가기를 제공합니다 . 이렇게하면 코드가 HSSFFormulaEvaluator 클래스와 결합되지 않습니다.
FormulaEvaluator
이 솔루션에서 간단히 제거 할 수 있습니까 ? 목적에 부합합니까?
셀 유형을 수정하는 것이 바람직하지 않은 경우 다음 방법을 권장합니다.
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() )
숫자를 올바르게 형식화해야합니다.
2
하고 2.0
. 귀하의 솔루션은 이것을하지 않을 것입니다. (하지만 여전히, 스택 오버플로에 오신 것을 환영합니다!)
사용자가 숫자를 입력하기 전에 셀이 텍스트 형식이면 POI를 사용하여 값을 문자열로 얻을 수 있습니다. 한 가지 핵심은 셀의 왼쪽 상단 모서리에 작은 녹색 삼각형이 텍스트로 서식이 지정된 경우 값을 문자열로 검색 할 수 있다는 것입니다 (녹색 삼각형은 숫자로 표시 될 때마다 나타남) 텍스트 형식으로 변환됩니다). 숫자가 포함 된 텍스트 형식의 셀이 있지만 POI를 사용하여 해당 값을 문자열로 가져올 수없는 경우 스프레드 시트 데이터에서 수행 할 수있는 몇 가지 작업이 있습니다.
마지막으로 POI를 사용하여 Excel 2007 스프레드 시트에서 데이터를 얻는 경우 Cell 클래스 'getRawValue ()'메서드를 사용할 수 있습니다. 이것은 형식이 무엇인지 상관하지 않습니다. 단순히 원시 데이터가 포함 된 문자열을 반환합니다.
Apache POI 라이브러리를 사용하여 MS Excel의 숫자 셀 값을 읽으면 숫자로 읽습니다. 그러나 언젠가 우리는 문자열 (예 : 전화 번호 등)로 읽기를 원합니다. 이것이 내가 한 방법입니다.
첫 번째 셀 = CONCATENATE ( "!", D2)를 사용하여 새 열을 삽입하십시오. D2는 전화 번호 열의 셀 ID라고 가정합니다. 새 셀을 위로 드래그하여 끝냅니다.
이제 POI를 사용하여 셀을 읽으면 계산 된 값 대신 수식을 읽습니다. 이제 다음을 수행하십시오.
다른 열 추가
1 단계에서 생성 한 전체 열을 선택하고 편집-> 복사를 선택합니다.
3 단계에서 작성된 열의 맨 위 셀로 이동하여 편집-> 붙여 넣기 붙여 넣기를 선택하십시오.
열린 창에서 "값"라디오 버튼을 선택하십시오.
"확인"을 선택하십시오
이제 Java로 읽은 후 POI API를 사용하여 읽으십시오 ... 첫 번째 문자 즉 "!"를 제거하십시오.
나는 또한 수천 개의 숫자로 된 데이터 세트에서 비슷한 문제를 겪고 있으며 간단한 해결 방법을 찾았다 고 생각합니다. 별도의 DB 가져 오기에서 항상 숫자를 텍스트로 볼 수 있도록 아포스트로피를 숫자 앞에 삽입해야했습니다. 이 전에 숫자 8을 8.0으로 가져옵니다.
해결책:
이봐, 모든 숫자를 Presto하지만 텍스트로 저장했습니다.
이러한 답변 중 다수는 이전 POI 문서 및 클래스를 참조합니다. 최신 POI 3.16에서는 int 유형의 Cell 이 더 이상 사용되지 않습니다.
Cell.CELL_TYPE_STRING
대신 CellType 열거 형을 사용할 수 있습니다.
CellType.STRING
poi 의존성 및 poi-ooxml 의존성을 사용하여 pom을 새로운 3.16 버전으로 업데이트하십시오. 그렇지 않으면 예외가 계속 발생합니다. 이 버전의 한 가지 장점은 이전 답변에서 설명한 모든 추가 단계를 제거하면서 셀을 만들 때 셀 유형을 지정할 수 있다는 것입니다.
titleRowCell = currentReportRow.createCell(currentReportColumnIndex, CellType.STRING);
나는 오히려 윌의 대답이나 Vinayak Dornala의 길을 가고 싶습니다. 불행히도 그들은 내 공연에 많은 영향을 미쳤습니다. 나는 암시 적 캐스팅 의 HACKY 솔루션을 찾았습니다 .
for (Row row : sheet){
String strValue = (row.getCell(numericColumn)+""); // hack
...
내 상황에 따라 시스템 작동 방식으로 인해 작동했으며 신뢰할 수있는 파일 소스가 있었기 때문에이 작업을 수행하지 않는 것이 좋습니다.
각주 : numericColumn 처리 된 파일의 헤더를 읽은 후 생성되는 int입니다.
public class Excellib {
public String getExceldata(String sheetname,int rownum,int cellnum, boolean isString) {
String retVal=null;
try {
FileInputStream fis=new FileInputStream("E:\\Sample-Automation-Workspace\\SampleTestDataDriven\\Registration.xlsx");
Workbook wb=WorkbookFactory.create(fis);
Sheet s=wb.getSheet(sheetname);
Row r=s.getRow(rownum);
Cell c=r.getCell(cellnum);
if(c.getCellType() == Cell.CELL_TYPE_STRING)
retVal=c.getStringCellValue();
else {
retVal = String.valueOf(c.getNumericCellValue());
}
나는 이것을 시도하고 그것은 나를 위해 일했다
이 버그는 다음과 같은 사실에 근거하여 현재 버전의 POI에서 수행 할 수없는 것 같습니다.
https://issues.apache.org/bugzilla/show_bug.cgi?id=46136
여전히 탁월합니다.
cell.setCellType (Cell.CELL_TYPE_STRING); 나를 위해 잘 작동합니다
우리는 같은 문제가 있었고 사용자가 셀을 '텍스트'로 포맷 해야했습니다. 값을 입력 . 이렇게하면 Excel에서 짝수를 텍스트로 올바르게 저장합니다. 나중에 형식이 변경되면 Excel은 값이 표시되는 방식 만 변경하지만 값을 다시 입력하지 않으면 (예 : 셀에있을 때 return 키를 누름) 값이 저장되는 방식을 변경하지 않습니다.
Excel에서 값을 텍스트로 올바르게 저장했는지 여부는 셀에 숫자가 있지만 텍스트로 서식이 지정되어 있다고 생각되면 Excel이 셀의 왼쪽 상단 모서리에 표시하는 작은 녹색 삼각형으로 표시됩니다.
int로 캐스팅 한 다음을 수행하십시오 .toString()
. 추악하지만 작동합니다.