2015-08-24 3 views
5

Ich habe eine große Excel-Datei. Ich möchte eine Spalte "Hauptsächlich verwendet für" für Werte "hauptsächlich für mobile verwendet" filtern. Dann muss ich die entsprechenden Werte in der Spalte "Number Series" in einer Liste speichern. Ich habe einen Code für den Anfang. Ich bin jedoch nicht in der Lage, den Filterteil zu tun und ihn in einer Array-Liste zu speichern. Könnten Sie mir bitte hier helfen?Filter Spalte in Excel mit Java Poi

Ich habe etwas gegraben und den Code geändert. Jedoch konnte ich meine Anforderung nicht erfüllen. Ich habe folgende Probleme -

* Der Code wählt nur zwei Spalten und zeigt ihren Inhalt an. Nicht in der Lage zu filtern :(

* Das Excel hat Spaltennamen mit Leerzeichen. So bekomme ich den Fehler. Da das Excel vom Benutzer generiert wird, haben wir keine Kontrolle über Spaltennamen. Wie Sie mit der Spalte umgehen Namen mit Leerzeichen ??

* Excel hat alpha-numerische Werte, wie man mit ihnen umgehen?

Könnten Sie mir bitte helfen hier.

package com.excel; 
import java.io.File; 
import java.io.FileInputStream; 
import java.math.BigDecimal; 
import java.io.FileOutputStream; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook;*/ 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.hssf.usermodel.HSSFSheet; 


public class Test { 

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

     File excel = new File("D:\\FileDownload\\example.xls"); 
     //File excel = new File("D:\\FileDownload\\Sample_Filtered.xls"); 
     FileInputStream fis = new FileInputStream(excel); 

     //XSSFWorkbook wb = new XSSFWorkbook(fis); 
     HSSFWorkbook wb = new HSSFWorkbook(fis); 
     //org.apache.poi.ss.usermodel.Workbook wb = WorkbookFactory.create(fis); 
     HSSFSheet ws = wb.getSheetAt(0); 
     // org.apache.poi.ss.usermodel.Sheet ws = wb.getSheetAt(0); 
     ws.setForceFormulaRecalculation(true); 

     int rowNum = ws.getLastRowNum() + 1; 
     int colNum = ws.getRow(0).getLastCellNum(); 
     int mainlyUsedForHeaderIndex = -1, mobileSeriesHeaderIndex = -1; 

     //Read the headers first. Locate the ones you need 
     HSSFRow rowHeader = ws.getRow(0); 
     for (int j = 0; j < colNum; j++) { 
      HSSFCell cell = rowHeader.getCell(j); 
      String cellValue = cellToString(cell); 
      if("Mainly used for".equalsIgnoreCase(cellValue)) { 
      //if("MainlyFor".equalsIgnoreCase(cellValue)) { 
       mainlyUsedForHeaderIndex = j; 
      } else if("Number Series".equalsIgnoreCase(cellValue)) { 
       //else if("MobileSeries".equalsIgnoreCase(cellValue)) { 
       mobileSeriesHeaderIndex = j; 
      } 
      } 

     if(mainlyUsedForHeaderIndex == -1 || mobileSeriesHeaderIndex == -1) { 
      throw new Exception("Could not find header indexes\n Mainly used for : " + mainlyUsedForHeaderIndex + " | Number Series: " + mobileSeriesHeaderIndex); 
     }else{ 
      System.out.println("Indexes are found!!!"); 
     } 


     //createnew workbook 
     XSSFWorkbook workbook = new XSSFWorkbook();   
     //Create a blank sheet 
     XSSFSheet sheet = workbook.createSheet("data"); 

     for (int i = 1; i < rowNum; i++) { 
      HSSFRow row = ws.getRow(i); 
      //row = sheet.createRow(rowNum++); 
      String MainlyUsed = cellToString(row.getCell(mainlyUsedForHeaderIndex)); 
      String ForMobile = cellToString(row.getCell(mobileSeriesHeaderIndex)); 
      int cellIndex = 0; 
      XSSFRow newRow = sheet.createRow(i-1); 
      newRow.createCell(cellIndex++).setCellValue(MainlyUsed); 
      newRow.createCell(cellIndex++).setCellValue(ForMobile); 



     } 
     FileOutputStream fos = new FileOutputStream(new File("D:\\FileDownload\\test1.xlsx")); 
     System.out.println("File generated"); 
     workbook.write(fos); 
     fos.close(); 
    } 

    public static String cellToString(HSSFCell cell) { 

     int type; 
     Object result = null; 
     type = cell.getCellType(); 

     switch (type) {/* 

     case HSSFCell.CELL_TYPE_NUMERIC: 
      result = BigDecimal.valueOf(cell.getNumericCellValue()) 
        .toPlainString(); 

      break; 
     case HSSFCell.CELL_TYPE_STRING: 
      result = cell.getStringCellValue(); 
      break; 
     case HSSFCell.CELL_TYPE_BLANK: 
      result = ""; 
      break; 
     case HSSFCell.CELL_TYPE_FORMULA: 
      result = cell.getCellFormula();*/ 

     case HSSFCell.CELL_TYPE_BLANK: 
       result=""; 
       break; 
     case HSSFCell.CELL_TYPE_BOOLEAN: 
       // 
       result = cell.getBooleanCellValue(); 
       break; 
     case HSSFCell.CELL_TYPE_ERROR: 
       // 
       break; 

     case HSSFCell.CELL_TYPE_FORMULA: 
       result = cell.getCellFormula(); 
       break; 
     case HSSFCell.CELL_TYPE_NUMERIC: 
       // 
       result = cell.getNumericCellValue(); 
       break; 
     case HSSFCell.CELL_TYPE_STRING: 
       result= cell.getRichStringCellValue(); 
       // result = cell.getStringCellValue(); 
       break; 
    } 


     return result.toString(); 
    } 
} 

