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

+0

Мой код работает в окне, вы можете проверить его самостоятельно, скопировав код и загрузив таблицу с http://www.fileswap.com/dl/fRnQ6h61sy/, убедитесь сами. Вам также необходимо убедиться, что у вас есть модули Apache poi в ваших библиотеках. – Silentdarkness

ответ

1

The tutorials contain examples как создавать файлы Excel с POI. Для вашего случая, начните с демонстрации «Расписание», она, вероятно, ближе всего к тому, что вам нужно.

+0

вот моя проблема, я не могу указать заголовки из-за того, что каждая электронная таблица, с которой я работаю, имеет разные количества столбцов, поэтому я хочу знать, могу ли я ее транслировать прямо? – Silentdarkness

+0

, если я не могу напрямую передать данные в текстовый файл, тогда мне не нужно экспортировать его на лист Excel, который теоретически должен быть проще. – Silentdarkness

+1

@ user1982690: Почему количество столбцов является проблемой? И как бы потоковое решение это разрешило? –

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

Смежные вопросы