Excel 셀의 숫자 문자열을 숫자가 아닌 문자열로 어떻게 읽을 수 있습니까?


146
  1. 그런 내용의 Excel 파일이 있습니다.

    • A1 : SomeString

    • A2 : 2

    모든 필드는 문자열 형식으로 설정됩니다.

  2. POI를 사용하여 java에서 파일을 읽으면 A2가 숫자 셀 형식임을 나타냅니다.

  3. 문제는 A2의 값이 2 또는 2.0 일 수 있으며 (및 구별 할 수 있기를 원함) 사용할 수 없다는 것 .toString()입니다.

문자열로 값을 읽으려면 어떻게해야합니까?

답변:


319

나는 같은 문제가 있었다. 내가 그랬어 cell.setCellType(Cell.CELL_TYPE_STRING);관계없이 사용자가 셀을 포맷하는 방법의 문제를 해결 문자열 값을 읽기 전에.


나는 poi-3.8-beta4를 사용하고 예상대로 작동합니다! TS는 이것을 왜 대답으로 받아들이지 않습니까?
swdev

POI 숫자에서 문자열로의 변환은 시스템 로케일을 고려하지 않으며 항상 점을 소수점 구분 기호로 사용합니다. 예를 들어, 시스템에서 ","를 사용하고 Excel 숫자가 "1,9"와 같은 경우 POI는 대신 "1.9"를 반환합니다.
Alexey Berezkin

53
Apache POI javadocs는 명시 적으로 이렇게하지 말 것을 명심 하십시오! 그들이 설명 하듯이, 대신 DataFormatter를 사용해야합니다
Gagravarr

6
이에 대한 가그 라바의 경고가 맞습니다! 문서에서 : "원하는 작업은 숫자 셀의 문자열 값을 얻는 것입니다. 중지하십시오!이 방법은 아닙니다. 대신 숫자 또는 부울 또는 날짜 셀의 문자열 값을 가져 오는 데 사용하십시오. 대신 DataFormatter. " poi.apache.org/apidocs/org/apache/poi/ss/usermodel/… 실수로 변경하려는 데이터가 손상 될 때까지이 기술을 직접 사용하고있었습니다. (유형을 문자열로 설정하고, 값을 읽고, 유형을 다시 숫자로 설정하고, 다시 읽고 다른 숫자 값을 얻으십시오!)
Chris Finley

6
DataFormatter를 사용하십시오. Javadoc은 위의 방법을 사용하지 말 것을 경고합니다.
Balu SKT

96

나는 당신이 질문을 할 때 우리 가이 수업을 다시 받았다고 생각하지 않지만 오늘은 쉬운 대답이 있습니다.

당신이하고 싶은 것은 DataFormatter 클래스를 사용하는 것 입니다. 이 셀을 전달하면 Excel에서 해당 셀에 대해 표시하는 내용이 포함 된 문자열을 반환하는 것이 가장 좋습니다. 문자열 셀을 전달하면 문자열이 다시 나타납니다. 서식 규칙이 적용된 숫자 셀에 전달하면 규칙에 따라 숫자의 서식이 지정되고 문자열이 다시 나타납니다.

귀하의 경우, 숫자 셀에 정수 서식 규칙이 적용되어 있다고 가정합니다. DataFormatter에 해당 셀의 서식을 지정하도록 요청하면 정수 문자열이 포함 된 문자열이 반환됩니다.

또한 많은 사람들이 할 것을 제안 cell.setCellType(Cell.CELL_TYPE_STRING)하지만 Apache POI JavaDocs는 당신이 이것을해서는 안된다고 분명히 말하고 있습니다 ! javadocs 가 형식화가 남은 문자열로 변환하는 유일한 방법은 DataFormatter 클래스 를 사용하는 것만 설명 하므로 setCellType호출을 수행하면 형식화가 느려 집니다.


감사합니다 @Gagravarr 당신의 대답 만 나를 위해, <code> cell.setCellType (Cell.CELL_TYPE_STRING); <code> 2.2 값을 2.2000000000000002로 변환하지만 2.2를 원합니다. 그것은 문자열 형식의 감사에 아무것도 반환
ankush 야다 브

dataformatter는 수식 셀에서 작동하지 않는 것 같습니다. 값 대신 수식의 문자열 표현을 반환합니다.
gaurav5430

1
단 하나의 사소한 참고 사항 : 제공된 링크에 명시된 답변에 대한 짧은 코드 스 니펫을 제공하십시오
BAERUS

@ gaurav5430 네,이 문서에 따르면 ... 공식 잘 갈 나던When passed a null or blank cell, this method will return an empty String (""). Formulas in formula type cells will not be evaluated.
SaratBhaswanth

53

아래 코드는 모든 유형의 셀에 적합합니다.

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);

}

