"包应包含内容类型部分[M1.13]"

时间:2015-10-01 02:57:27

标签: java excel apache swing apache-poi

我正在尝试写入Excel文件但是我一直收到错误:

  

线程中的异常" main" org.apache.poi.POIXMLException:org.apache.poi.openxml4j.exceptions.InvalidFormatException:包应包含内容类型部分[M1.13]

根据我的理解,我错过了一个jar文件。

任何人都可以帮我识别它是哪个文件吗?

P.S。我正在使用Netbeans。

my current files

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.swing.JOptionPane;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 *
 * @author nicholaskissaun
 */

public class Tester {

    public static void main (String args \[\])throws FileNotFoundException, IOException, InvalidFormatException{     
        int RowCount = 7, iChoice;
        String sChoice;
        XSSFSheet s;
        XSSFRow row1;
        XSSFWorkbook wb;
        XSSFCell r1c1, r1c2, r1c8, r1Episodes;

        FileInputStream fis = new FileInputStream("/Users/nicholaskissaun/Google Drive/Grade 11_12/Computer Science/Java/Term1/src/IA/Profiles/Becky/ShowDetails.xlsx");           
        wb = new XSSFWorkbook(fis);  
        s = wb.getSheetAt(0);

    }      

}

11 个答案:

答案 0 :(得分:9)

使用文件扩展名处理WorkSheet类型

  String inputFilename = new File(path).getName();

                    switch (inputFilename.substring(inputFilename.lastIndexOf(".") + 1,
                            inputFilename.length())) {
                        case "xls":
                            return readXLS(path);

                        case "xlsx":
                            return readXLSX(path);
                        default:
                            Log.e(TAG, "No XLS file chosen");
                            return "Please select valid \"Excel\" File\"";
                    }

对于XLSX文件:使用XSSFWorkbook & XSSFSheet

    XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(new File(path)));

    XSSFSheet sheet = workbook.getSheetAt(0);

对于XLS文件:使用HSSFWorkbook & HSSFSheet

    HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(new File(path)));

    HSSFSheet sheet = workbook.getSheetAt(0);

答案 1 :(得分:5)

当您通过LibreOffice创建XLS / XLSX文件时,可能会发生这种情况。显然,转换中丢失了某些内容,该文件与Microsoft Office中生成的电子表格不同。我有同样的错误,我的解决方案是将我在LibreOffice Calc中完成的所有工作复制到MS Excel电子表格中,然后保存一个新文件。

答案 2 :(得分:2)

您所拥有的是Excel文件与您尝试创建的工作簿之间的版本不匹配。要避免的最佳方法是:选择接口实现。

我建立在Hitesh Sahu的解决方案之上:

import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

Workbook workbook = null;

// parse files from request
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
MultipartFile multipartDataPointsFile = multipartRequest.getFile("yourFileHere");

try {
    if(multipartDataPointsFile!=null) {
        String originalFileName= multipartDataPointsFile.getOriginalFilename();
        if(originalFileName!=null && originalFileName.length()>0) {
            switch (originalFileName.substring(originalFileName.lastIndexOf(".") + 1,
                    originalFileName.length())) {
                case "xls":
                    try {
                        workbook = WorkbookFactory.create(multipartDataPointsFile.getInputStream());
                    }catch(org.apache.poi.openxml4j.exceptions.InvalidFormatException ie){
                        logger.error("Malformed Excel");
                        throw new IOException();
                    }
                    if(workbook!=null) {
                        // Do something in here
                    }else{
                        logger.error("Could not pass along the workbook");
                        throw new IOException();
                    }
                case "xlsx":
                    try {
                        workbook = WorkbookFactory.create(multipartDataPointsFile.getInputStream());
                    }catch(org.apache.poi.openxml4j.exceptions.InvalidFormatException ie){
                        logger.error("Malformed Excel");
                        throw new IOException();
                    }
                    if(workbook!=null) {
                          // Do something in here
                    }else{
                        logger.error("Could not pass along the workbook");
                        throw new IOException();
                    }
                default:
                    logger.error("File type is not  recognized  Excell type");
                    throw new IOException();
            }

        }else{
            logger.error("Can Not Read File Name");
            throw new IOException();  
        }
    }else{
        logger.error("Did not select a file");
        throw new IOException();
    }
} catch (IOException e) {
    throw new ApplicationErrorException("Can't parse  Excel file");
}

答案 3 :(得分:0)

检查EXCEL格式....首先我用poi创建了一个示例excel,我改变了我的第一次尝试它给出了同样的错误,但是几次尝试它成功读取。我想知道为什么它没有先工作跑 :( 但如果您有正确的图书馆,请检查正确的Excel格式

答案 4 :(得分:0)

我遇到了同样的问题。你的excel格式不正确。您可以将所有工作复制到新工作表或执行清除格式。祝好运。

答案 5 :(得分:0)

我有同样的问题。当你打开excel文件时,它会生成一些文件,如〜$ ______。xlsx 只需查找并删除所有为我工作的内容。

答案 6 :(得分:0)

另一种可能的解决方案是

Workbook workbook = WorkbookFactory.create(source)

WorkbookFactory应由您正在使用的Apache POI提供(如果不升级到更新版本)。它识别文件格式并创建Workbook接口(XSSFWorkbookHSSFWorkbook)的具体实现。 source参数可以是java.io.InputStreamjava.io.File

答案 7 :(得分:0)

您的应用程序尝试访问的excel文件由于网络问题或格式损坏而没有响应导致此错误。如果是由于网络问题,请稍后尝试运行应用程序(或)如果文件已损坏,请尝试放置新文件并测试您的应用程序。祝你好运。

答案 8 :(得分:0)

在我的情况下,这就是我的想法,而第3行抛出了此异常:

File xlsxFile = new File( "C:\\myWorkbook.xlsx" );
FileInputStream finXLSX = new FileInputStream( xlsxFile ); //line1

FileOutputStream foutXLSX = new FileOutputStream( xlsxFile ); //line2

XSSFWorkbook workSheet = new XSSFWorkbook( finXLSX ); //line3

但是我发现第3行不起作用,因为我还打开了输出流 通过line2在我的xlsx文件上,然后执行line3失败。我删除了line2以使其正常工作。

答案 9 :(得分:0)

我遇到了类似的问题,最后发现文件具有敏感性->作为机密文件,将其更改为公开..解决了我的问题。 一切顺利

答案 10 :(得分:-1)

我的excel工作表已加密。删除密码即可。