web-dev-qa-db-ja.com

Java.lang.NoClassDefFoundErrorを回避する方法

既存の.docファイルにテキストを追加するためのコードがあり、ApachePOIを使用して別の名前で保存します。

以下は私がこれまでに試したコードです

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="[email protected]";
        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は初めてなので、説明と例を教えてください。ありがとう

6
Vignesh Vino

質問に対して行われた私のコメントからコピーされました:

ApachePOIディストリビューションに含まれている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 Microsoft Wordファイルを処理するAPI 、2003- Word文書を処理するために間違ったクラスを使用しているようです:HWPFは、Microsoft Word 97(-2007)ファイル形式の純粋なJavaへのポートの名前です...パートナー新しいWord2007のHWPFへの.docx形式はXWPFです。これは、ドキュメントを処理したり、ドキュメントをWord2003-からWord2007に変更したりするには、HWPFDocumentクラスが必要であることを意味します。 +。

IMO Apache POIはExcelファイルを処理するための優れたソリューションだと思いますが、Word文書を処理するための別のオプションを検討します。詳細な関連情報を取得するには、 この質問 を確認してください。

6
Luiggi Mendoza

これは、poi-ooxml-3.9.jarの依存関係階層です。

enter image description here

つまり、コンパイル時に使用されなくても、ランタイムで使用できます。

プロジェクトのクラスパスにすべてのjarがあることを確認してください。

5
hthserhs

この依存関係を設定ファイルに追加します:

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

または

System couldn’t find the 

poi-ooxml-schemas-xx.xx.jar

ライブラリをクラスパスに追加してください。

org.Apache.poi.POIXMLException:org.Apache.xmlbeans.XmlException:Element themeManager @ http://schemas.openxmlformats.org/drawingml/2006/main は有効なワークブックではありません@ http://schemas.openxmlformats.org/spreadsheetml/2006/main ドキュメントまたは有効な置換。

ソリューション:-。xlsの代わりに.xlsx形式を使用します

0
Vinit Bhardwaj

XWPFDocumentの適切な依存関係がないため、このエラーが発生します。 ooxml-schemasにはxmlbeansが必要であり、ooxmlにはpoiやooxml-schemasなどが必要です。

ここをチェックしてください: http://poi.Apache.org/overview.html#components

0
Xacius

FWIW私はこれを追加しなければなりませんでした:

compile 'org.Apache.poi:ooxml-schemas:1.3'
0
slim

私の場合、異なるバージョンのpoiがありました。 poi-scratchpadは3.9で、その他すべて-poi、poi-ooxml、poi-ooxml-schemasは3.12でした。 poi-scratchpadのバージョンも3.12に変更し、すべてが機能し始めました。

0
nanosoft

クラス org.openxmlformats.schemas.wordprocessingml.x2006.main.DocumentDocument.Factoryは、ダウンロード可能なjar ooxml-schemas-1.0.jarにあります ここ

0

プロジェクトの依存関係にMavenを使用していない場合。クラスパスに次のjarファイルが含まれている必要があります enter image description here

0
Karthi Murugan

このエラーの経験を報告すると思いました。私はそれを突然始めました、そして私のワークスペースで何も変更していませんでした。複数のシートがあるExcelファイルを読み取ろうとしたときに発生することが判明しました(2番目のシートはピボットテーブルであり、大量のデータです。データのサイズが原因であるかどうかはわかりません(私はそう思うので、そうだと思います)複数のワークシートを含むExcelファイルを読んだことがあります)その2番目のシートを削除すると、機能しました。クラスパスを変更する必要はありません。

0
M. Ferris