2013-08-06 3 views
0

내 데이터는 형식으로 저장됩니다 (아래로보기) : [-]는 공백 뒤에 오른쪽으로 빈 칸이 일 수 있음을 의미합니다. 이런 식으로 뭔가 :
이 [string0] [-] [문자열 1] [문자열 2] [string3] ... [string10] [-]이 코드를 변경하는 방법Java. HSSF. 아파치 - poi. 코드 수정 방법

:

1) 만 취득 [-]

try { 

    FileInputStream file = new FileInputStream("C:\\Users\\student3\\"+sfilename+".xls"); 

    //Get the workbook instance for XLS file 
    HSSFWorkbook workbook = new HSSFWorkbook(file); 

    //Get first sheet from the workbook 
    HSSFSheet sheet = workbook.getSheetAt(0); 

    //Iterate through each rows from first sheet 
    Iterator<Row> rowIterator = sheet.iterator(); 
    while(rowIterator.hasNext()) { 
     Row row = rowIterator.next(); 

     //For each row, iterate through each columns 
     Iterator<Cell> cellIterator = row.cellIterator(); 
     while(cellIterator.hasNext()) { 

      Cell cell = cellIterator.next(); 

      switch(cell.getCellType()) { 
       case Cell.CELL_TYPE_STRING: 
        System.out.print(cell.getStringCellValue() + "\t\t"); 
        list1.add(cell.getStringCellValue()); 
        break; 
      } 
     } 
     System.out.println(""); 
    } 
    file.close(); 
    FileOutputStream out = 
      new FileOutputStream("C:\\Users\\student3\\"+sfilename+".xls"); 
    workbook.write(out); 
    out.close(); 

내가 Iterator를 중지하는 방법을 모른다 [string0]

2)에만 [문자열 1] [문자열 2] [string3] ... [string10] 구하십시오. 그는 모든 것을 흡수합니다.

답변

1

분명하면 첫 번째 열을 필터링하고 별도로 휴식하고 싶을뿐입니다.

왜 당신은 이것에 대한 간단한 카운터를 사용하지 :

while(rowIterator.hasNext()) { 
    Row row = rowIterator.next(); 
    String RowContent = null; 
    Iterator<Cell> cellIterator = row.cellIterator(); 
    while(cellIterator.hasNext()) { 
     Cell cell = cellIterator.next(); 
     RowContent=RowContent+cell.toString(); 
    } 
    //Code for saving RowContent or printing or whatever you want for text in complete row 
} 

RowContent 각 반복에서 단일 행의 각 세포의 연결을 제공 할 것입니다.

+0

행에 concat 열을 구현 한 다음 행을 각 행의 문자열로 변환하는 방법을 알고 있습니까 –

+0

그래서 어떤 행의 모든 ​​열을 올바르게 연결하려고합니까? – Sankumarsingh

+0

예, 각 행에 대해 저장하십시오. –

0

"차단"스위치 블록에서했던 것처럼?

Iterator<Cell> cellIterator = row.cellIterator(); 
boolean stop = false; 
while(cellIterator.hasNext()) { 

    Cell cell = cellIterator.next(); 

    switch(cell.getCellType()) { 
    case Cell.CELL_TYPE_STRING: 
     System.out.print(cell.getStringCellValue() + "\t\t"); 
     list1.add(cell.getStringCellValue()); 
     stop = true; 
     break; 
    } 

    if (stop) { 
    break; 
    } 
} 

이것은 당신이 문자열 셀을 발견했을 때 while 루프를 중지 할 후 다음 행에 작동합니다 : 는하지만 난 당신이 원하는 생각하는 것은 이것이다. while 루프를 해제 할 수있는 조건을 만듭니다. 예를 들어 문자열 열을 수집하고 원하는 세트가 참으로 발견되면 다음 행으로 이동합니다.

+0

거대한 엑셀 시트로 작업 할 때 POI HSSF 재료로 조심하십시오. POI를 사용하여 실행중인 데스크톱 응용 프로그램이 있습니다. POI는 수천 개의 행이있는 시트를 처리합니다. 이 시트는 POI의 일반 API로 액세스 할 수 없습니다. 이 경우에는 기본 형식으로 xlsx를 정의하고 함께 작업해야하는 xml 부분을 추출하여 트릭을 사용했습니다. –

0

외부 링크 : 여기 Busy Developers' Guide to HSSF and XSSF Features

작동합니다 예입니다.

메이븐 종속 관계 :

<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi</artifactId> 
    <version>3.9</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi-ooxml</artifactId> 
    <version>3.9</version> 
</dependency> 

코드 : 조건부 루프에서 휴식 할 수있는 반복을 종료에 관해서는

import org.apache.poi.hssf.usermodel.HSSFDataFormatter; 
import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 
import org.apache.poi.ss.usermodel.*; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Iterator; 

public class StackOverflowQuestion18095443 { 

    public static void main(String[] args) { 
     if(args.length != 1) { 
      System.out.println("Please specify the file name as a parameter"); 
      System.exit(-1); 
     } 
     String sfilename = args[0]; 
     File file = new File("C:\\Users\\student3\\" + sfilename + ".xls"); 
     read(file); 
    } 

    public static void read(File file) { 
     try (InputStream in = new FileInputStream(file)) { 
      HSSFDataFormatter formatter = new HSSFDataFormatter(); 
      Workbook workbook = WorkbookFactory.create(in); 
      Sheet sheet = workbook.getSheetAt(0); 
      Iterator<Row> rowIterator = sheet.iterator(); 
      while (rowIterator.hasNext()) { 
       Row row = rowIterator.next(); 
       StringBuilder rowText = new StringBuilder(); 
       Iterator<Cell> cellIterator = row.cellIterator(); 
       while (cellIterator.hasNext()) { 
        Cell cell = cellIterator.next(); 
        String cellAsStringValue = formatter.formatCellValue(cell); 
        rowText.append(cellAsStringValue).append(" "); 
       } 
       System.out.println(rowText.toString().trim()); 
      } 
     } catch (InvalidFormatException | IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

. 또는 반복기를 사용하지 않아도됩니다. named reference을 사용하여 행에서 셀을 가져올 수 있습니다 (이 방법을 사용하면 Excel에서와 마찬가지로 "A2"와 같은 이름으로 셀을 참조 할 수 있음). 또는 행 내에서 column index으로 간단하게 셀을 참조 할 수 있습니다.

+0

"for 문"으로 다시 작성할 수 있습니까? while (rowIterator.hasNext()) {아래에서 시작하십시오. 과. 각 행에 대해 전체 문자열을 얻는 방법 fullString = [-] [string1] [string2] [string3] .. [string10] [-]. StringBuilder 사용하기? 아니면 어떻게? –