poi excel 03と07の互換性のない問題を解決する


new HSSFWorkbook(new FileInputStream)を使用してWorkbookを読み取り始めたばかりで、Excel 2003以前(2003含む)のバージョンでは問題ありませんでしたが、Excel 2007を読み込むと、org.apache.poi.poifs.filesystem.OfficeXmlFileException:The supplied data appears to be in the Office 2007+XML.You are calling the part of POI that deals with OLE 2 Office Documents.You need to call a different part of POI to process this data(eg XSSF instead of HSSF)このエラーは、ファイル中のデータはOffice 2007+XMLで保存されているが、現在はOLE 2 Officeドキュメント処理を呼び出しており、POIの異なる部分を使用してこれらのデータを処理すべきであり、例えばXSSFを使用してHSSFの代わりに処理すべきであることを意味する.そこでヒントを押してHSSFの代わりにXSSFを使い、new XSSFWORkbook(excelFile)でWorkbookを読み取り、Excel 2007には問題なく、しかしExcel 2003を読み込む前に(2003を含む)のバージョンでは、org.apache.poi.openxml 4 j.exceptions.InvalidOperationException:Can't open the specified file:'*.xls'という新しい異常が発生しました.このエラーは、操作が無効で、指定したxlsファイルを開くことができません.POIのソースコードをダウンロードして単一ステップでデバッグしたところ、最初は正しいことがわかりましたが、ZipFまでileクラスになるとファイルが見つからず、ネットで調べてみると、XSSFがExcel 2003を読み込めない以前(2003を含む)のバージョンですが、これでは、読み込む前にファイルが2003前のバージョンなのか2007のバージョンなのかを判断し、それに対応してHSSFやXSSFを呼び出して読み取る必要があります.これは初歩的な考え方ですが、このやり方は面倒なので、APIを見てみると、XSSFとHSSFは別のパッケージに入っているものの、同じインタフェースWorkbookを引用していることに気づき、こう思いました読み込み方法:Workbook book=null;        try {             book = new XSSFWorkbook(excelFile);         } catch (Exception ex) {             book = new HSSFWorkbook(new FileInputStream(excelFile)); }各バージョンのExcelでテストし、異常は発生せず、問題解決.
他のネットユーザーのソリューションも提供します.
    //            
    in = new FileInputStream(excelFile);  
    //            
    Workbook wb =null;  
    //     excel      
    ExcelExtractor extractor=null;  
    String fileName = excelFile.getName();  
    String hz = fileName.substring(fileName.lastIndexOf("."),fileName.length());  
                  
    if(hz.equals(".xls"))//  2003    
    {  
        //  excel2003           
        wb=new HSSFWorkbook(new POIFSFileSystem(in));  
        extractor =new org.apache.poi.hssf.extractor.ExcelExtractor((HSSFWorkbook)wb);  
    }else{ //  2007    
         wb = new  XSSFWorkbook(in);  
         //  excel2007           
         extractor =new XSSFExcelExtractor((XSSFWorkbook)wb);  
    }  
推奨事項:
エクセルバージョンを異常で判断するならorgを使うと思います.apache.poi.poifs.filesystem.OfficeXmlFileExceptionこの異常が良い
私がnew HSSFWorkbookでnew 2007の会報のこの間違いは直接Exceptionを使うのは少し漠然としているでしょうorgを知っていますから.apache.poi.hssf.OldExcelFormatExceptionの間違いこれはEcxel 5を作ることです.0/95の間違いこれはXSSFでも処理できません
自分で処理したコードの部分:
   /**
     * @description     
     * @param filename
     * @return
     * @throws Exception
     * @throws TException
     */
    @RequestMapping(value = "/uploadWfdl", method = RequestMethod.POST, produces = {"application/text;charset=UTF-8"})
    @ResponseBody
    public String importData(@RequestParam("filename") MultipartFile filename,
                             HttpServletRequest request,
                             HttpServletResponse response

    ) throws TException, IOException {

        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        InputStream inputStream = null;
        try {
            inputStream = filename.getInputStream(); //      
        } catch (IOException e) {
            logger.info("importData------------------------>InputStream IOException");
        }

        Workbook workbook  = null;
        try {
            workbook  = new XSSFWorkbook(inputStream); //   2007  
        } catch (Exception ex) {
            logger.info("importData------------------------>XSSFWorkbook Read InputStream Exception");
            try {
                POIFSFileSystem pfs = new POIFSFileSystem(filename.getInputStream()); //   2003  
                workbook = new HSSFWorkbook(pfs);
            } catch (IOException e) {
                logger.info("importData------------------------>HSSFWorkbook Read InputStream Exception");
            }
        }

        Sheet hssfSheet = workbook .getSheetAt(0);
        int rowCount = hssfSheet.getPhysicalNumberOfRows(); //      

        String msg = "";
        if(hssfSheet!=null) {
            for (int i = 1;  i<= rowCount; i++) {
                Row  excelData = hssfSheet.getRow(i);
                if (excelData == null)
                    continue;
           }
         }
      }