2015-09-21 10 views
1

Я использую последнюю версию Apache POI 3.13-beta1. И я получаю сообщение об ошибке, как:Как сохранить файл слова docx с помощью Apache poi. Изменение на saxon9he вместо saxon9pe

Exception in thread "main" org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: Fail to save: an error occurs while saving the package : null 
at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:507) 
at org.apache.poi.openxml4j.opc.OPCPackage.save(OPCPackage.java:1441) 
at org.apache.poi.POIXMLDocument.write(POIXMLDocument.java:202) 
Caused by: java.lang.NullPointerException 
    at com.saxonica.config.Verifier.loadLicense(Verifier.java:141) 
    at com.saxonica.config.ProfessionalConfiguration.loadLicense(ProfessionalConfiguration.java:391) 
    at com.saxonica.config.ProfessionalConfiguration.isLicensedFeature(ProfessionalConfiguration.java:367) 
    at net.sf.saxon.IdentityTransformer.transform(IdentityTransformer.java:36) 
    at org.apache.poi.openxml4j.opc.StreamHelper.saveXmlInStream(StreamHelper.java:80) 
    at org.apache.poi.openxml4j.opc.internal.marshallers.ZipPartMarshaller.marshallRelationshipPart(ZipPartMarshaller.java:174) 
    at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:468) 

Мой код очень просто здесь:

String filePath = "d:\\doc\\file1.docx" 
try { 
    FileInputStream fis = new FileInputStream(filePath); 
    XWPFDocument xdoc = new XWPFDocument(OPCPackage.open(fis)); 

    System.out.println("here I can read my file and work on it"); 

    String filePathOut = filePath.replace("file", "file_result"); 
    xdoc.write(new FileOutputStream(new File(filePathOut))); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (InvalidFormatException e) { 
    e.printStackTrace(); 
} 

Я хочу сделать замену и сохранить свой файл обратно.

EDIT 1. Похоже, Apache poi работает с нашей библиотекой saxon9pe, для которой требуется лицензия. Могу ли я установить что-то, чтобы избежать этого saxon9pe в poi и использовать saxon9he?

Спасибо.

+0

Apache POI должны просто использовать по умолчанию Java XML парсер. Что произойдет, если вы удалите настройки, которые меняют значение по умолчанию для саксона? – Gagravarr

+0

он работает, когда я удалил его, или я установил лицензию на библиотеку. Но эта часть проекта не должна использовать saxon9pe. Итак, могу ли я вручную изменить по умолчанию саксонский синтаксический анализатор 9pe на 9-й вариант? – oakslist

+0

Apache POI просто запрашивает JVM для синтаксического анализа XML, он ничего не знает о саксоне. Вам нужно будет прочитать установочные документы для саксона и посмотреть, как это сказать + JVM, который должен использовать – Gagravarr

ответ

3

Вот как я открывать и закрывать DOCX файлы:

final XWPFDocument docx = new XWPFDocument(new FileInputStream(new File(inFileNameString))); 
final FileOutputStream out = new FileOutputStream(outFileNameString); docx.write(out); 
out.close(); 
docx.close(); 
+0

Спасибо за ваш ответ. По умолчанию он работает нормально. Но у меня есть более специфический парсер, такой как saxon9pe вместо saxon9he, который требует лицензии – oakslist