2014-06-13 2 views
0

아파치 POI를 사용하고 있는데 엑셀 통합 문서의 정보를 가져 오려고합니다. (이해가 .xlsx 파일입니다. POI에서 XSSF를 사용하고 있습니다.) JTable에 표시하십시오. . 그러나이 새로운 열을 만들지 않습니다보고 있습니다. 나는 새로운 벡터에 벡터를 저장하고 벡터를 만들 때 그것을 반복하는 각 행마다 새로운 벡터를 만들지 않는다는 것을 알았다.새 행을 만들지 않고 JTable에 Excel 정보를 추가 하시겠습니까? (.xlsx)

이 정보는 어떻게 저장합니까? 나는 벡터, datatemp를 저장해야하고, 새로운 행이 발견 될 때마다 지우고 데이터 벡터에 추가해야한다고 생각한다. 그러나 나는 이것을 어떻게 할 것인가? 나는 올바른 길을 가고 있는가?

이미지 : (확실하지 난 (10) 대표를 가지고 있지이 인해를 게시 할 수 있지만, 그렇지 않으면 삭제 해 주시기 바랍니다하고있는 경우)

http://i.stack.imgur.com/AXg0v.png

http://i.stack.imgur.com/RuId5.png

package table_testing_broken_up; 

import java.awt.BorderLayout; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.Iterator; 
import java.util.Vector; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 

import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

public class pull_information extends JFrame 
{ 
    private static Vector dataTemp = new Vector(); 
    private static Vector columns = new Vector(); 
    private static Vector data = new Vector(); 
    public static DefaultTableModel model = null; 
    public static JTable table = new JTable(); 

    public static void main(String[] args) 
    { 
     makeFrame(); 
    } 

    static void makeFrame() 
    { 
     setData(); 
     JFrame frame = new JFrame("Table Test"); 
     frame.setSize(500, 150); 
     data.addElement(dataTemp); 
     model = new DefaultTableModel(data, columns); 
     table.setModel(model); 
     table.setAutoResizeMode(table.AUTO_RESIZE_ALL_COLUMNS); 
     frame.add(table.getTableHeader(), BorderLayout.PAGE_START); 
     frame.add(table); 
     frame.setVisible(true); 
    } 

    static void setData() 
    { 
     try 
     { 
      FileInputStream file = new FileInputStream(new File("C:\\Testing\\student_employment_form.xlsx")); 
      XSSFWorkbook workbook = new XSSFWorkbook(file); 
      XSSFSheet sheet = workbook.getSheetAt(0); 

      Iterator<Row> rowIterator = sheet.iterator(); 
      while(rowIterator.hasNext()) 
      { 
       Row row = rowIterator.next(); 
       Iterator<Cell> cellIterator = row.cellIterator(); 
       if(row.getRowNum() == 0) 
       { 
        while(cellIterator.hasNext()) 
        { 
         Cell cell = cellIterator.next(); 
         columns.add(cell.getStringCellValue()); 
         if(row.getRowNum() == 1) 
         { 
          break; 
         } 
        } 
        continue; 
       } 
       while(cellIterator.hasNext()) 
       { 
        Cell cell = cellIterator.next(); 
        if(rowIterator.hasNext()) 
        { 
         if(cell.getCellType() == Cell.CELL_TYPE_STRING) 
         { 
          dataTemp.add(cell.getStringCellValue()); 
         } 
         else if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) 
         { 
          dataTemp.add(cell.getNumericCellValue()); 
         } 
         //data.addElement(dataTemp); 
        } 
        else 
        { 
         break; 
        } 
       } 
      } 
      file.close(); 
     } 
     catch (FileNotFoundException e) 
     { 
      System.out.println("File Not found"); 
     } 
     catch(IOException e) 
     { 
      e.printStackTrace(); 
     } 

    } 
} 

다른 연구 :

