2013-03-04 49 views
1

在下面的代碼中,我已經從Excel電子表格的數據流中分組了,我的問題是我如何將每個分組的流導出到Excel文件?寫一個流excel文件

package excelgroupdata; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.util.Iterator; 


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

public class ExcelGroupData { 

public static void main(String args[]) throws Exception 
{ 
//create a input stream for your excel file from which data will be read. 
    FileInputStream excelSheetInput = new FileInputStream("C:/test1.xlsx"); 
    //POIFSFileSystem myFileSystem = new POIFSFileSystem(excelSheetInput); 
    XSSFWorkbook myWorkBook = new XSSFWorkbook(excelSheetInput); 
    //get first work sheet in your excel file. 
    Sheet sheet = myWorkBook.getSheetAt(0); 
    //we will read data in first rows(0) second column(1) 
    Iterator<Row> rowIterator = sheet.iterator(); 
    Row myRow = sheet.getRow(1); 
    Cell myCell= myRow.getCell(0); 
    Iterator<Cell> cellIterator ; 
    String firstCell = myCell.getStringCellValue(); 
    int count =1; 
    String nextCell; 
    String Matter = "Matter Number: "+firstCell; 
    System.out.println(Matter); 
    while(rowIterator.hasNext()) 
    { 


     myRow = sheet.getRow(count); 
     cellIterator = myRow.cellIterator(); 
     myCell= myRow.getCell(0); 
     nextCell= myCell.getStringCellValue(); 


     if(nextCell.equals(firstCell)) 
     { 

      while(cellIterator.hasNext()) { 

          Cell cell = cellIterator.next(); 

          switch(cell.getCellType()) { 
           case Cell.CELL_TYPE_BOOLEAN: 
            System.out.print(cell.getBooleanCellValue() + "\t\t"); 
            break; 
           case Cell.CELL_TYPE_NUMERIC: 
            cell.setCellType(Cell.CELL_TYPE_STRING); 
            System.out.print(cell.getStringCellValue() + "\t\t"); 
            break; 
           case Cell.CELL_TYPE_STRING: 
            System.out.print(cell.getStringCellValue() + "\t\t"); 
            break; 
          } 
         } 
      System.out.println(); 
      count++; 

     } 
     else 
     {   
      myRow = sheet.getRow(count); 
      myCell= myRow.getCell(0); 
      nextCell=myCell.getStringCellValue(); 
      firstCell=nextCell; 
      Matter = "Matter Number: "+firstCell; 
      System.out.println(Matter); 
     } 

    } 


} 
} 

我知道,有一些錯誤編碼的元素,但目前沒有關注,一般的想法起作用。

這是我在流中的數據以及如何分組輸出如下:

Matter Number: A4041222 
A4041222  Sihlaba  2011/09/16  2013/09/15  2012/11/20  
Matter Number: A4041231 
A4041231  Gwavu  2011/09/26  2013/09/26  2012/11/22  
Matter Number: A4041260 
A4041260  Lin   2011/11/21  2013/11/20  2012/11/29  
A4041260  Lin   2011/09/16  2013/09/15  2012/11/29  
Matter Number: A4041281 
A4041281  Sharma  2011/09/16  2013/09/15  2013/01/21  
Matter Number: A4041336 
A4041336  Nkwankwana 2011/09/16  2013/09/15  2013/01/21  
A4041336  Nkwankwana 2011/09/16  2013/09/15  2013/01/21  
Matter Number: A4041420 
A4041420  Gqozo  2011/09/22  2013/09/21  2012/07/18  
A4041420  Gqozo  2011/09/22  2013/09/21  2012/07/20  
Matter Number: A4041494 
A4041494  Henneberry 2011/09/21  2013/09/20  2013/01/21  
Matter Number: A4041522 
A4041522  Monepya  2011/09/16  2013/09/15  2013/01/21  
Matter Number: A4041600 
A4041600  Vezi  2011/09/16  2013/09/15  2012/12/13  
Matter Number: A4041640 
A4041640  Cupido  2011/09/27  2013/09/26  2012/09/25  
A4041640  Cupido  2011/09/26  2013/09/25  2012/11/27  
Matter Number: A4041644 
A4041644  Mfingwana 2011/09/27  2013/09/26  2013/01/21  
A4041644  Mfingwana 2011/09/27  2013/09/27  2013/01/21  
Matter Number: A4041665 
A4041665  Mafura  2011/09/29  2013/09/28  2012/12/13  
Matter Number: A4041770 
A4041770  Mlangeni 2011/09/17  2013/09/16  2012/10/12  
Matter Number: A4041965 
A4041965  Vukeya  2011/09/17  2013/09/17  2012/11/22  
Matter Number: A4042005 
A4042005  Tayerera 2011/09/17  2013/09/16  2012/11/27  
A4042005  Tayerera 2011/11/11  2013/11/10  2012/11/27  
A4042005  Tayerera 2011/11/11  2013/11/10  2012/11/27  
A4042005  Tayerera 2011/09/17  2013/09/16  2012/11/27  
Matter Number: A4042029 
A4042029  Wallace  2011/09/17  2013/09/16  2013/01/21  
Matter Number: A4042188 
A4042188  Khoza  2011/10/04  2013/10/04  2012/04/04  
Matter Number: A4042212 
A4042212  Gocini  2011/09/30  2013/09/29  2012/10/29 
+0

