在使用POI使用XPath处理一些文本后保存docx文件时,我会将ByteArrayInputStream传递给一个新的ByteArrayInputStream,并使用
wordMLPackage = WordprocessingMLPackage.load(
bis
);
在我的4个模板中,有3个会引发异常:
org.docx4j.openpackaging.exceptions.InvalidFormatException: Unexpected package (docx4j supports docx/docxm and pptx only
at org.docx4j.openpackaging.contenttype.ContentTypeManager.createPackage(ContentTypeManager.java:834)
代码如下所示:
/* Return a package of the appropriate type. Used when loading an existing
* Package, with an already populated [Content_Types].xml. When
* creating a new Package, start with the new WordprocessingMLPackage constructor. */
public OpcPackage createPackage() throws InvalidFormatException {
/*
* How do we know what type of Package this is?
*
* In principle, either:
*
* 1. We were told its file extension or mime type in the
* constructor/method parameters, or
*
* 2. Because [Content_Types].xml contains an override for PartName
* /document.xml of content type
* application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml
*
* The latter approach is more reliable, so ..
*
*/
OpcPackage p;
if (getPartNameOverridenByContentType(ContentTypes.WORDPROCESSINGML_DOCUMENT) != null
|| getPartNameOverridenByContentType(ContentTypes.WORDPROCESSINGML_DOCUMENT_MACROENABLED) != null
|| getPartNameOverridenByContentType(ContentTypes.WORDPROCESSINGML_TEMPLATE ) != null
|| getPartNameOverridenByContentType(ContentTypes.WORDPROCESSINGML_TEMPLATE_MACROENABLED) != null ) {
log.info("Detected WordProcessingML package ");
p = new WordprocessingMLPackage(this);
return p;
} else if (getPartNameOverridenByContentType(ContentTypes.PRESENTATIONML_MAIN) != null
|| getPartNameOverridenByContentType(ContentTypes.PRESENTATIONML_TEMPLATE) != null
|| getPartNameOverridenByContentType(ContentTypes.PRESENTATIONML_SLIDESHOW) != null) {
log.info("Detected PresentationMLPackage package ");
p = new PresentationMLPackage(this);
return p;
} else if (getPartNameOverridenByContentType(ContentTypes.SPREADSHEETML_WORKBOOK) != null
|| getPartNameOverridenByContentType(ContentTypes.SPREADSHEETML_WORKBOOK_MACROENABLED) != null
|| getPartNameOverridenByContentType(ContentTypes.SPREADSHEETML_TEMPLATE) != null
|| getPartNameOverridenByContentType(ContentTypes.SPREADSHEETML_TEMPLATE_MACROENABLED) != null) {
// "xlam", "xlsb" ?
log.info("Detected SpreadhseetMLPackage package ");
p = new SpreadsheetMLPackage(this);
return p;
} else if (getPartNameOverridenByContentType(ContentTypes.DRAWINGML_DIAGRAM_LAYOUT) != null) {
log.info("Detected Glox file ");
p = new GloxPackage(this);
return p;
} else {
throw new InvalidFormatException("Unexpected package (docx4j supports docx/docxm and pptx only");
//return new Package(this);
}
}
它似乎无法匹配某些特定的内容类型覆盖。在我的起始docx模板中有一个[Content_Types]. xml文件,它具有:
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Override PartName="/_rels/.rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" />
<Override PartName="/word/fontTable.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml" />
<Override PartName="/word/_rels/document.xml.rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" />
<Override PartName="/word/media/image1.wmf" ContentType="image/x-wmf" />
<Override PartName="/word/comments.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml" />
<Override PartName="/word/numbering.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml" />
<Override PartName="/word/footer1.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml" />
<Override PartName="/word/document.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml" />
<Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml" />
<Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml" />
<Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml" />
</Types>
使用POI处理后,[Content_Types]. xml如下所示:
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default Extension="xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>
<Override PartName="/_rels/.rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
<Override PartName="/docProps/app.xml" ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/>
<Override PartName="/docProps/core.xml" ContentType="application/vnd.openxmlformats-package.core-properties+xml"/>
<Override PartName="/word/_rels/document.xml.rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
<Override PartName="/word/comments.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml"/>
<Override PartName="/word/fontTable.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml"/>
<Override PartName="/word/footer1.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml"/>
<Override PartName="/word/media/image1.wmf" ContentType="image/x-wmf"/>
<Override PartName="/word/numbering.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml"/>
<Override PartName="/word/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/>
</Types>
请注意,缺少PartName="/word/document.xml"的覆盖!
这是一个可接受的文件内容类型文件没有单词/document.xml覆盖?它在LibreOffice中打开,没有投诉。docx4j是否依赖于内容类型中可能不存在的覆盖标签,或者POI没有正确地为我的一些文件编写内容类型(4个中的3个)。
披露:我是docx4j项目负责人
根据规范,POI所做的似乎是合法的,但并不理想。
根据ECMA-376第2部分“获取零件的内容类型”,docx4j应该在按照POI的方式指定时找到docx的内容类型。
第1部分中的WordProcess ingML章节在“包结构”部分中说:
首先,必须定义关系部分和主文档部分(唯一需要的部分)的内容类型(实际位于包中的/[content_Types].xml):
<Types
xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default Extension="rels"
ContentType="application/vnd.openxmlformatspackage.
relationships+xml"/>
<Override PartName="/document.xml"
ContentType="application/vnd.openxmlformatsofficedocument.
wordprocessingml.document.main+xml"/> </Types>
我的理解是,您必须定义主文档部分的内容类型(POI是这样做的),提示只是使用覆盖来实现这一点。
当大多数部分都是. xml并且需要覆盖来指定不同的内容时,使用您的. xml默认值来匹配一个(或者可能是2或3个部分)对我来说没有多大意义。我想知道为什么POI这样做——与规范中的建议不同,与Word发出的内容不同。
也就是说,https://github.com/plutext/docx4j/commit/1c1190fc3a2fc6e191c825a0e30fde2654cc997c应该解决这个问题。
我正在使用以下命令读取文件: 我在网上尝试了各种解决方案,它们告诉我要排除某些工件,例如:stax-api和stax。但所有的解决办法似乎都不奏效。
在Eclipse中为我的XXXXClient(web服务)项目运行Maven安装时,我反复收到以下消息:“项目”XXXXClient“中的required Library:'x:/xxxx/xxxx/.m2/repository/javax/enterprise/CDI-API/1.0-sp4-redhat-4/CDI-API-1.0-sp4-redhat-4.jar'无法读取或不是有效的ZIP文
我已经提到了与使用ApachePOI读取XLSB文件相关的所有post-in堆栈溢出。我尝试了很多方法,使用本文中提到的可用链接/示例来读取XLSB文件。但我最终陷入了困境。 我使用的是最新的ApachePOI3.17,并使用了中提到的代码 链接:异常读取XLSB文件Apache POIjava.io.CharConversionExcture 章节:“Gagravarr”提到的帖子 我得到以下错
本文向大家介绍Python实现读取并保存文件的类,包括了Python实现读取并保存文件的类的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python实现读取并保存文件的类。分享给大家供大家参考,具体如下: 这个类写在一个叫class_format.py 的文件里, 放在D盘 有一个testcsv.txt 文件放在D盘,内容如下(oi的两边有空格): 这个代码的ReadData模块用到了c
Apache POI>无法读取Excel表 null } Excel文件