zoukankan      html  css  js  c++  java
  • java读取excel文件

    使用到的包: poi-ooxml-3.14.jar;  poi-ooxml.jar;

    1. 在网上查找相关文件,最多的答案就是使用 HSSFWorkbook 进行读取:  

    POIFSFileSystem poifsFileSystem = new POIFSFileSystem(new FileInputStream(file));
    HSSFWorkbook workbook = new HSSFWorkbook(poifsFileSystem);
    

     结果:对xlsx文件识别不了;

    2.专门针对xlsx文件找解决方案,得到用 XSSFWorkbook 进行处理;    

    XSSFWorkbook workbook = new XSSFWorkbook(new BufferedInputStream(stream)); 
    

     结果:可以识别xlsx文件;

    3.需要对文件进行判定,什么情况用 HSSFWorkbook,什么情况下用XSSFWorkbook 

    if(!inp.markSupported())
      inp = new PushbackInputStream(inp, 8);
    if(NPOIFSFileSystem.hasPOIFSHeader(IOUtils.peekFirst8Bytes(inp))){
      NPOIFSFileSystem fs = new NPOIFSFileSystem(inp);
    }else if(POIXMLDocument.hasOOXMLHeader(inp))
      return new XSSFWorkbook(OPCPackage.open(inp));
    else
      throw new InvalidFormatException("你的excel版本目前poi解析不了");
    

     ok,看似完美解决问题,但其实在WorkbookFactory里已经有了对excel 的相关操作方法

    4. 借用工具类 WorkbookFactory  

    /** 
     * Creates the appropriate HSSFWorkbook / XSSFWorkbook from 
     *  the given InputStream. 
     * Your input stream MUST either support mark/reset, or 
     *  be wrapped as a {@link PushbackInputStream}! 
     */  
     public static Workbook create(InputStream inp) throws IOException, InvalidFormatException {  
        // If clearly doesn't do mark/reset, wrap up  
        if(! inp.markSupported()) {  
            inp = new PushbackInputStream(inp, 8);  
        }  
              
        if(POIFSFileSystem.hasPOIFSHeader(inp)) {  
            return new HSSFWorkbook(inp);  
        }  
        if(POIXMLDocument.hasOOXMLHeader(inp)) {  
            return new XSSFWorkbook(OPCPackage.open(inp));  
        }  
        throw new IllegalArgumentException("Your InputStream was neither an OLE2 stream, nor an OOXML stream");  
      }  
    

    5. 终极版 

    Workbook workbook = WorkbookFactory.create(new FileInputStream(file));
    

     一行代码搞定,^_^;

     

  • 相关阅读:
    PAT Advanced 1044 Shopping in Mars (25) [⼆分查找]
    PAT Advanced 1029 Median (25) [two pointers]
    PAT Advanced 1010 Radix(25) [⼆分法]
    PAT Basic 1070 结绳(25) [排序,贪⼼]
    PAT Basic 1023 组个最⼩数 (20) [贪⼼算法]
    PAT Basic 1020 ⽉饼 (25) [贪⼼算法]
    PAT Advanced 1070 Mooncake (25) [贪⼼算法]
    PAT Advanced 1067 Sort with Swap(0,*) (25) [贪⼼算法]
    PAT Advanced 1038 Recover the Smallest Number (30) [贪⼼算法]
    PAT Advanced 1037 Magic Coupon (25) [贪⼼算法]
  • 原文地址:https://www.cnblogs.com/xx0405/p/5305566.html
Copyright © 2011-2022 走看看