2013-08-06 53 views
0

我的數據是以一種格式存儲的(向下看):[ - ]表示一個空白單元格,右邊可能是 後面只有10個空格。事情是這樣的:
[string0] [ - ] [字符串1] [字符串2] [STRING3] .. [string10] [ - ]Java。 HSSF。 Apache的POI。如何修改代碼

如何更改此代碼:

1)僅獲得[string0]

2)只獲得[字符串1] [字符串2] [STRING3] .. [string10] [ - ]

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

我不知道如何停止迭代。他吸收所有..

回答

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循環。例如收集字符串列,當您找到所需的設置停止爲true時,轉到下一行。

+0

使用龐大的Excel工作表時,請小心使用POI HSSF。我有一個正在運行的桌面應用程序使用POI,它處理有數千行的表。此表無法通過POI的正常API訪問。在這種情況下,我通過將xlsx定義爲默認格式並提取需要使用的xml部分來使用技巧。 –

0

外部鏈接Busy Developers' Guide to HSSF and XSSF Features

下面是應該工作的例子。

Maven依賴:

<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(這允許您按名稱引用單元格,例如「A2」,就像您在Excel中引用的單元格)或僅由行內的column index一樣獲取單元格。

+0

你能用「for for語句」來重寫嗎? (rowIterator.hasNext()){。和。如何獲得完整字符串,對於每行fullString = [ - ] [string1] [string2] [string3] .. [string10] [ - ]。使用StringBuilder?或者如何? –

相關問題