programing

HSSF로 Excel에서 문자열 값을 읽는 중이지만 두 배입니다.

mailnote 2023. 9. 23. 23:01
반응형

HSSF로 Excel에서 문자열 값을 읽는 중이지만 두 배입니다.

저는 엑셀 데이터를 읽기 위해 HSSF-POI를 사용하고 있습니다.문제는 셀에 숫자처럼 보이지만 실제로는 문자열인 값이 있다는 것입니다.엑셀에서 포맷 셀을 보면 타입이 'text'라고 나와 있습니다.그래도 HSSF 셀은 숫자라고 생각합니다.문자열로 값을 얻으려면 어떻게 해야 합니까?

하려고 하면.cell.getRichStringValue, .cell.toString

편집: 이 문제가 해결될 때까지 를 사용합니다.

new BigDecimal(cell.getNumericCellValue()).toString()

POI에서 찾으시는 클래스는 DataFormatter입니다.

Excel이 파일을 작성할 때 일부 셀은 리터럴 문자열로 저장되고 다른 셀은 숫자로 저장됩니다.후자의 경우, 셀을 나타내는 부동 소수점 값이 파일에 저장되므로 POI에 셀의 값을 물어보면 실제로 셀이 가지고 있는 값입니다.

그러나 특히 텍스트 추출을 수행할 때(항상 그렇지는 않지만) 셀 값을 Excel에서와 동일하게 만들기를 원할 수도 있습니다.항상 문자열에서 정확하게 가져올 수 있는 것은 아니지만(예를 들어, 꽉 찬 공간이 아닌 패딩) DataFormatter 클래스를 사용하면 근접할 수 있습니다.

셀의 문자열을 찾는다면 Excel에서 본 것처럼 셀을 많이 보고 다음 작업을 수행하면 됩니다.

 // Create a formatter, do this once
 DataFormatter formatter = new DataFormatter(Locale.US);

 .....

 for(Cell cell : row) {
     CellReference ref = new CellReference(cell);
     // eg "The value of B12 is 12.4%"
     System.out.println("The value of " + ref.formatAsString() + " is " + formatter.formatCellValue(cell));
 }

형식 지정자는 문자열 셀을 그대로 반환하고 숫자 셀의 경우 스타일의 형식 지정 규칙을 셀 수에 적용합니다.

구문 분석하려는 문서가 항상 특정 레이아웃에 있는 경우, 셀 유형을 " 문자열"로 변경한 후 값을 검색할 수 있습니다.예를 들어 열 2가 항상 문자열 데이터여야 하는 경우 셀 유형을 문자열로 설정한 다음 문자열 유형 가져오기 메서드로 읽습니다.

cell.setCellType(Cell.CELL_TYPE_STRING);

제 테스트에서 셀의 종류를 변경하는 것은 셀의 내용을 수정하는 것이 아니라 다음 방법 중 하나로 셀을 검색할 수 있게 해주었습니다.

cell.getStringCellValue();

cell.getRichStringCellValue().getString();

제대로 변환되지 않는 값의 예가 없으면 설명에서 설명한 cell.toString() 접근 방식과 다르게 동작할지 알 수 없습니다.

HSSF-POI 말은

cell.getCellType() == Cell.CELL_TYPE_NUMERIC

것은 아니다.

Cell.CELL_TYPE_STRING당연한 일인데요?

POI의 버그라고 생각하지만, 모든 셀에는 변종이 포함되어 있고, 변종에는 종류가 있습니다.거기서 버그를 만드는 것은 좀 어려워서 엑셀은 필드를 텍스트로 보고하기 위해 추가 데이터나 휴리스틱을 사용한다고 생각합니다.보통 MS 방식이죠, 아아.

추신: 어떤 것도 사용할 수 없습니다.getString()숫자를 포함하는 변형에서는 변형 데이터의 이진 표현이 유형에 따라 달라지므로 실제로 숫자에서 문자열을 가져오려고 하면 가비지(garbage)가 발생하므로 예외가 됩니다.

아래 코드는 셀 유형을 읽는 데는 문제가 없지만 해당 셀에는 숫자 값이 포함되어야 합니다.

new BigDecimal(cell.getNumericCellValue()));

예.

ase.setGss(new BigDecimal(hssfRow.getCell(3).getNumericCellValue()));

