如何避免java.lang.NoClassDefFoundError(How to avoid ja

2019-07-20 14:54发布

我有一个代码,添加文本,以现有的.doc文件,它会将它保存为通过使用Apache POI另一个名称。

下面是到目前为止,我已经尝试的代码

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFFooter;
import org.apache.poi.xwpf.usermodel.XWPFTable;

public class FooterTableWriting {

    public static void main(String args[])
    {
        String path="D:\\vignesh\\AgileDocTemplate.doc";
        String attch="D:\\Attach.doc";
        String comment="good";
        String stat="ready";
        String coaddr="xyz";
        String cmail="abc@gmail.com";
        String sub="comp";
        String title="Globematics";
        String cat="General";
        setFooter(path, attch, comment, stat, coaddr, cmail, sub, title, cat);
    }
    private static  void setFooter(String docTemplatePath,String attachmentPath,String comments,String status,String coAddress,String coEmail,String subject,String title,String catagory)
    {
          try{

                    InputStream input = new FileInputStream(new File(docTemplatePath));
                    XWPFDocument document=new XWPFDocument(input);
                    XWPFHeaderFooterPolicy headerPolicy =new XWPFHeaderFooterPolicy(document);
                    XWPFFooter footer = headerPolicy.getDefaultFooter();
                    XWPFTable[] table = footer.getTables();

                    for (XWPFTable xwpfTable : table)
                       {
                           xwpfTable.getRow(1).getCell(0).setText(comments);
                           xwpfTable.getRow(1).getCell(1).setText(status);
                           xwpfTable.getRow(1).getCell(2).setText(coAddress);
                           xwpfTable.getRow(1).getCell(3).setText(coEmail);
                           xwpfTable.getRow(1).getCell(4).setText(subject);
                           xwpfTable.getRow(1).getCell(5).setText(title);
                           xwpfTable.getRow(1).getCell(6).setText(catagory);

                       }

                  File f=new File (attachmentPath.substring(0,attachmentPath.lastIndexOf('\\')));

                  if(!f.exists())
                      f.mkdirs();

                  FileOutputStream out = new FileOutputStream(new File(attachmentPath));
                  document.write(out);
                  out.close();

                  System.out.println("Attachment Created!");

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

    }

}

下面是我得到了什么

    org.apache.poi.POIXMLException: org.apache.xmlbeans.XmlException: error: The document is not a document@http://schemas.openxmlformats.org/wordprocessingml/2006/main: document element mismatch got themeManager@http://schemas.openxmlformats.org/drawingml/2006/main
    at org.apache.poi.xwpf.usermodel.XWPFDocument.onDocumentRead(XWPFDocument.java:124)
    at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:200)
    at org.apache.poi.xwpf.usermodel.XWPFDocument.<init>(XWPFDocument.java:74)
    at ext.gt.checkOut.FooterTableWriting.setFooter(FooterTableWriting.java:32)
    at ext.gt.checkOut.FooterTableWriting.main(FooterTableWriting.java:25)
Caused by: org.apache.xmlbeans.XmlException: error: The document is not a document@http://schemas.openxmlformats.org/wordprocessingml/2006/main: document element mismatch got themeManager@http://schemas.openxmlformats.org/drawingml/2006/main
    at org.apache.xmlbeans.impl.store.Locale.verifyDocumentType(Locale.java:458)
    at org.apache.xmlbeans.impl.store.Locale.autoTypeDocument(Locale.java:363)
    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1279)
    at org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:1263)
    at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:345)
    at org.openxmlformats.schemas.wordprocessingml.x2006.main.DocumentDocument$Factory.parse(Unknown Source)
    at org.apache.poi.xwpf.usermodel.XWPFDocument.onDocumentRead(XWPFDocument.java:92)
    ... 4 more

我添加了所有与此对应的jar文件但我仍然无法找到solution.I'm新本的Apache POI所以请帮助我做一些解释和例子。 谢谢

Answer 1:

从我的意见做的问题复制:

看起来你需要POI-OOXML-schemas.jar附带在Apache POI分布。 只需添加一个JAR并不意味着你有框架的所有类。


根据我的评论(或其他人的答案)解决问题之后,你有这个新的异常

org.apache.xmlbeans.XmlException: error: The document is not a document@http://schemas.openxmlformats.org/wordprocessingml/2006/main: document element mismatch got themeManager@http://schemas.openxmlformats.org/drawingml/2006/main

阅读的Apache POI - HWPF -的Java API来处理Microsoft Word文件 ,它看起来像你使用了错误的类来处理2003- word文档:HWPF是我们的Microsoft Word 97(-2007)文件格式的端口的名称纯Java ... 为新的Word 2007的.docx格式HWPF的合作伙伴是XWPF。 。 这意味着你需要HWPFDocument类来处理文档或从Word 2003-更改文档到Word 2007+。

IMO我找到的Apache POI是一个很好的解决方案,以处理Excel文件,但我想看看另一种选择,处理Word文档。 检查这个问题以获得更多相关信息。



Answer 2:

这对于依赖层次poi-ooxml-3.9.jar

这意味着任何人都可以在运行时使用,即使他们没有在编译时使用。

确保你有你的项目的类路径中所有的罐子。



Answer 3:

增加您的配置文件,这种依赖性:

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

要么

System couldn’t find the 

POI-OOXML-架构 - xx.xx.jar

请将库添加到类路径。



Answer 4:

org.openxmlformats.schemas.wordprocessingml.x2006.main.DocumentDocument.Factory位于罐子OOXML-模式-1.0.jar可以下载在这里



Answer 5:

你得到的是错误,因为你没有为XWPFDocument适当的依赖也。 OOXML-模式需要的XMLBeans和OOXML需要POI和OOXML-模式,等等。

点击这里: http://poi.apache.org/overview.html#components



Answer 6:

我以为我会报告我的这个错误的经验。 我开始出来的蓝色,并在我的工作区没有改变任何东西。 原来,在尝试读取有超过1张(第二张是一个数据透视表,大量数据的Excel文件时它。不退出知道,如果是由于数据的大小(我怀疑是这样,因为我已经阅读包含超过1个工作表Excel文件)。当我删除了第二页,它的工作。到CLASSPATH不需要做任何修改。



Answer 7:

org.apache.poi.POIXMLException:org.apache.xmlbeans.XmlException:元素themeManager @ http://schemas.openxmlformats.org/drawingml/2006/main不是一个有效的工作簿@ http://schemas.openxmlformats.org/ SpreadsheetML中/ 2006 /主文件或有效的替代。

解决方案 : -使用的.xlsx格式代替的.xls的



Answer 8:

FWIW我不得不补充一点:

compile 'org.apache.poi:ooxml-schemas:1.3'


Answer 9:

对于我来说,我有不同版本的POI(S)的。 POI暂存器是3.9和所有其他 - POI,POI,OOXML,POI-OOXML-模式是3.12。 我改变了POI暂存器的版本3.12,以及和一切开始工作。



Answer 10:

如果你不使用Maven您的项目依赖。 你应该在你的classpath以下罐子



文章来源: How to avoid java.lang.NoClassDefFoundError