4
잘 작동했습니다! 내 제안은 FormulaEvaluator가 검색되는 방식을 변경하는 것입니다. 통합 문서 클래스는 getCreationHelper().createFormulaEvaluator()메서드를 통해 수식 평가기를 제공합니다 . 이렇게하면 코드가 HSSFFormulaEvaluator 클래스와 결합되지 않습니다.
Vitor Santos

이것이 정답입니다. 감사합니다 @Vinayak
Phas1c

FormulaEvaluator이 솔루션에서 간단히 제거 할 수 있습니까 ? 목적에 부합합니까?
P.Brian.Mackey

1
objFormulaEvaluator.evaluate에 대한 호출은 필요하지 않습니다. 그 반환 값은 여기서 사용되지 않습니다.
Radu Simionescu

32

셀 유형을 수정하는 것이 바람직하지 않은 경우 다음 방법을 권장합니다.

if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
    String str = NumberToTextConverter.toText(cell.getNumericCellValue())
}

NumberToTextConverter는 정밀도 손실없이 Excel의 규칙을 사용하여 이중 값을 텍스트로 올바르게 변환 할 수 있습니다.


정말 흥미로운 조언! 감사합니다! cellType을 String으로 설정하는 것과 달리 변환되지 않은 값을 가져올 수 있습니다.
Gleb Egunov 2016 년

25/06/2020의 셀 값에 대한 출력으로 44007이 표시됩니다. 내가 뭘 잘못하고 있죠?
Vinay


10

예, 이것은 완벽하게 작동합니다

추천 :

        DataFormatter dataFormatter = new DataFormatter();
        String value = dataFormatter.formatCellValue(cell);

낡은:

cell.setCellType(Cell.CELL_TYPE_STRING);

cell수식을 사용 하여 값을 검색하는 데 문제가 있어도 여전히 작동합니다.


5
그러나이 값을 이중 값으로 사용할 때는주의해야합니다. 나를 위해 그것은 7.9 값을 7.8999956589965로 바꿨다.
Chris

2
아파치 POI의 JavaDoc을 당신이 그런 식으로 일을하지 말아야하는 것이 매우 명확 : 싶은 것은 당신의 숫자 셀의 문자열 값을받을 경우, 정지! 이것은 그것을하는 방법이 아닙니다. 대신 숫자, 부울 또는 날짜 셀의 문자열 값을 가져 오려면 대신 DataFormatter를 사용하십시오.
Gagravarr

4

시험:

new java.text.DecimalFormat("0").format( cell.getNumericCellValue() )

숫자를 올바르게 형식화해야합니다.


내가 알고있는 것처럼, 아스 커는 구별 할 수 있기를 원 2하고 2.0. 귀하의 솔루션은 이것을하지 않을 것입니다. (하지만 여전히, 스택 오버플로에 오신 것을 환영합니다!)
파울로 Ebermann

1

사용자가 숫자를 입력하기 전에 셀이 텍스트 형식이면 POI를 사용하여 값을 문자열로 얻을 수 있습니다. 한 가지 핵심은 셀의 왼쪽 상단 모서리에 작은 녹색 삼각형이 텍스트로 서식이 지정된 경우 값을 문자열로 검색 할 수 있다는 것입니다 (녹색 삼각형은 숫자로 표시 될 때마다 나타남) 텍스트 형식으로 변환됩니다). 숫자가 포함 된 텍스트 형식의 셀이 있지만 POI를 사용하여 해당 값을 문자열로 가져올 수없는 경우 스프레드 시트 데이터에서 수행 할 수있는 몇 가지 작업이 있습니다.

  • 편집 커서가 셀 안에 있도록 셀을 두 번 클릭 한 다음 Enter를 클릭하십시오 (한 번에 하나의 셀만 수행 할 수 있음).
  • Excel 2007 텍스트 변환 기능을 사용하십시오 (한 번에 여러 셀에서 수행 할 수 있음).
  • 문제가되는 값을 다른 위치로 잘라 내고 스프레드 시트 셀을 텍스트로 다시 포맷 한 다음 이전에 잘라낸 값을 포맷되지 않은 값으로 다시 붙여 넣어 적절한 영역에 다시 붙여 넣습니다.

마지막으로 POI를 사용하여 Excel 2007 스프레드 시트에서 데이터를 얻는 경우 Cell 클래스 'getRawValue ()'메서드를 사용할 수 있습니다. 이것은 형식이 무엇인지 상관하지 않습니다. 단순히 원시 데이터가 포함 된 문자열을 반환합니다.


0

