Excel 셀의 숫자 문자열을 숫자가 아닌 문자열로 읽으려면 어떻게 해야 하는가?
그러한 내용이 포함된 엑셀 파일을 가지고 있다.
A1: SomeString
A2: 2
모든 필드는 문자열 형식으로 설정된다.
POI를 이용하여 자바로 파일을 읽어보면 A2가 숫자 셀 형식임을 알 수 있다.
- 문제는 A2의 값이 2나 2.0이 될 수 있기 때문에(그리고 나는 그것들을 구별할 수 있기를 원한다) 그냥 사용할 수 없다는 것이다.
.toString()
.
값을 문자열로 읽으려면 어떻게 해야 하는가?
나도 같은 문제가 있었어.했다cell.setCellType(Cell.CELL_TYPE_STRING);
사용자가 셀을 어떻게 포맷했는지에 관계없이 문제를 해결한 문자열 값을 읽기 전에.
네가 질문했을 때 이 수업을 다시 들은 것 같지는 않은데, 오늘은 쉬운 답이 있어.
원하는 것은 DataFormatter 클래스를 사용하는 것이다.이 셀을 통과하면 엑셀이 셀에 대해 보여줄 수 있는 것이 들어 있는 문자열을 반환하는 데 최선을 다한다.끈셀을 건네주면 끈을 돌려받을 수 있다.포맷 규칙이 적용된 숫자 셀을 전달하면 그 번호를 기반으로 포맷하고 문자열을 돌려준다.
당신의 경우, 나는 숫자 셀에 정수 포맷 규칙이 적용되었다고 가정한다.DataFormatter에 셀 포맷을 요청하면 정수 문자열이 들어 있는 문자열이 다시 제공되며,
또한, 많은 사람들이 하는 것을 제안한다.cell.setCellType(Cell.CELL_TYPE_STRING)
하지만 Apache POI JavaDocs는 당신이 이것을 하지 말아야 한다고 분명히 말한다!하는 중setCellType
자바도크가 서식이 남아 있는 문자열로 변환하는 유일한 방법은 DataFormatter 클래스를 사용하는 것이라고 설명하기 때문에 호출은 서식을 느슨하게 한다.
이 클래스를 사용하는 간단한 예:
DataFormatter dataFormatter = new DataFormatter();
String formattedCellStr = dataFormatter.formatCellValue(cell);
아래 코드는 어떤 종류의 세포라도 나에게 효과가 있었다.
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는 정확한 손실 없이 엑셀의 규칙을 사용하여 이중 값을 텍스트로 올바르게 변환할 수 있다.
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);
http://massapi.com/class/da/DataFormatter.html의 추가 예
그래, 이건 완벽해
권장:
DataFormatter dataFormatter = new DataFormatter();
String value = dataFormatter.formatCellValue(cell);
오래된:
cell.setCellType(Cell.CELL_TYPE_STRING);
이 값에서 것에 .cell
공식은 있지만 여전히 효과가 있어
시도:
new java.text.DecimalFormat("0").format( cell.getNumericCellValue() )
숫자를 올바르게 포맷해야 한다.
사용자가 숫자를 입력하기 전에 셀이 텍스트 형식으로 되어 있는 한, POI는 문자열로서 값을 얻을 수 있다.한 가지 핵심은 셀의 왼쪽 상단 모서리에 텍스트로 포맷된 작은 녹색 삼각형이 있으면 문자열로서 값을 검색할 수 있다는 것이다(숫자로 보이는 것이 텍스트 형식으로 강제될 때마다 녹색 삼각형이 나타난다).숫자를 포함하는 텍스트 형식 셀이 있지만 POI에서 해당 값을 문자열로 가져올 수 없는 경우 스프레드시트 데이터에 대해 다음과 같은 작업을 수행할 수 있다.
- 편집 커서가 셀 내부에 있도록 셀을 두 번 누른 다음 Enter(한 번에 하나의 셀만 가능)을 클릭하십시오.
- Excel 2007 텍스트 변환 기능(여러 셀에서 한 번에 수행할 수 있음)을 사용한다.
- 위반 값을 다른 위치로 잘라내고 스프레드시트 셀을 텍스트로 다시 포맷한 다음 이전에 잘라낸 값을 다시 올바른 영역에 붙여 넣으십시오.
마지막으로 할 수 있는 것은 POI를 사용하여 Excel 2007 스프레드시트에서 데이터를 가져오는 경우 셀 클래스 'getRawValue()' 방법을 사용할 수 있다는 것이다.이것은 형식이 무엇인지는 상관없다.Raw data(로우 데이터)가 포함된 문자열을 반환할 뿐이다.
우리가 아파치 POI 라이브러리를 사용하여 MS Excel의 숫자 셀 값을 읽었을 때, 그것은 그것을 숫자로 읽는다.그러나 때때로 우리는 그것을 문자열로 읽기를 원한다(예: 전화 번호 등).이게 내가 한 방법이야
첫 번째 셀 =CONCATENATE("!",D2)가 있는 새 열을 삽입하십시오.나는 D2가 너의 전화번호 열의 휴대폰 ID라고 생각한다.새 셀을 끝까지 끌어다 놓으십시오.
이제 POI로 셀을 읽으면 계산된 값 대신 공식을 읽게 된다.이제 다음을 수행하십시오.
다른 열 추가
1단계에서 작성된 전체 열을 선택하고 편집->복사를 선택하십시오.
3단계에서 만든 열의 맨 위 셀로 이동하여 편집->특수 붙여넣기 선택
열린 창에서 "값" 선택 라디오 버튼
"확인"을 선택하십시오.
이제 Java에서 읽은 후 POI API를 사용하여 읽기...첫 번째 문자(예: "!")를 제거하십시오.
나 또한 수천 개의 숫자로 이루어진 데이터 집합에 대해 비슷한 문제를 가지고 있었고 나는 해결의 간단한 방법을 찾았다고 생각한다.별도의 DB 가져오기가 항상 숫자를 텍스트로 볼 수 있도록 숫자 앞에 아포스트로피를 삽입해야 했다.이 전에 숫자 8은 8.0으로 수입될 것이다.
해결책:
- 모든 형식을 일반으로 유지하십시오.
- 여기서는 숫자가 1행부터 A열에 저장된다고 가정한다.
- B열에 '를 넣고 필요한 만큼 행을 복사하십시오.워크시트에 아무 것도 나타나지 않고 셀을 클릭하면 포뮬라 바에서 아포토페를 볼 수 있다.
- C열: =B1&A1에서.
- C열의 모든 셀을 선택하고 값 옵션을 사용하여 D열에 특수 붙여넣기를 수행하십시오.
안녕, Presto 모든 번호들. 하지만 텍스트로 저장되어 있어.
getStringCellValue 반환 번호셀 유형이 숫자인 경우 FormatException.셀 유형을 문자열로 변경하지 않으려면 이렇게 하십시오.
String rsdata = "";
try {
rsdata = cell.getStringValue();
} catch (NumberFormatException ex) {
rsdata = cell.getNumericValue() + "";
}
이러한 답변 중 다수는 이전 POI 문서와 클래스를 참조한다.최신 POI 3.16에서는 int 타입이 있는 셀이 더 이상 사용되지 않음
Cell.CELL_TYPE_STRING
대신 CellType 열거형을 사용할 수 있다.
CellType.STRING
새로운 3.16 버전에 대한 poi-ooxml 의존성뿐만 아니라 관심 종속성으로 당신의 poi-oxml을 업데이트하지 않으면 당신은 계속해서 예외를 받게 될 것이다.이 버전의 한 가지 장점은 셀이 생성될 때 셀 유형을 지정할 수 있다는 것이며, 이전 답변에서 설명한 추가 단계를 모두 제거할 수 있다는 점이다.
titleRowCell = currentReportRow.createCell(currentReportColumnIndex, CellType.STRING);
이것은 나에게 완벽히 효과가 있었다.
Double legacyRow = row.getCell(col).getNumericCellValue();
String legacyRowStr = legacyRow.toString();
if(legacyRowStr.contains(".0")){
legacyRowStr = legacyRowStr.substring(0, legacyRowStr.length()-2);
}
나는 윌의 대답이나 비나야크 도날라의 길을 가고 싶다. 불행히도 그들은 나의 연기에 많은 영향을 주었다.나는 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());
}
나는 이것을 시도했고 그것은 나에게 효과가 있었다.
바로 사용할 수 있는 포장지가 있음(일부 추가 최적화 적용 가능)
숫자 및 문자열 셀을 지원한다.
수식이 자동으로 인식되고 처리됨
약간의 보일러를 피하다.
public final class Cell { private final static DataFormatter FORMATTER = new DataFormatter(); private XSSFCell mCell; public Cell(@NotNull XSSFCell cell) { mCell = cell; if (isFormula()) { XSSFWorkbook book = mCell.getSheet().getWorkbook(); FormulaEvaluator evaluator = book.getCreationHelper().createFormulaEvaluator(); mCell = (XSSFCell) evaluator.evaluateInCell(mCell); } } /** * Get content */ public final int getInt() { return (int) getLong(); } public final long getLong() { return Math.round(getDouble()); } public final double getDouble() { return mCell.getNumericCellValue(); } public final String getString() { if (!isString()) { return FORMATTER.formatCellValue(mCell); } return mCell.getStringCellValue(); } /** * Get properties */ public final boolean isNumber() { if (isFormula()) { return mCell.getCachedFormulaResultType().equals(CellType.NUMERIC); } return mCell.getCellType().equals(CellType.NUMERIC); } public final boolean isString() { if (isFormula()) { return mCell.getCachedFormulaResultType().equals(CellType.STRING); } return mCell.getCellType().equals(CellType.STRING); } public final boolean isFormula() { return mCell.getCellType().equals(CellType.FORMULA); } /** * Debug info */ @Override public String toString() { return getString(); } }
엑셀 워크시트를 제어하시겠습니까?사용자가 입력한 내용을 제공하는 템플릿이 있는가?만약 그렇다면, 당신은 당신을 위해 입력 셀의 코드 포맷을 할 수 있다.
현재 POI 버전에서는 다음과 같은 버그로 볼 때 이 작업을 수행할 수 없는 것으로 보인다.
https://issues.apache.org/bugzilla/show_bug.cgi?id=46136
여전히 뛰어나다.
우리는 같은 문제를 가지고 있었고 값을 입력하기 전에 사용자들에게 셀을 '텍스트'로 포맷하도록 강요했다.그렇게 하면 엑셀은 짝수 숫자를 텍스트로 정확하게 저장할 수 있다.이후에 형식이 변경되면 Excel은 값이 표시되는 방식만 변경하고 값이 다시 입력되지 않는 한(예: 셀에서 반환을 누름) 값을 저장하는 방식을 변경하지 않는다.
엑셀이 텍스트로 값을 올바르게 저장했는지 여부는 셀이 숫자를 포함하고 있다고 생각하지만 텍스트로 형성되어 있는 경우 셀의 왼쪽 상단 모서리에 표시되는 작은 녹색 삼각형으로 표시된다.
cell.setCellType(셀).CELL_TYPE_STRING); 잘 작동하고 있다.
하다.toString()
그것은 못생겼지만 효과가 있다.
'programing' 카테고리의 다른 글
gdb 명령 화면이 얼마나 선명하십니까? (0) | 2022.04.24 |
---|---|
실제로 스택 오버플로 오류를 일으키는 요소는? (0) | 2022.04.24 |
문자 배열이 비어 있는지 확인하는 가장 좋은 방법 (0) | 2022.04.24 |
vue 관련 문제 다시 한 번 발생: vue를 2.5에서 2.6.8로 업데이트하고 [Vue warn]:구성 요소를 마운트하지 못함: 템플릿 또는 렌더 함수가 정의되지 않음 (0) | 2022.04.24 |
JSON의 끈을 어떻게 벗어나야 할까? (0) | 2022.04.23 |