2017-11-28 5 views
0

Java POI에 Excel 행을 문자열로 변환하는 직접 내장 함수가 있습니까? "row.toString()"시도했지만 행의 메모리 위치를 반환했습니다.Java에서 Excel 행을 문자열 값으로 변환하는 방법은 무엇입니까?

+2

셀 단위로 셀을 읽은 다음 문자열 – SpringLearner

+0

@ SpringLearner에 추가하십시오. 이미 그 작업을하고 있지만 작동합니다.하지만 중첩 루프를 피하여 솔루션을 최적화하고 싶습니다. – rock

+2

@andrew 이유가 무엇입니까? 중첩 루프의 문제점은 무엇입니까? 성능 문제가 있습니까? – sisve

답변

0

당신은 세포를 반복 할 수

 Row row = (Row) rows.next(); 
     Iterator cells = row.cellIterator(); 

    while (cells.hasNext()) { 
     Cell cell = (Cell) cells.next(); 
... 
} 

그리고 당신이 사용할 수있는 셀의 문자열을 검색하기위한

:

cell.getStringCellValue() 
+0

형식이 지정된 숫자 나 서식이 지정된 날짜가 아닌 실제 문자열이 셀에만 포함되어있는 경우에만 .... – Gagravarr

+0

물론 그렇습니다. ** cell.getCellType() **을 사용하여 값 유형을 검색하고 코드 논리를 수정하십시오. – Zibaire

0
 XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(new File("path"))); 

     FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); 
    Iterator<Cell> cellIterator = row.cellIterator(); 
      while (cellIterator.hasNext()) 
      { 
       Cell cell = cellIterator.next(); 
       switch (evaluator.evaluateInCell(cell).getCellType()) 
       {     
        case Cell.CELL_TYPE_NUMERIC: 
         double a = cell.getNumericCellValue(); 
         break; 
        case Cell.CELL_TYPE_STRING: 
         String val = cell.getStringCellValue(); 
         break; 
       } 
      } 
+0

문자열이 아닌 셀 (예 : 서식이 지정된 숫자)에 대해서는 실패합니다 – Gagravarr

+1

설명을 추가하면이 대답을 향상시킬 수 있다고 생각합니다. 코드 샘플만으로는 도움이되지 않으며 부적절한 환경에서 코드 샘플을 사용하게됩니다. – NickJ

0

당신은 자바 파일 클래스를 사용하여 시도 할 수 있습니다. 그것은 예컨대

경로에 취해 스트림을 반환

Files.lines(Path path)

하는 방법이있다. 스트림을 사용하면 행을 분할하고 메서드를 적용 할 수 있습니다. 좀 더 적용 가능성이 높은 다른 메소드에 대해서는 API를 살펴볼 수 있습니다.

int x = 5; 
int y = 8; 
// open your File 
Workbook wb = new XSSFWorkbook(file); 
// Get your excel sheet nr. 1 
XSSFSheet sheet = Workbook.getSheetAt(0); 
// get your Row from Y cordinate 
Row yourRow = sheet.getRow(y); 
// get your Cell from X cordinate 
Cell yourCell = cell = yourRow.getCell(x); 
// be sure that the pointingCell is an String or else it will catch Exception. 
String cellString = cell.getStringCellValue(); 
+0

'Excel' 파일에서이 메서드를 사용하는 것이 좋습니다. Excel은 바이너리 파일 ('* .xls')이거나 디렉토리 구조 ('* .xls)에 여러 개의 XML 파일이 들어있는'ZIP' 아카이브입니다.xlsx')하지만 결코 텍스트 행으로 해석 될 수있는 파일은 아닙니다. –

0

망가은 다음하여 특정 셀을 선택, 모든 세포/라인을 통해 반복 . 문서를 읽는 것은 종종 도움이됩니다!

: 당신은 같은 것을 할 것 -

이 같은 쉼표 (!하지 당신은 또한 일을 탈출하기 위해 필요로 CSV를 생성하는 좋은 방법 주)와 함께 모든 셀에 가입 간단한 무언가를 할 가정

// Load the file, get the first sheet 
Workbook wb = WorkbookFactory.create(new File("input.xls")); 
Sheet sheet = wb.getSheetAt(0); 

// To turn numeric and date cells into friendly formatted strings 
DataFormatter formatter = new DataFormatter(); 

// Process every row 
for (Row row : sheet) { 
    StringBuffer text = new Stringbuffer(); 
    // Turn each cell into a string, and append 
    for (Cell : row) { 
     if (! text.isEmpty()) { text.append(", "); } 
     text.append(formatter.formatCellValue(cell)); 
    } 

    // TODO Do something useful with the string 
    String rowAsText = text.toString(); 
} 

// Tidy up 
wb.close(); 
0

당신은 어쩌면 더 편리 코드를 얻기 위해 java8 foreach을 사용할 수

try (
    InputStream inputStream = RowToString.class.getResourceAsStream("excel.xlsx"); 
    Workbook workbook = WorkbookFactory.create(inputStream); 
) { 
    Sheet sheet = workbook.getSheetAt(0); 
    List<String> rows = new ArrayList<>(); 
    sheet.forEach(row -> { 
     StringJoiner joiner = new StringJoiner("|"); 
     row.forEach(cell -> joiner.add(cell.toString())); 
     rows.add(joiner.toString()); 
    }); 

    rows.forEach(System.out::println); 
} 

StringJoiner는 값을 연결하는 좋은 선택입니다. 셀 값을 얻으려면 toString이 정상적으로 작동합니다. toString은 모든 셀 유형의 적절한 값을 가져옵니다. 유일한 문제는 toString이 수식을 해결하지 않을 것이므로 수식 자체를 얻을 수 있다는 것입니다. 그러나 자신의 필요에 맞게 코드를 적용 할 수 있습니다.

관련 문제