2013-02-28 139 views
1

如何组,我的分组数据的每一部分都在Excel和输出到单个数据Excel表?的Java Excel的数据进行分组

我的代码如下: 1)从excel表格(.xlsx)获取所有数据,并显示它。 2)将相同的数据输出到另一个名称的路径。

任何帮助/建议将不胜感激

package javaapplication8; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.Date; 
import java.util.HashMap; 
import java.util.Iterator; 
import java.util.Map; 
import java.util.Set; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import org.apache.poi.hssf.usermodel.HSSFSheet; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
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 JavaApplication8 { 
private static String path = ""; 


public static void main(String[] args) throws IOException { 

    JFrame frame = new JFrame(); 
    JFileChooser chooser = new JFileChooser(); 
    chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 
    int option = chooser.showOpenDialog(frame); // parentComponent must a component like JFrame, JDialog... 
    if (option == JFileChooser.APPROVE_OPTION) { 
    File selectedFile = chooser.getSelectedFile(); 
    path = selectedFile.getAbsolutePath(); 

    } 

    try { 

FileInputStream file = new FileInputStream(new File(path)); 

//Get the workbook instance for XLS file 
XSSFWorkbook workbook = new XSSFWorkbook(file); 

//Get first sheet from the workbook 
XSSFSheet 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_BOOLEAN: 
       System.out.print(cell.getBooleanCellValue() + "\t\t"); 
       break; 
      case Cell.CELL_TYPE_NUMERIC: 
       System.out.print(cell.getNumericCellValue() + "\t\t"); 
       break; 
      case Cell.CELL_TYPE_STRING: 
       System.out.print(cell.getStringCellValue() + "\t\t"); 
       break; 
     } 
    } 
    System.out.println(""); 
} 
file.close(); 
FileOutputStream out = 
    new FileOutputStream(new File("C:\\test.xlsx")); 
workbook.write(out); 
out.close(); 

} 
catch (FileNotFoundException e) { 
e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
} 

如果复制上面的代码应该对任何.xlsx文件

数据样本我试图组的工作是:

EPPACC  Cname  AbarDate CTermDat MDiscDat 
A4041222 Sihlaba  2011/09/16 2013/09/15 2012/11/20 
A4041231 Gwavu  2011/09/26 2013/09/26 2012/11/22 
A4041260 Lin   2011/11/21 2013/11/20 2012/11/29 
A4041260 Lin   2011/09/16 2013/09/15 2012/11/29 
A4041281 Sharma  2011/09/16 2013/09/15 2013/01/21 
A4041336 Nkwankwana 2011/09/16 2013/09/15 2013/01/21 
A4041336 Nkwankwana 2011/09/16 2013/09/15 2013/01/21 
A4041420 Gqozo  2011/09/22 2013/09/21 2012/07/18 
A4041420 Gqozo  2011/09/22 2013/09/21 2012/07/20 
A4041494 Henneberry 2011/09/21 2013/09/20 2013/01/21 
A4041522 Monepya  2011/09/16 2013/09/15 2013/01/21 
A4041600 Vezi  2011/09/16 2013/09/15 2012/12/13 
A4041640 Cupido  2011/09/27 2013/09/26 2012/09/25 
A4041640 Cupido  2011/09/26 2013/09/25 2012/11/27 
A4041644 Mfingwana 2011/09/27 2013/09/26 2013/01/21 
A4041644 Mfingwana 2011/09/27 2013/09/27 2013/01/21 
A4041665 Mafura  2011/09/29 2013/09/28 2012/12/13 
A4041770 Mlangeni 2011/09/17 2013/09/16 2012/10/12 
A4041965 Vukeya  2011/09/17 2013/09/17 2012/11/22 
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 
A4042029 Wallace  2011/09/17 2013/09/16 2013/01/21 
A4042188 Khoza  2011/10/04 2013/10/04 2012/04/04 
A4042212 Gocini  2011/09/30 2013/09/29 2012/10/29 

我想分组由EPPACC

+0

是什么本代码吗?它有什么问题? – 2013-02-28 07:34:48

+0

本的代码读取的Excel文件,提取信息,将其显示在NetBeans并且它输出到另一个excel文件(完全相同的数据)。没有问题,我只是不知道如何首先对数据进行分组,然后将每个分组的部分输出到不同的Excel表格中。例如,手机目录,您希望将不同手机的所有手机合同分组,并通过电话分组,并将每部手机的全部合同输出到不同的工作表。 – Silentdarkness 2013-02-28 07:38:17

+0

你能给出一个预期分组的例子吗? – 2013-02-28 07:50:58

回答

0

我还没有看过分组亲但还是希望引起你的注意。

file.close(); 

java.io.FileInputStream.close()此方法的文档:

关闭该文件输入流并释放与该流相关联的所有系统资源 。如果此流具有关联的频道 ,那么该频道也会关闭。