내가 사용할 수있는 알고 : JTableReadTableModelTask, 그러나, JComponentPack v3.5는 오픈 소스가 아닌 것, 그리고 C를 사용해야 할 것입니다 돈.

참고 : 이것은 작업을위한 것으로, 작업 속도를 높이기 위해 노력하고있는 작은 프로젝트이며 Comp Sci & 수학에서 B.S를 추구하는 학부입니다. 또한이 파일은 테스트 파일 일 뿐이므로이 파일을 내 메인 프로그램에 구현하고 git으로 푸시합니다.

모든 조언이 많이 부여됩니다. 감사합니다.

답변

1

나는 그때 분명 그것은, 매번 새로운 행이 발견을 벡터, datatemp를 저장하고 데이터 벡터

없음에 추가 할 것입니다 생각, 당신은 그것 때문에 명확하지 수 Vector가 TableModel에 추가되므로, 그냥 지우면 각 행은 동일한 Vector에 대한 참조를 갖게됩니다.

올바른 경로에 있습니까?

예, 각 행이 열 데이터를 포함하는 다른 Vector를 참조 할 수 있도록 모든 데이터 행에 대해 새 Vector를 만들어야합니다. 같은 뭔가 :

dataTemp = new Vector(); // added 

while(cellIterator.hasNext()) 
{ 
    Cell cell = cellIterator.next(); 
    if(rowIterator.hasNext()) 
    { 
     if(cell.getCellType() == Cell.CELL_TYPE_STRING) 
     { 
      dataTemp.add(cell.getStringCellValue()); 
     } 
     else if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) 
     { 
      dataTemp.add(cell.getNumericCellValue()); 
     } 
     //data.addElement(dataTemp); 
    } 
    else 
    { 
     break; 
    } 
} 

data.add(dataTemp); // added 

는 이제 data 벡터는 모든 행과 벡터는 벡터있는 각 행 또는 행의 각 열에 대한 벡터를 표현 벡터의 벡터이다.

편집 :

Iterator<Row> rowIterator = sheet.iterator(); 

while(rowIterator.hasNext()) 
{ 
    Row row = rowIterator.next(); 
    Iterator<Cell> cellIterator = row.cellIterator(); 

    if(row.getRowNum() == 0) 
    { 
     while(cellIterator.hasNext()) 
     { 
      Cell cell = cellIterator.next(); 
      columns.add(cell.getStringCellValue()); 
     } 
    } 
    else 
    { 
     dataTemp = new Vector(); 

     while(cellIterator.hasNext()) 
     { 
      Cell cell = cellIterator.next(); 

      if(cell.getCellType() == Cell.CELL_TYPE_STRING) 
      { 
       dataTemp.add(cell.getStringCellValue()); 
      } 
      else if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC) 
      { 
       dataTemp.add(cell.getNumericCellValue()); 
      } 
     } 

     data.add(dataTemp); 
    } 

}

+0

가 대단히 감사합니다. 이 지금 작동합니다. 나는 조금 길게 프로그래밍 해 왔다고 생각한다. 산책 할 시간이야! 나는 rep를 줄 것이지만 나는 할 수 없다. ( – Redspart

+0

@Redspart, 나는 Apache POI를 한번도 사용하지 않았지만, 당신의 코드는 나에게 조금 복잡해 보인다. 나는 당신이 RowIterator를 가질 것이라고 생각했을 것이다. CellIterator : 코드는 CellIterator 내에서 RowIterator가 있음을 암시하는 것으로 보입니다 (코드를 올바르게 읽는 경우).Anwyway, 원래 가정이 맞다면 코드를 단순화 할 수있는 몇 가지 코드를 게시했습니다. – camickr

+0

'Sheet'와'Row'는 모두'Iterable'이므로, [here] (http://stackoverflow.com/a/3562214/230513)에서 볼 수 있듯이 _for-each_ 루프를 사용할 수 있습니다. – trashgod

관련 문제