Apache POI 라이브러리를 사용하여 MS Excel의 숫자 셀 값을 읽으면 숫자로 읽습니다. 그러나 언젠가 우리는 문자열 (예 : 전화 번호 등)로 읽기를 원합니다. 이것이 내가 한 방법입니다.

  1. 첫 번째 셀 = CONCATENATE ( "!", D2)를 사용하여 새 열을 삽입하십시오. D2는 전화 번호 열의 셀 ID라고 가정합니다. 새 셀을 위로 드래그하여 끝냅니다.

  2. 이제 POI를 사용하여 셀을 읽으면 계산 된 값 대신 수식을 읽습니다. 이제 다음을 수행하십시오.

  3. 다른 열 추가

  4. 1 단계에서 생성 한 전체 열을 선택하고 편집-> 복사를 선택합니다.

  5. 3 단계에서 작성된 열의 맨 위 셀로 이동하여 편집-> 붙여 넣기 붙여 넣기를 선택하십시오.

  6. 열린 창에서 "값"라디오 버튼을 선택하십시오.

  7. "확인"을 선택하십시오

  8. 이제 Java로 읽은 후 POI API를 사용하여 읽으십시오 ... 첫 번째 문자 즉 "!"를 제거하십시오.


Excel 파일을 스스로 생성하지 않으면 솔루션을 사용할 수없는 것 같습니다. (또한, 당신은 당신의 대답에 추출물을 넣을 수 있습니까? 그렇게 길지 않습니다.)
Paŭlo Ebermann

예, 엑셀 파일을 직접 제작하지 않을 때는 사용할 수 없습니다.
Asif Shahzad

0

나는 또한 수천 개의 숫자로 된 데이터 세트에서 비슷한 문제를 겪고 있으며 간단한 해결 방법을 찾았다 고 생각합니다. 별도의 DB 가져 오기에서 항상 숫자를 텍스트로 볼 수 있도록 아포스트로피를 숫자 앞에 삽입해야했습니다. 이 전에 숫자 8을 8.0으로 가져옵니다.

해결책:

  • 모든 서식을 일반으로 유지하십시오.
  • 여기에서는 숫자가 행 1에서 시작하여 열 A에 저장되어 있다고 가정합니다.
  • 열 B에 '를 넣고 필요한만큼 행을 복사하십시오. 워크 시트에는 아무 것도 나타나지 않지만 셀을 클릭하면 수식 표시 줄에서 배도를 볼 수 있습니다.
  • C 열에서 : = B1 & A1.
  • C 열의 모든 셀을 선택하고 값 옵션을 사용하여 D 열에 특수 붙여 넣기를 수행하십시오.

이봐, 모든 숫자를 Presto하지만 텍스트로 저장했습니다.


0

셀 유형이 숫자 인 경우 getStringCellValue는 NumberFormatException을 리턴합니다. 셀 유형을 문자열로 변경하지 않으려면이 작업을 수행 할 수 있습니다.

String rsdata = "";
try {
    rsdata = cell.getStringValue();
} catch (NumberFormatException ex) {
    rsdata = cell.getNumericValue() + "";
}

0

이러한 답변 중 다수는 이전 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);

0

나는 오히려 윌의 대답이나 Vinayak Dornala의 길을 가고 싶습니다. 불행히도 그들은 내 공연에 많은 영향을 미쳤습니다. 나는 암시 적 캐스팅 의 HACKY 솔루션을 찾았습니다 .

for (Row row : sheet){
String strValue = (row.getCell(numericColumn)+""); // hack
...

내 상황에 따라 시스템 작동 방식으로 인해 작동했으며 신뢰할 수있는 파일 소스가 있었기 때문에이 작업을 수행하지 않는 것이 좋습니다.

각주 : numericColumn 처리 된 파일의 헤더를 읽은 후 생성되는 int입니다.


0
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());
        }

나는 이것을 시도하고 그것은 나를 위해 일했다


-1

어쨌든 Excel 워크 시트를 제어합니까? 사용자가 입력 할 수있는 템플릿이 있습니까? 그렇다면 입력 셀의 코드 형식을 지정할 수 있습니다.




-1

이것은 나를 위해 완벽하게 작동했습니다.

Double legacyRow = row.getCell(col).getNumericCellValue();
String legacyRowStr = legacyRow.toString();
if(legacyRowStr.contains(".0")){
    legacyRowStr = legacyRowStr.substring(0, legacyRowStr.length()-2);
}

-2

우리는 같은 문제가 있었고 사용자가 셀을 '텍스트'로 포맷 해야했습니다. 값을 입력 . 이렇게하면 Excel에서 짝수를 텍스트로 올바르게 저장합니다. 나중에 형식이 변경되면 Excel은 값이 표시되는 방식 만 변경하지만 값을 다시 입력하지 않으면 (예 : 셀에있을 때 return 키를 누름) 값이 저장되는 방식을 변경하지 않습니다.

Excel에서 값을 텍스트로 올바르게 저장했는지 여부는 셀에 숫자가 있지만 텍스트로 서식이 지정되어 있다고 생각되면 Excel이 셀의 왼쪽 상단 모서리에 표시하는 작은 녹색 삼각형으로 표시됩니다.


-3

int로 캐스팅 한 다음을 수행하십시오 .toString(). 추악하지만 작동합니다.


문제는 A2에 2.0이 있으면 문자열 "2.0"을 가져와야하고 2이면 문자열 "2"를 가져와야한다는 것입니다.
joycollector
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.