2016-01-20 83 views
0

我在我的Struts 1.3.10项目中使用Apache-poi 3.9。 我有两个错误,当我在这个功能编译:Apache-poi“编译错误:类型不匹配”

private boolean parserHSSFSheet(HSSFSheet pageAccord, StringBuffer idPaa, StringBuffer idGroupe, 
      StringBuffer idFournisseur, StringBuffer idFamille, StringBuffer periode, Map<Integer, Marque> mapMarque, 
      Map<Integer, Ristournable> mapRistournable, Map<Integer, PerimetreProduitEnum> mapTypeDeclaration, 
      Map<Integer, FamilleDeProduitsNomenclature> mapFamille, Map<Integer, String> mapMarqueProduit, 
      TreeMap<Integer, TreeMap<Integer, BigDecimal>> mapColonneAdherentMontant, 
      TreeMap<Integer, BigDecimal> mapAdherentQuantite) throws Exception { 

... 

for (Iterator<HSSFRow> rit = pageAccord.rowIterator(); rit.hasNext();) { 
    HSSFRow row = (HSSFRow) rit.next(); 

    String typeCellule = ""; 

    for (Iterator<HSSFCell> cit = (Iterator<HSSFCell>) row.cellIterator(); cit.hasNext();) { 
     HSSFCell cell = cit.next(); 

     if (cell.getCellNum() == ((short) 0)) { 

... 

} 

错误:

pageAccord.rowIterator();

Type mismatch: cannot convert from Iterator to Iterator

而且

(Iterator<HSSFCell>) row.cellIterator();

Cannot cast from Iterator to Iterator

回答

2

你见过文档吗? https://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFSheet.html表示rowIterator返回java.util.Iterator<Row>,因此您无法将其“向前”投射。同样是关于电池等

变化

Iterator<HSSFRow> rit = pageAccord.rowIterator(); rit.hasNext(); 

Iterator<Row> rit = pageAccord.rowIterator(); rit.hasNext(); 

而对于cellIterator

秒施法做同样的,CellHSSFCell应该工作,如果确实迭代器会使用HSSFCell返回兼容类型。

2

按照API文档调用

  • pageAccord.rowIterator()返回java.util.Iterator<Row>。请参阅here
  • row.cellIterator()返回java.util.Iterator<Cell>。见here

Cell都只是接口。尽管如此,我仍会尽可能处理这些问题,并将明确的向下转换推迟到实际需要(并允许)的地方。

这样:修改你的迭代器符合上面列出的类型(这也可能意味着使用的地方通用Iterator<?>),只有垂头丧气后(比如你HSSFRow row = (HSSFRow) rit.next();)。

-2

请找到以下程序的快速解决方案

workbook = WorkbookFactory.create(new FileInputStream(envFilePath + "\\"+ listOfFiles[i].getName())); 
          // Get the first sheet. 
          Sheet sheet = workbook.getSheetAt(0); 

          // Get the first cell. 
          Row row = sheet.getRow(0); 
          Cell cell = row.getCell(0); 

测试程序,它可以帮助你

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 

import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 
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.ss.usermodel.Workbook; 
import org.apache.poi.ss.usermodel.WorkbookFactory; 

public class TestExcelFile { 

    public static void main(String[] args) { 
     String envFilePath = System.getenv("AZURE_FILE_PATH"); 

     // upload list of files/directory to blob storage 
     File folder = new File(envFilePath); 
     File[] listOfFiles = folder.listFiles(); 

     for (int i = 0; i < listOfFiles.length; i++) { 
      if (listOfFiles[i].isFile()) { 
       System.out.println("File " + listOfFiles[i].getName()); 

       Workbook workbook; 
       try { 
         workbook = WorkbookFactory.create(new FileInputStream(envFilePath + "\\"+ listOfFiles[i].getName())); 
         // Get the first sheet. 
         Sheet sheet = workbook.getSheetAt(0); 

         // Get the first cell. 
         Row row = sheet.getRow(0); 
         Cell cell = row.getCell(0); 

         // Show what is being read. 
         System.out.println(cell.toString()); 
         for (Cell cell1 : row) { 
          System.out.println(cell1.toString()); 
         } 
       } catch (InvalidFormatException | IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 
+0

按http://poi.apache.org/spreadsheet/如果你有一个'File',quick-guide.html#FileInputStream不使用'InputStream'! – Gagravarr

+0

从3.14版本的POI依赖关系解决了这个问题,如果有人使用低于版本,那么这是解决方案。我正在使用3.9库到我的项目,文件不可能。 –