如何避免java.lang.NoClassDefFoundError

Vig*_*ino 6 java doc noclassdeffounderror apache-poi

我有一个代码用于将文本添加到现有的.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();
          }

    }

}
Run Code Online (Sandbox Code Playgroud)

以下是我得到的

    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
Run Code Online (Sandbox Code Playgroud)

我已经添加了与此相对应的所有jar文件,但我仍然无法找到解决方案.我是这个apache poi的新手,所以请帮我解释一些例子.谢谢

Lui*_*oza 6

复制自我对该问题的评论:

看起来你需要Apache POI发行版中的poi-ooxml-schemas.jar.只添加一个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
Run Code Online (Sandbox Code Playgroud)

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

IMO我发现Apache POI是处理Excel文件的一个很好的解决方案,但我会看到处理Word文档的另一种选择.检查此问题以获取更多相关信息.


Nis*_*hth 5

这是的依赖关系层次结构poi-ooxml-3.9.jar

在此处输入图片说明

这意味着它们中的任何一个都可以在运行时使用,即使在编译时不使用它们也是如此。

确保您的项目的类路径中有所有的jar。