【问题标题】:How to read both .xsl and .xlsx using POI?如何使用 POI 读取 .xls 和 .xlsx?
【发布时间】:2014-01-13 10:16:48
【问题描述】:

我尝试过 POI 版本 1.poi-src-3.9-20121203 也有 2.poi-bin-3.10-beta2-20130904

但无法读取 .xls 文件 低于错误 " org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidFormatException: 包应包含内容类型部分 [M1.13]"

注意:我可以读取 .xlsx 文件。

【问题讨论】:

  • 你试过的代码是什么? xssf 是否支持这两种格式?这也与硒无关。

标签: xssf


【解决方案1】:

这是为 .xlsx 准备的

try {            
            // Get the workbook object for XLSX file
            XSSFWorkbook wBook = new XSSFWorkbook(new FileInputStream(path));
            // Get first sheet from the workbook
            XSSFSheet sheet = (XSSFSheet) wBook.getSheetAt(0);
            XSSFRow row;
            XSSFCell cell;
            // Iterate through each rows from first sheet
            Iterator<org.apache.poi.ss.usermodel.Row> rowIterator = sheet.iterator();
                    while (rowIterator.hasNext()) {
                StringBuffer data = new StringBuffer();
                row = (XSSFRow) rowIterator.next();

                // For each row, iterate through each columns
                Iterator<Cell> cellIterator = row.cellIterator();
                int count = 0;
                while (cellIterator.hasNext()) {
                    count++;
                    cell = (XSSFCell) cellIterator.next();

                        if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC)
                        {
                                 data.append(cell.getRawValue()+ ";");
                        }else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN)
                        {
                            data.append(cell.getBooleanCellValue() + ";");
                        } else if(cell.getCellType() == Cell.CELL_TYPE_STRING)
                        {
                            data.append(cell.getStringCellValue() + ";");
                        }  
                        else if(cell.getCellType() == Cell.CELL_TYPE_BLANK)
                        {
                            data.append("" + ";");
                        }
                        else
                        {
                            data.append(cell + ";");
                        }
                }
                String finalStr = data.toString().substring(0, (data.length()-1));
               System.out.print(finalStr);
            }

        } catch (Exception ioe) {
            ioe.printStackTrace();
        }

Thia 用于 .xls

try {            
            // Get the workbook object for XLS file
            HSSFWorkbook wBook = new HSSFWorkbook(new FileInputStream(path));
            // Get first sheet from the workbook
            HSSFSheet sheet = (HSSFSheet) wBook.getSheetAt(0);
            HSSFRow row;
            HSSFCell cell;
            // Iterate through each rows from first sheet
            Iterator<org.apache.poi.ss.usermodel.Row> rowIterator = sheet.iterator();
                    while (rowIterator.hasNext()) {
                StringBuffer data = new StringBuffer();
                row = (HSSFRow) rowIterator.next();

                // For each row, iterate through each columns
                Iterator<Cell> cellIterator = row.cellIterator();
                int count = 0;
                while (cellIterator.hasNext()) {
                    count++;
                    cell = (HSSFCell) cellIterator.next();

                        if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC)
                        {
                                 data.append(cell.getRawValue()+ ";");
                        }else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN)
                        {
                            data.append(cell.getBooleanCellValue() + ";");
                        } else if(cell.getCellType() == Cell.CELL_TYPE_STRING)
                        {
                            data.append(cell.getStringCellValue() + ";");
                        }  
                        else if(cell.getCellType() == Cell.CELL_TYPE_BLANK)
                        {
                            data.append("" + ";");
                        }
                        else
                        {
                            data.append(cell + ";");
                        }
                }
                String finalStr = data.toString().substring(0, (data.length()-1));
               System.out.print(finalStr);
            }

        } catch (Exception ioe) {
            ioe.printStackTrace();
        }

【讨论】:

    【解决方案2】:

    尝试使用org.apache.poi.ss.usermodel.Workbook。它可以用于 .xls 和 .xlsx 文件

    Workbook workbook = null;
            if (suffix.equalsIgnoreCase("xls")) {
                workbook = (Workbook) new HSSFWorkbook(new POIFSFileSystem(
                        new FileInputStream(assetFile)));
    
            } else if (suffix.equalsIgnoreCase("xlsx")) {
                InputStream inp = new FileInputStream(assetFile);
                workbook = new XSSFWorkbook(inp);
                inp.close();
            }

    【讨论】:

      【解决方案3】:

      你也需要 poi-ooxml 来读取 xlsx 格式。 添加此 Maven 依赖项

      <dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi-ooxml</artifactId>
          <version>3.15</version>
      </dependency>
      

      xls 使用

      Workbook  = new HSSFWorkbook(new FileInputStream(new File("fileName")));
      

      对于 xlsx 使用

      Workbook  = workbook = new XSSFWorkbook(new FileInputStream(new File("fileName")));
      

      如果您在阅读之前不知道文件格式,有时查找 .xls 或 .xlsx 文件扩展名可能并不总是足以找到实际的文件格式。在这种情况下这样做

      Workbook workbook;
      try {
          workbook = new HSSFWorkbook(new FileInputStream(new File("fileName")));
          System.out.println(" Reading XLS file");
      } catch (OfficeXmlFileException e) {
          System.out.println(" Reading XLSX file");
          workbook = new XSSFWorkbook(new FileInputStream(new File("fileName")));
      }
      

      Rest 都是一样的 .xls 和 .xlsx

      通过自动检测输入来创建工作簿的更简单方法是

      Workbook workbook = WorkbookFactory.create(new File("fileName"));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-10
        • 2017-09-29
        • 2011-06-08
        • 1970-01-01
        相关资源
        最近更新 更多