这可能会关闭XSSFWorkbook实例workbook并使其无法使用。

+1

有我的输出没有问题,它输出到文件罚款,我的问题是在定义的问题和你以前的评论:) – Silentdarkness 2013-02-28 07:45:12

0

有一个单独的数据集合为一组,基于CELL_TYPE

List<Boolean> myboolData; 
List<Integer> myIntData; 
List<String> myStrings; 

,然后根据组选择从数据读取这里假设,分配给purticular集合(即组)

switch(cell.getCellType()) { 
      case Cell.CELL_TYPE_BOOLEAN: 
       myboolData.add(cell.getBooleanCellValue()); 
       break; 
      case Cell.CELL_TYPE_NUMERIC: 
       myIntData.add(cell.getNumericCellValue()); 
       break; 
      case Cell.CELL_TYPE_STRING: 
       myStrings.add(cell.getStringCellValue()); 
       break; 
     } 
+0

注意到下:)然而,这似乎并不能帮我解决我的真正问题:( – Silentdarkness 2013-02-28 07:49:16

0

这是一个工作解决方案。

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Iterator; 
import javax.swing.JFileChooser; 
import javax.swing.JFrame; 
import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.xssf.usermodel.XSSFCell; 
import org.apache.poi.xssf.usermodel.XSSFRow; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

public class Test { 

    static ArrayList<XSSFWorkbook> grouplist = new ArrayList(); 

    public static void main(String[] args) throws IOException { 

     JFrame frame = new JFrame(); 
     JFileChooser chooser = new JFileChooser(); 
     chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 
     int option = chooser.showOpenDialog(frame); // parentComponent must a component like JFrame, JDialog... 
     File file = option == JFileChooser.APPROVE_OPTION ? chooser.getSelectedFile() : null; 

     try { 
      if (file != null) { 
       FileInputStream fis = new FileInputStream(file); 

//Get the workbook instance for XLS file 
       XSSFWorkbook workbook = new XSSFWorkbook(fis); 

//Get first sheet from the workbook 
       XSSFSheet sheet = workbook.getSheetAt(0); 

//Iterate through each rows from first sheet 
       Iterator<Row> rowIterator = sheet.iterator(); 
       Row header = rowIterator.next();//skiping columns header 
       while (rowIterator.hasNext()) { 
        Row row = rowIterator.next(); 
        Cell cell = row.getCell(0); 
        String EPPACC = cell.getStringCellValue(); 
        int i = validateGroup(header, cell.getStringCellValue()); 
        XSSFWorkbook group = grouplist.get(i); 
        XSSFSheet sh = group.getSheet(EPPACC); 
        int rc = sh.getLastRowNum() + 1; 
        //creating a row 
        XSSFRow rowx = sh.createRow(rc); 
        for (Cell c : row) { 
       //Creating cells 
         int cellType = c.getCellType(); 
         XSSFCell cc = rowx.createCell(c.getColumnIndex(), cellType); 
         switch (cellType) { 
          case Cell.CELL_TYPE_BOOLEAN: 
           cc.setCellValue(c.getBooleanCellValue()); 
           break; 
          case Cell.CELL_TYPE_NUMERIC: 
           cc.setCellValue(c.getNumericCellValue()); 
           break; 
          case Cell.CELL_TYPE_STRING: 
           cc.setCellValue(c.getStringCellValue()); 
           break; 
         } 

        } 
       } 
       fis.close(); 

       for (XSSFWorkbook book : grouplist) { 
        int lastRowNum = book.getSheetAt(0).getLastRowNum(); 
        String name = book.getSheetAt(0).getSheetName(); 
        FileOutputStream out = new FileOutputStream(new File(file.getParentFile() + "/" + name + ".xlsx")); 
        book.write(out); 
        out.close(); 
       } 
      } 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private static int validateGroup(Row header, String value) throws FileNotFoundException, IOException { 
     for (int i = 0; i < grouplist.size(); i++) { 
      XSSFWorkbook group = grouplist.get(i); 
      XSSFSheet sheet = group.getSheet(value); 
      if (sheet != null) { 
       //group exist. 
       return i; 
      } 
     } 
     //create a new book 
     XSSFWorkbook group = new XSSFWorkbook(); 
     //create a new sheet 
     XSSFSheet sheet = group.createSheet(value); 
     XSSFRow row = sheet.createRow(0); 
     Iterator<Cell> iterator = header.iterator(); 
     while (iterator.hasNext()) { 
      Cell cell = iterator.next(); 
      XSSFCell c = row.createCell(cell.getColumnIndex(), cell.getCellType()); 
      c.setCellValue(cell.getStringCellValue()); 
     } 
     grouplist.add(group); 
     return grouplist.size() - 1; 

    } 

}