工作中终于遇到了 需要导出word文旦的需求了。由于以前没有操作过,所以就先百度下了,基本上是:博客园,简书,CDSN,这几大机构的相关帖子比较多,然后花了2周时间 才初步弄懂。
学习顺序:
第一阶段
1,。首先 是 先了解 java 通过什么方式 来操作word的导出工作。就有了下面这个帖子了:
java 操作 word 的方法 :https://www.cnblogs.com/lcngu/p/5247179.html 。新手可以先看看了解下。
2. 根据需求:操作word很复杂: 1.有图片(图片数量 动态变化,可能没有),2.有复选框需要展示 【一个文档里有好几个 复选框。框框打钩还是不打勾,不确定】,3.文档样式和模板客户已经给我们提供好了。
因此; 选着了使用freemaker辅助工具来操作,word文档生成和导出。
整个流程简单来说:
对于支持低版本的ofifce word 文档格式 应该是 doc格式的:
1.先生成模板:就是word文档 先标记好要填充数据的位置,(一般建议用 实体类的属性名 站位 ,可以的话用花括号括起来)。小技巧(对于图片,复选框。这些特别的东西。先不做处理)。
2. 生成 xml文件:word文档 另存为 xml 格式的--(一定要是word.xml,其他格式的不行,这里选着 word-2003.xml)。低版本要求
3. 生成ftl文件: 这个没啥说的,freemaker只能能识别它,因此需要这几个步骤1. 把生成好的xml文件,把后缀名改成 ftl 就可以了;2.所有占位符的地方 加上$标志;
4. 使用freemaker 工具 整合 模板和数据了。
5. 输出生成好的 word文档。
参考教程: java使用freemarker生成word文档步骤 带图片
Java之利用FreeMarker导出Word实例
对于高版本的ofifce word 文档格式 是 docx格式的:
有两种方法:
1.解压--替换--压缩。好处word是原生的不是xml格式的。
2. 和上述doc方式一样,只不不过导出xml 选择 word.xml。 后续操作一模一样。
参考教程 :
第一种方式: JAVA通过模板生成DOCX文档 一般不推荐,除非图片数量固定。
第二种方式:1.使用freemarker导出word并动态插入多张图片。
2.使用freemarker导出word文档包含多张图片。
对于复选框(打钩和不打勾)的操作:请参考这个文档,非常直观的告诉你怎么操作:freemarker导出word文档中的复选框打钩功能
对于图片操作请参考 上面给的教程。 上面的教程主要是图片的处理。
第一阶段到此结束了,然后开始写代码和编程了。下面给的是数据获取的几个操作方法。数据对象Map .
WordPhotoUtil: 对图片的处理
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.chiyun.peersocialworker.synchroWork.util;
2
3 import com.chiyun.peersocialworker.files.entity.EmplPictureInforEntity;
4 import com.chiyun.peersocialworker.synchroWork.vo.Picther2Vo;
5 import com.chiyun.peersocialworker.synchroWork.vo.PictherVo;
6 import sun.misc.BASE64Encoder;
7
8 import java.io.File;
9 import java.io.FileInputStream;
10 import java.io.IOException;
11 import java.io.InputStream;
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16
17 /**
18 * word-图片信息处理-工具类
19 *
20 */
21 public class WordPhotoUtil {
22
23
24
25 /**
26 * 获得图片的base64码
27 * @param filepash
28 * @return
29 * @throws Exception
30 */
31 public static String getImageBase(String filepash) throws Exception {
32 if (filepash == null || filepash == "") {
33 return "";
34 }
35 System.out.println("图片路径"+filepash);
36 File file = new File(filepash);
37 if (!file.exists()) {
38 System.out.println("图片不存在");
39 return "";
40 }
41 InputStream in = null;
42 byte[] data = null;
43 try {
44 in = new FileInputStream(file);
45 data = new byte[in.available()];
46 in.read(data);
47 in.close();
48 }catch(IOException e){
49 e.printStackTrace();
50 }
51 System.out.println("图片大小:"+data.length);
52 BASE64Encoder encoder = new BASE64Encoder();
53 return encoder.encode(data);
54 }
55
56
57
58
59 /**
60 * 图片信息获取 【肯定是偶数个数】 双图片成对保存
61 * @param images
62 * @return
63 * @throws Exception
64 */
65 public static List getImage(List images ,int numbers,int photosize )throws Exception{
66 List pictvoList=new ArrayList();
67 List List1=new ArrayList();
68 List List2=new ArrayList();
69 int i=1;
70 for(EmplPictureInforEntity image:images ) {
71 if( i%2==0){
72 List2.add(image);
73 }else{
74 List1.add(image);
75 }
76 i++;
77 }
78 int bb=numbers;
79 for(int j=0;j |