word导入的时候,如果有图片,poi图片可以抓出,但是不能定位位置,目前没有想到好的解决方案。
word导出,纯文本用的是poi,图文的文档用docx4j。
还有FreeMarker,用xml/ftl里面封装要导出格式的文档,设置key,最后通过map封装,导出word,我是用mac开发的,有一些问题没有成功,下面我把代码贴出来,有兴趣的研究。
private Configuration configuration = null;
public exportQuestionWord() {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
}
public void createDoc(Map<String,Object> dataMap, String fileName) throws UnsupportedEncodingException {
//dataMap 要填入模本的数据文件
//设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
//这里我们的模板是放在包下面
configuration.setClassForTemplateLoading(this.getClass(), "/");
Template t=null;
try {
configuration.setObjectWrapper(new DefaultObjectWrapper());
//设置异常处理器
configuration.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
//test.ftl为要装载的模板 /Users/limeng/Public/工具/workspace/lmlog/src/test/java/com/icu/util/fb.ftl
t = configuration.getTemplate("fb.xml","utf-8");
} catch (IOException e) {
e.printStackTrace();
}
//输出文档路径及名称
File outFile = new File(fileName);
Writer out = null;
FileOutputStream fos=null;
try {
fos = new FileOutputStream(outFile);
OutputStreamWriter oWriter = new OutputStreamWriter(fos,"UTF-8");
//这个地方对流的编码不可或缺,使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。
//out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
out = new BufferedWriter(oWriter,10240);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out);
out.flush();
out.close();
fos.close();
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
List<String> list1 = new ArrayList<>();//题目
List<Question> list=parseWord("/Users/limeng/word/bbb2.docx");//数据集合,可以换数据源替换
Map<String, Object> dataMap = new HashMap<String, Object>();
dataMap.put("xytitle",list.get(0));
for (int i = 1; i < list.size(); i++) {
list1.add(list.get(i));
}
dataMap.put("xycontent",list1.toString());
edoc.createDoc(dataMap, "/Users/limeng/word/aaa3.doc");