如何避免java.lang.NoClassDefFoundError

时间:2013-02-27 07:43:55

标签: java apache-poi noclassdeffounderror doc

我有一个代码,用于将文本添加到现有的.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文件,但我仍然无法找到解决方案。我是这个apache poi的新手,所以请帮我解释一些例子。 感谢

10 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分:4)

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

enter image description here

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

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

答案 2 :(得分:2)

在配置文件中添加此依赖项:

<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

请将库添加到类路径中。

答案 3 :(得分:0)

org.openxmlformats.schemas.wordprocessingml.x2006.main.DocumentDocument.Factory位于jar ooxml-schemas-1.0.jar中,可以下载here

答案 4 :(得分:0)

您收到该错误是因为您没有对XWPFDocument有适当的依赖关系。 ooxml-schemas需要xmlbeans,而ooxml需要poi和ooxml-schemas等...

点击此处:http://poi.apache.org/overview.html#components

答案 5 :(得分:0)

以为我会报告我对此错误的体验。我开始明白了,并没有在工作区中改变任何东西。事实证明,它在尝试读取超过1张的Excel文件时出现(第二张表是数据透视表,大量数据。不确定是否由于数据的大小(我怀疑是这样,因为我已经读取了包含1个以上工作表的Excel文件。当我删除第二个工作表时,它工作正常。不需要更改类路径。

答案 6 :(得分:0)

org.apache.poi.POIXMLException:org.apache.xmlbeans.XmlException:元素themeManager @ http://schemas.openxmlformats.org/drawingml/2006/main不是有效的工作簿@ http://schemas.openxmlformats.org/spreadsheetml/2006/main文档或有效替换。

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

答案 7 :(得分:0)

FWIW我不得不补充一下:

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

答案 8 :(得分:0)

对于我的情况,我有不同版本的poi(s)。 poi-scratchpad是3.9,其他所有 - poi,poi-ooxml,poi-ooxml-schemas是3.12。我将poi-scratchpad的版本改为3.12,一切都开始工作了。

答案 9 :(得分:0)

如果您没有将maven用于项目依赖项。您应该在类路径中包含以下jar   enter image description here