Java &引用;包装应包含一个内容类型部分[M1.13]”;

Java &引用;包装应包含一个内容类型部分[M1.13]”;,java,excel,apache,swing,apache-poi,Java,Excel,Apache,Swing,Apache Poi,我正在尝试写入Excel文件,但不断出现错误: 线程“main”org.apache.poi.poimmlexception:org.apache.poi.openxml4j.exceptions.InvalidFormatException:包应包含内容类型部分[M1.13] 据我所知,我丢失了一个jar文件 有人能帮我确定是哪个文件吗 另外,我正在使用Netbeans 检查EXCEL格式。。。。首先,我用poi创建了一个示例excel,并用我的第一次尝试更改了列。它给出了相同的错误,但在几

我正在尝试写入Excel文件,但不断出现错误:

线程“main”org.apache.poi.poimmlexception:org.apache.poi.openxml4j.exceptions.InvalidFormatException:包应包含内容类型部分[M1.13]

据我所知,我丢失了一个jar文件

有人能帮我确定是哪个文件吗

另外,我正在使用Netbeans


检查EXCEL格式。。。。首先,我用poi创建了一个示例excel,并用我的第一次尝试更改了列。它给出了相同的错误,但在几次尝试后,它成功读取。我想知道为什么它在第一次运行时不起作用:(
但是,如果您有正确的库,请检查正确的excel格式

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

使用文件扩展名处理
工作表
键入

  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文件:使用
xssf工作簿和XSSFSheet

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

    XSSFSheet sheet = workbook.getSheetAt(0);
    HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(new File(path)));

    HSSFSheet sheet = workbook.getSheetAt(0);
对于XLS文件:使用
HSSF工作手册和HSSF表

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

    XSSFSheet sheet = workbook.getSheetAt(0);
    HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(new File(path)));

    HSSFSheet sheet = workbook.getSheetAt(0);

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

我也遇到了同样的问题。当您打开excel文件时,它将生成一些文件,如~$\uuuuuuuuuuuuuuuuuuuuuuuxx
只需找到并删除所有对我有用的文件。

您的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");
}

另一个可能的解决办法是

Workbook workbook = WorkbookFactory.create(source)

WorkbookFactory
应该由您正在使用的Apache POI提供(如果没有升级到更新版本的话)。它可以识别文件格式并创建
工作簿
接口的具体实现(
XSSF工作簿
HSSFWorkbook
).source参数可以是
java.io.InputStream
java.io.File

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

好的,在我的情况下,我就是这样处理的,line3引发了此异常:

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
但我发现line3无法工作,因为我还打开了一个输出流
通过line2在我的xlsx文件上执行line3失败。我删除了line2以使其正常工作。

我的excel工作表被加密。删除了密码,它正常工作。

我遇到了类似的问题,最后发现该文件的敏感度-->为机密,将其更改为公共。解决了我的问题。
最好的是

该错误与缺少jar文件无关。它与ShowDetails.xlsx文件中缺少内容类型部分有关。因此我怀疑ShowDetails.xlsx不是由Excel生成的,而是由某个第三方软件生成的,该软件出错。用Excel打开ShowDetails.xlsx,用Excel再次保存,然后用POI重试。@AxelRichter你是对的,我重新保存了它,它工作了,但是我现在又遇到了一个错误,哈哈。线程“AWT-EventQueue-0”java.lang.NoSuchMethodError:org.apache.poi.util.POILogger.log(I[Ljava/lang/Object;)v类路径中混合了不同的POI版本。请参阅:。但我没有使用Netbeans的经验。因此我不知道如何清理那里的类路径。也许其他人知道。@AxelRichter感谢您的帮助!谢谢!这也可能是因为选择了以
~$
开头的隐藏文件,而不是正常的文件,如果它仍然打开的话r在应用程序中编辑(我的情况)。这些是文件的临时副本,以防止文件损坏,以便您可以恢复它们…但是,这确实解决了我的问题!!!!简直难以置信!!