2014-02-20 41 views
1

我有follwing表中的Excel电子表格如何使用apache poi将excel分割为多个excel?

manager salary 
puk   2 
puk   3 
puk   4 
puk   5 
ser   3 
ser   4 
ser   5 
sos   23 
sos   24 
sos   25 
sos   26 
sos   27 

我需要这个电子表格拆分为使用FileOutputStream三个不同shpreadsheets。第一个应包含经理puk,第二个ser的所有条目。 。 。

我不能想出一个很好的逻辑来分割它。我应该创建原始电子表格的临时副本,然后删除所有额外的行并保存它?比如何删除行?

(这可能已与CSVReader很容易做到,但我需要保留格式)

+0

而不是删除...转移细胞将是更好的选择。试试这个http://stackoverflow.com/a/19951595/624003 – Sankumarsingh

+0

你可能想要划分模板和数据电子表格。该模板只有格式。从电子表格中读取数据并将其放入临时列表中。当数据输出时,复制模板电子表格。 –

回答

2

这里是如何做到你的要求,我已经测试了它的整个程序和它完美的作品:) 告诉我你的想法:

package additives; 
import org.apache.poi.ss.usermodel.*; 
import org.apache.poi.xssf.usermodel.*; 

import java.util.*; 

import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 

import java.io.*; 
public class StackOverflow { 

    public static Workbook readWorkbook(){ 

     Workbook wb=null; 
     try { 
      wb = WorkbookFactory.create(new File("stackOverflow.xlsx")); 
     } catch (InvalidFormatException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return wb; 
    } 

    public static void writeToSheet(List<String> name, List<Double> salary, int sheetCounter, List<Sheet> outputSheets){ 


     for(int i=0;i<salary.size();i++){ 

      Row row=outputSheets.get(sheetCounter).createRow(i); 

      Cell nameCell=row.createCell(0); 
      nameCell.setCellValue(name.get(i)); 

      Cell salaryCell=row.createCell(1); 
      salaryCell.setCellValue(salary.get(i)); 
     } 
    } 

    public static void writeToWorkbook(Workbook wb){ 

     try{ 
      FileOutputStream out=new FileOutputStream("new StackOverflow.xlsx"); 
      wb.write(out); 
      out.close(); 
     } catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args){ 

     Workbook inputWb=readWorkbook(); 
     Sheet inputWs=inputWb.getSheet("sheet1"); 

     List<String> name=new ArrayList<>(); 
     List<Double> salary=new ArrayList<>(); 

     Workbook outputWb=new XSSFWorkbook(); 
     List<Sheet> outputSheets=new ArrayList<>(); 

     int rowIndex=inputWs.getLastRowNum()+1; 
     int sheetCounter=0; 

     for(int i=1; i<rowIndex-1; i++){ 
      Row outerRow=inputWs.getRow(i); 
      Row innerRow=null; 
      Cell outerCell=outerRow.getCell(0); 
      Cell innerCell=null; 

      int j=0; 
      for(j=i+1;j<rowIndex;j++){ 

       innerRow=inputWs.getRow(j); 
       innerCell=innerRow.getCell(0); 

       if(outerCell.getStringCellValue().equals(innerCell.getStringCellValue())){ 
        name.add(innerRow.getCell(0).getStringCellValue()); 
        salary.add(innerRow.getCell(1).getNumericCellValue()); 
       } 


       if(!outerCell.getStringCellValue().equals(innerCell.getStringCellValue())){ 

        break; 
       } 


      } 

      name.add(outerRow.getCell(0).getStringCellValue()); 
      salary.add(outerRow.getCell(1).getNumericCellValue()); 
      i=j; 
      outputSheets.add(outputWb.createSheet("sheet"+sheetCounter)); 
      writeToSheet(name,salary,sheetCounter, outputSheets); 
      sheetCounter++; 
      name.clear(); 
      salary.clear(); 

      Row tempRow=inputWs.getRow(i); 
      try{ 
       name.add(tempRow.getCell(0).getStringCellValue()); 
       salary.add(tempRow.getCell(1).getNumericCellValue()); 
      }catch(Exception e){ 
       continue; 
      } 
     } 
     writeToWorkbook(outputWb); 
    } 
} 
+0

谢谢安尼斯,它是完美的 – CHEBURASHKA