2013-03-04 119 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