여기서 변수 gss는 BigDecimal 유형입니다.

엑셀은 숫자나 날짜, 시간처럼 보이는 것을 문자열에서 변환해 줄 것입니다.기본적으로 숫자를 문자열로 만드는 추가 문자로 입력할 것을 제안하는 MS 기술 자료 문서를 참조하십시오.

당신은 아마 엑셀 문제를 다루고 있을 것입니다.스프레드시트를 생성할 때 기본 셀 유형은 Generic.이 유형을 사용하면 엑셀은 입력을 기반으로 유형을 추측하고 각 셀로 유형을 저장합니다.

나중에 셀 형식을 텍스트로 변경하면 기본값만 변경하는 것입니다.엑셀이 모든 셀의 종류를 자동으로 변경하는 것은 아닙니다.저는 이것을 자동으로 할 방법을 찾지 못했습니다.

이를 확인하려면 엑셀로 가서 번호 중 하나를 다시 입력하고 HSSF의 텍스트인지 확인할 수 있습니다.

이 기능을 이용하면 실제 세포 종류를 볼 수도 있습니다.

  @Cell("type", A1)

A1은 숫자를 나타내는 셀입니다.텍스트는 "l", 숫자는 "v"로 표시됩니다.

엑셀의 문제점은 기본 포맷이 일반적이라는 것입니다.이 형식을 사용하면 엑셀은 셀에 입력된 숫자를 숫자로 저장합니다.값을 입력하기 에 형식을 텍스트로 변경해야 합니다.형식을 변경한 후 값을 다시 입력해도 됩니다.
내용이 Excel에 숫자처럼 보일 경우 셀의 왼쪽 상단 모서리에 작은 녹색 삼각형이 표시됩니다.이 경우 값이 실제로 텍스트로 저장됩니다.

BigDecimal(cell.getNumericCellValue().toString()에 새로 추가된 BigDecimal(cell.getNumericCellValue())을 사용하면 여전히 많은 문제가 발생할 수 있습니다.예를 들어 식별 번호(예: 부품 번호 또는 분류 번호)가 있는 경우 getNumericCellValue() 접근 방식에서 문제가 될 선행 0이 있는 경우가 있을 수 있습니다.

POI로 처리해야 할 파일을 작성하는 당사자에게 엑셀을 올바르게 작성하는 방법을 충분히 설명하려고 합니다.최종 사용자가 파일을 업로드한 경우 열을 미리 알고 있으면 예상되는 셀 종류를 확인할 수 있는 검증 프로그램까지 만들었습니다.부산물로 제공된 파일의 다른 다양한 항목(예: 제공된 올바른 열 또는 필수 값)도 확인할 수 있습니다.

"문제는 셀에 숫자처럼 보이는 값이 있다는 것입니다" => 엑셀로 봤을 때 숫자처럼 보인다고요?

"하지만 실제로 끈이 있다" => 그게 무슨 뜻입니까?그들이 정말로 끈이라는 것을 어떻게 압니까?

"포맷 셀을 보면" => "포맷 셀"은 무엇입니까??

'... 엑셀에는 'text'라고 입력되어있습니다 => 설명 부탁드립니다.

"그래도 HSSF Cell은 숫자라고 생각합니다." => 그러면_cell.getCellType()이 Cell을 반환한다는 뜻입니까?CELL_TYPE_NUMBERIC?

"어떻게 하면 문자열로서의 가치를 얻을 수 있을까요?"=> NUMAL이면 _cell.getNumericCellValue()사용하여 NUMAL 값을 얻은 다음 원하는 대로 문자열로 포맷합니다.

"cell.getRichStringValue를 사용하려고 하면 예외가 발생합니다;" => 따라서 문자열이 아닙니다.

"cell.toString, 엑셀시트와 정확히 같은 값이 아닙니다." => socell.toString()은 엑셀이 포맷하는 방식으로 포맷하지 않습니다.

Excel이 유형을 결정하기 위해 사용하는 휴리스틱은 사용자와 무관합니다.파일에 저장되어 있고 getCellType()에 의해 밝혀진 결정의 결과입니다.

언급URL : https://stackoverflow.com/questions/1411157/reading-string-value-from-excel-with-hssf-but-its-double

반응형