如果您想快速而清晰地解決問題,請確保您的代碼實際上可以直接使用。這樣,我們可以在發佈之前快速測試我們的解決方案是否適用於您,而無需先調試您的代碼。 – JeroenWarmerdam 2013-03-04 11:02:33

+0

我的代碼可以用於測試,您可以自己測試它,方法是複製代碼並從http://www.fileswap.com/dl/fRnQ6h61sy/下載電子表格。您還需要確保在庫中有Apache poi模塊。 – Silentdarkness 2013-03-04 11:23:13

回答

1

The tutorials contain examples如何創建Excel文件POI。對於你的情況,從「時間表」演示開始,它可能最接近你所需要的。

+0

這裏是我的問題,我不能指定標題,因爲我工作的每個電子表格都有不同數量的列,這就是爲什麼我想知道我是否可以直接輸入它的原因? – Silentdarkness 2013-03-04 11:25:56

+0

除非我可以直接將數據流式傳輸到Word文件,那麼我不需要將其導出到Excel表格中,理論上應該更容易。 – Silentdarkness 2013-03-04 11:28:19

+1

@ user1982690:爲什麼列數有問題?流式傳輸將如何解決這個問題? – 2013-03-04 16:14:08

1

我編輯我的代碼看起來像如下:

import java.io.BufferedWriter; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileWriter; 
import java.util.Iterator; 


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

public class ExcelGroupData { 

public static void main(String args[]) throws Exception 
{ 
//create a input stream for your excel file from which data will be read. 
    FileInputStream excelSheetInput = new FileInputStream("C:/book2.xlsx"); 
    //POIFSFileSystem myFileSystem = new POIFSFileSystem(excelSheetInput); 
    XSSFWorkbook myWorkBook = new XSSFWorkbook(excelSheetInput); 
    //get first work sheet in your excel file. 
    Sheet sheet = myWorkBook.getSheetAt(0); 
    //we will read data in first rows(0) second column(1) 
    Iterator<Row> rowIterator = sheet.iterator(); 
    Row myRow = sheet.getRow(1); 
    Cell myCell= myRow.getCell(0); 
    Iterator<Cell> cellIterator ; 
    String firstCell = myCell.getStringCellValue(); 
    int count =1; 
    String nextCell; 
    String Matter = "Matter Number: "+firstCell; 
    String num = firstCell; 
    System.out.println(Matter); 
    FileWriter fWriter = null; 
    BufferedWriter writer = null; 
    fWriter = new FileWriter(num+".txt"); 
    writer = new BufferedWriter(fWriter); 
    writer.write(Matter); 
    writer.newLine(); 
    while(rowIterator.hasNext()) 
    { 


     myRow = sheet.getRow(count); 
     cellIterator = myRow.cellIterator(); 
     myCell= myRow.getCell(0); 
     nextCell= myCell.getStringCellValue(); 


     if(nextCell.equals(firstCell)) 
     { 

      while(cellIterator.hasNext()) { 

          Cell cell = cellIterator.next(); 

          switch(cell.getCellType()) { 
           case Cell.CELL_TYPE_BOOLEAN: 
            System.out.print(cell.getBooleanCellValue() + "\t\t"); 
            break; 
           case Cell.CELL_TYPE_NUMERIC: 
            cell.setCellType(Cell.CELL_TYPE_STRING); 
            System.out.print(cell.getStringCellValue() + "\t\t"); 
            writer.write(cell.getStringCellValue()+ "\t"); 
            break; 
           case Cell.CELL_TYPE_STRING: 
            System.out.print(cell.getStringCellValue() + "\t\t"); 
            writer.write(cell.getStringCellValue()+ "\t"); 
            break; 
          } 
         } 
      System.out.println(); 
      writer.newLine(); 
      count++; 

     } 
     else 
     {   
      writer.close(); 
      myRow = sheet.getRow(count); 
      myCell= myRow.getCell(0); 
      nextCell=myCell.getStringCellValue(); 
      firstCell=nextCell; 
      Matter = "Matter Number: "+firstCell; 
      num = firstCell; 
      System.out.println(Matter); 
      fWriter = new FileWriter(num+".txt"); 
      writer = new BufferedWriter(fWriter); 
      writer.write(Matter); 
      writer.newLine(); 
     } 

    } 


} 
} 

這就是現在每個組寫入到一個文本文件,但其不是寫在最後一組到文本文件,但一般的概念是存在的。

+0

有關已完成工作的美妙之處在於,它可以編輯爲寫入一個csv文件,因此它使我在doc,rtf和txt文件以及某種形式的excel輸出方面具有靈活性 – Silentdarkness 2013-03-05 06:23:09