Antwort

2

ich bin in der Lage meine Anforderung zu erfüllen mit ganz anderen Ansatz folgend.

package com.excel; 

import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 


import org.apache.poi.hssf.usermodel.HSSFCell; 
import org.apache.poi.hssf.usermodel.HSSFRow; 
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; 

public class ExcelRead { 

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

      String fileName = "D:\\FileDownload\\example.xls"; 
      String cellContent = "Mainly used for mobile"; 
      int rownr=0; 
      int colnr = 0; //column from which you need data to store in array list 

      InputStream input = new FileInputStream(fileName); 

      HSSFWorkbook wb = new HSSFWorkbook(input); 
      HSSFSheet sheet = wb.getSheetAt(0); 
      List MobileSeries=new ArrayList(); 
      MobileSeries = findRow(sheet, cellContent); 

      if(MobileSeries !=null){ 
       for(Iterator iter=MobileSeries.iterator();iter.hasNext();){ 
        System.out.println(iter.next()); 


      } 
      } 
      //output(sheet, rownr, colnr); 

      finish(); 
     } 

     private static void output(HSSFSheet sheet, int rownr, int colnr) { 
      /* 
      * This method displays the total value of the month 
      */ 

      HSSFRow row = sheet.getRow(rownr); 
      HSSFCell cell = row.getCell(colnr); 

        System.out.println("Your total is: " + cell);   
     } 

     private static List findRow(HSSFSheet sheet, String cellContent) { 
      List MobileSeries=new ArrayList(); 
      for (Row row : sheet) { 
       for (Cell cell : row) { 
        if (cell.getCellType() == Cell.CELL_TYPE_STRING) { 
         if (cell.getRichStringCellValue().getString().trim().equals(cellContent)) { 
          //System.out.println("Row numbers are"+row.getRowNum()); 
          int rownumber=row.getRowNum(); 
          //return row.getRowNum(); 
          HSSFRow row1 = sheet.getRow(rownumber); 
          HSSFCell cell1 = row1.getCell(0); 
          MobileSeries.add(cell1); 
         } 
        } 
       } 
      }  
      return MobileSeries; 


     } 

     private static void finish() { 

      System.exit(0); 
     } 
    }