poi docx转html遇到空指针问题或java.lang.NoClassDefFoundError: org/apache/poi/xwpf/usermodel/IRunBody

poi 3.14下报错:

org.apache.poi.xwpf.converter.core.XWPFConverterException: java.lang.NullPointerException
	at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.convert(XHTMLConverter.java:77)
	at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.doConvert(XHTMLConverter.java:63)
	at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.doConvert(XHTMLConverter.java:38)
	at org.apache.poi.xwpf.converter.core.AbstractXWPFConverter.convert(AbstractXWPFConverter.java:61)
	at com.landy.tools.Test.docxToHtml(Test.java:34)
	at com.landy.tools.Test.main(Test.java:44)
Caused by: java.lang.NullPointerException
	at org.apache.poi.xwpf.converter.core.styles.run.RunUnderlineValueProvider.getValue(RunUnderlineValueProvider.java:40)
	at org.apache.poi.xwpf.converter.core.styles.XWPFStylesDocument.getUnderline(XWPFStylesDocument.java:687)
	at org.apache.poi.xwpf.converter.xhtml.internal.styles.CSSStylesDocument.createCSSStyle(CSSStylesDocument.java:296)
	at org.apache.poi.xwpf.converter.xhtml.internal.styles.CSSStylesDocument.createCSSStyle(CSSStylesDocument.java:249)
	at org.apache.poi.xwpf.converter.xhtml.internal.XHTMLMapper.visitRun(XHTMLMapper.java:248)
	at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitRuns(XWPFDocumentVisitor.java:616)
	at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitParagraphBody(XWPFDocumentVisitor.java:441)
	at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitParagraph(XWPFDocumentVisitor.java:332)
	at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.visitBodyElements(XWPFDocumentVisitor.java:247)
	at org.apache.poi.xwpf.converter.core.XWPFDocumentVisitor.start(XWPFDocumentVisitor.java:199)
	at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.convert(XHTMLConverter.java:73)
	... 5 more

poi 3.9 报错:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/poi/xwpf/usermodel/IRunBody
	at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.convert(XHTMLConverter.java:72)
	at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.doConvert(XHTMLConverter.java:63)
	at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.doConvert(XHTMLConverter.java:38)
	at org.apache.poi.xwpf.converter.core.AbstractXWPFConverter.convert(AbstractXWPFConverter.java:61)
	at com.landy.tools.Test.docxToHtml(Test.java:34)
	at com.landy.tools.Test.main(Test.java:44)
Caused by: java.lang.ClassNotFoundException: org.apache.poi.xwpf.usermodel.IRunBody
	at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
	... 6 more


根本原因一样:

通过调式定位,poi 类的源码不严谨造成;

出错未知(源码):

package org.apache.poi.xwpf.converter.core.styles.run;

import org.apache.poi.xwpf.converter.core.styles.XWPFStylesDocument;
import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;

public class RunUnderlineValueProvider
    extends AbstractRunValueProvider
{

    public static final RunUnderlineValueProvider INSTANCE = new RunUnderlineValueProvider();

    @Override
    public UnderlinePatterns getValue( CTRPr rPr, XWPFStylesDocument stylesDocument)
    {
        return ( rPr != null && rPr.isSetU() ) ? UnderlinePatterns.valueOf( rPr.getU().getVal().intValue() )
                        : null;
    }
}

改写:

public class RunUnderlineValueProvider
    extends AbstractRunValueProvider
{

    public static final RunUnderlineValueProvider INSTANCE = new RunUnderlineValueProvider();

    @Override
    public UnderlinePatterns getValue( CTRPr rPr, XWPFStylesDocument stylesDocument)
    {
        return ( rPr != null && rPr.isSetU() && rPr.getU()!=null && rPr.getU().getVal()!=null) ? UnderlinePatterns.valueOf( rPr.getU().getVal().intValue() )
                        : null;
    }
}

这样就会覆盖掉源码(优先调用)

测试代码:

		org.apache.poi
		poi
		${poi.version}
	
	
		org.apache.poi
		poi-scratchpad
		${poi.version}
	
	
		org.apache.poi
		poi-ooxml
		${poi.version}
	
	
		fr.opensagres.xdocreport
		xdocreport
		1.0.6
	
	
		org.apache.poi
		poi-ooxml-schemas
		${poi.version}
	
	
		org.apache.poi
		ooxml-schemas
		1.3
	

package com.landy.tools;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

import org.apache.poi.xwpf.converter.core.BasicURIResolver;
import org.apache.poi.xwpf.converter.core.FileImageExtractor;
import org.apache.poi.xwpf.converter.xhtml.XHTMLConverter;
import org.apache.poi.xwpf.converter.xhtml.XHTMLOptions;
import org.apache.poi.xwpf.usermodel.XWPFDocument;

public class Test {
	
	// docx转换为html
    public static void docxToHtml() throws Exception {
        String sourceFileName = "D:\\ac\\00.docx";
        String targetFileName = "D:\\ac\\test.html";
        String imagePathStr = "D:\\ac\\image";
        OutputStreamWriter outputStreamWriter = null;
        try {
            XWPFDocument document = new XWPFDocument(new FileInputStream(sourceFileName));
            XHTMLOptions options = XHTMLOptions.create();
            // 存放图片的文件夹
            options.setExtractor(new FileImageExtractor(new File(imagePathStr)));
            // html中图片的路径
            options.URIResolver(new BasicURIResolver("image"));
            outputStreamWriter = new OutputStreamWriter(new FileOutputStream(targetFileName), "utf-8");
            XHTMLConverter xhtmlConverter = (XHTMLConverter) XHTMLConverter.getInstance();
            System.out.println("=========================document="+(document==null)+"");
            System.out.println("=========================outputStreamWriter="+(outputStreamWriter==null));
            System.out.println("=========================options="+(options==null));
            xhtmlConverter.convert(document, outputStreamWriter, options);
        } finally {
            if (outputStreamWriter != null) {
                outputStreamWriter.close();
            }
        }
    }
    
    public static void main(String[] args) {
    	try {
			docxToHtml();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}


 
  

你可能感兴趣的:(java)