2013-08-14 23 views
9

Tôi có một mã để thêm watermark vào hiện tại. tệp doc.Cách tránh java.lang.NoSuchMethodError: org.apache.poi.util.IOUtils.copy (Ljava/io/InputStream; Ljava/io/OutputStream;) trong Apache POI

Sau đây là đoạn code tôi đã cố gắng cho đến nay

public static void main(String[] args) 
{ 

    try 
    { 
     XWPFDocument xDoc = new XWPFDocument(new FileInputStream("test.doc")); 
     XWPFHeaderFooterPolicy xFooter = new XWPFHeaderFooterPolicy(xDoc); 
     xFooter.createWatermark("My Watermark"); 
    } 
    catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

Sau đây là những gì tôi nhận

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.poi.util.IOUtils.copy(Ljava/io/InputStream;Ljava/io/OutputStream;)V 
at org.apache.poi.util.PackageHelper.open(PackageHelper.java:50) 
at org.apache.poi.xwpf.usermodel.XWPFDocument.<init>(XWPFDocument.java:71) 
at com.avi.Test.ReadDoc.main(Watermark.java:38) 
+2

Kiểm tra phiên bản của lọ, bạn đang trộn các phiên bản khác nhau. Googling cho 'org.apache.poi.util.IOUtils' sẽ cho bạn biết jar nào chứa nó và phiên bản nào đã được giới thiệu ở phương thức' copy (InputStream, OutputStream) '. – SJuan76

Trả lời

0

Bạn gần như chắc chắn có một phiên bản cũ của POI trên classpath của bạn.

Xem The Apache POI FAQ

+1

Tôi có 'poi-ooxml-3.5-final.jar',' xbean.jar' trên đường dẫn lớp của tôi – Avinash

6

Xem Apache POI FAQ entry on this very topic. Điều gần như chắc chắn xảy ra là bạn đã thêm một bản sao POI mới vào classpath của bạn, nhưng một phiên bản cũ hơn đã có sẵn (từ một nhu cầu trước đó, khung công tác của bạn, vv) và Java hiện đang bị nhầm lẫn về việc sử dụng nó.

Thứ nhất, bạn sẽ muốn sử dụng một đoạn mã như thế này để tìm ra nơi POI đến từ:

ClassLoader classloader = 
    org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoader(); 
URL res = classloader.getResource(
     "org/apache/poi/poifs/filesystem/POIFSFileSystem.class"); 
String path = res.getPath(); 
System.out.println("Core POI came from " + path); 

Sử dụng đó để xác định các lọ cũ (s) và loại bỏ chúng.

Sau đó, sử dụng POI Components Page để tìm ra những bình mà bạn cần sử dụng và phụ thuộc của chúng là gì. Cuối cùng, thêm các lọ mới nhất vào classpath của bạn, và bạn sẽ được tốt để đi!

+0

Tôi có 'poi-ooxml-schemas-3.7.jar' 'poi-ooxml-3.7.jar',' xbean. jar'. Bây giờ nhận được: 'Ngoại lệ trong chuỗi" chính "java.lang.NoClassDefFoundError: org/apache/poi/util/POILogFactory \t tại org.apache.poi.POIXMLDocumentPart. (POIXMLDocumentPart.java:40) \t tại com.avi.Test.ReadDoc.main (ReadDoc.java:46) Nguyên nhân: java.lang.ClassNotFoundException: org.apache.poi.util.POILogFactory \t tại java .net.URLClassLoader $ 1.run (Nguồn không xác định) \t tại java.net.URLClassLoader.findClass (Nguồn không xác định) \t tại java.lang.ClassLoader.loadClass (Nguồn không xác định) ' – Avinash

+1

Có một cái nhìn khác tại [trang thành phần] (http://poi.apache.org/overview.html#components), trong đó nêu rõ rằng poi-ooxml phụ thuộc vào poi, vì vậy bạn cũng cần phải thêm jar đó vào. Ngoài ra, 3.7 là cũ, hãy xem xét một phiên bản mới hơn! – Gagravarr

0

tôi đã cùng một vấn đề như bạn, giải pháp là bạn cần phải nhập khẩu tất cả các file jar để chạy program.These của bạn là bắt buộc để chạy dự án của bạn

  • Poi-3.10-Final.jar
  • Poi -ooxml-3.10-Final.jar
  • Poi-OOXML-schemas-3.10.jar
  • XMLBeans-2.30.jar
15

tôi đã nhận lỗi này ngày hôm nay: "java.lang.NoSuchMethodError: org.apache.poi.util.POILogger.log (I [Ljava/lang/Object;) V]"

Có vẻ khác nhau từ lỗi của bạn, nhưng khá giống nhau. FYI, tôi đang sử dụng maven để quản lý lọ. Sau một số thử nghiệm, tôi phát hiện ra trường hợp gốc là phiên bản poi.jar và poi-ooxml.jar không nhất quán.

Cấu hình này sẽ nhận được một lỗi:

<dependency> 
     <groupId>org.apache.poi</groupId> 
     <artifactId>poi</artifactId> 
     <version>3.12</version> 
    </dependency> 

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

Tôi đã thay đổi phiên bản của poi.jar từ 3.12 để 3,13

<dependency> 
     <groupId>org.apache.poi</groupId> 
     <artifactId>poi</artifactId> 
     <version>3.13</version> 
    </dependency> 

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

bingo, vấn đề giải quyết. Tôi hy vọng điều này sẽ giúp một người nào đó gặp phải loại ngoại lệ này.

+0

[Câu hỏi thường gặp về Apache POI là khá rõ ràng] (http://poi.apache.org/faq.html#faq-N1019C) rằng việc trộn các bình POI giữa các phiên bản không được hỗ trợ, do đó, điều này phần lớn được mong đợi! – Gagravarr

+0

Tôi không kết hợp các phiên bản nhưng cập nhật từ 3.10.1 đến 3.13 (nhất quán) đã làm việc cho tôi. Trường hợp 3,15 (hiện tại là ổn định mới nhất) gây ra các lỗi khác. – Simon

+0

Cảm ơn, bạn đã cứu ngày của tôi. – Bin

0

Ngay từ đầu, phiên bản poi-ooxml và poi phải giống hệt nhau.

<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi-ooxml</artifactId> 
    <version>3.16</version> <---------------this. 
</dependency> 
<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi</artifactId> 
    <version>3.16</version> <---------------this. 
</dependency> 
Các vấn đề liên quan