该方法借助freemarker的JAR包即可。

参考:

所需工具:

步骤:

1、在word中编辑好模版样式,设置好占位符,注意图片最好先黏上去

2、在word中,文件-另存为-XML格式

3、使用工具格式化上图的XML文件

a.在表格数据的TR中加入 和#list>

b.将XML文件中图片的BASE64转换为相应的占位符

4、在Eclipse中新建文件teample-pic.ftl,将XML的数据粘贴进去

5、使用工具类WordUtil.java生成word文件

代码:

package com.test;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStreamWriter;

import java.io.Writer;

import java.util.Map;

import sun.misc.BASE64Encoder;

import freemarker.template.Configuration;

import freemarker.template.Template;

public class WordUtil {

/**

* @param dataMap

* word中需要展示的动态数据,用map集合来保存

* @param templateName

* word模板名称,例如:teample.ftl

* @param filePath

* 文件生成的目标路径,例如:D:/

* @param fileName

* 生成的文件名称

*/

@SuppressWarnings("unchecked")

public static void createWord(Map dataMap, String templateName,

String filePath, String fileName) {

try {

// 创建配置实例

Configuration configuration = new Configuration();

// 设置编码

configuration.setDefaultEncoding("UTF-8");

// ftl模板文件

configuration.setClassForTemplateLoading(WordUtil.class,

"/com/test/");

// 获取模板

Template template = configuration.getTemplate(templateName);

// 输出文件

File outFile = new File(filePath + File.separator + fileName);

// 如果输出目标文件夹不存在,则创建

if (!outFile.getParentFile().exists()) {

outFile.getParentFile().mkdirs();

}

// 将模板和数据模型合并生成文件

Writer out = new BufferedWriter(new OutputStreamWriter(

new FileOutputStream(outFile), "UTF-8"));

// 生成文件

template.process(dataMap, out);

// 关闭流

out.flush();

out.close();

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 将图片转换为BASE64为字符串

* @param filename

* @return

* @throws IOException

*/

public static String getImageString(String filename) throws IOException {

InputStream in = null;

byte[] data = null;

try {

in = new FileInputStream(filename);

data = new byte[in.available()];

in.read(data);

in.close();

} catch (IOException e) {

throw e;

} finally {

if(in != null) in.close();

}

BASE64Encoder encoder = new BASE64Encoder();

return data != null ? encoder.encode(data) : "";

}

}

package com.test;

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.ArrayList;

import java.util.Date;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

public class TestJava2Word {

public static void main(String[] args) throws IOException {

createWord();

//String BASE64 = WordUtil.getImageString("D://doc//friend.jpg");

//System.out.println(BASE64);

}

public static void createWord() {

Map dataMap = new HashMap();

/** 组装数据 */

dataMap.put("username","张三");

dataMap.put("address","深圳市南山区西丽镇");

dataMap.put("num", Math.floor(Math.random()*10));

SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");

dataMap.put("date",sdf.format(new Date()));

dataMap.put("content","华语天王周杰伦在北京召开周杰伦战略发布会。在发布会上,推出时尚与专业结合的:引起了广泛的关注和讨论。现在终于正式与大家见面,天猫、官网同时上线,首卖期间还有好礼相赠!买就送,就是这么任性!");

List> newsList=new ArrayList>();

for(int i=1;i<=10;i++){

Map map=new HashMap();

map.put("name", "王"+i);

map.put("tel", "137"+i);

map.put("age", "年龄"+i);

map.put("address", System.currentTimeMillis());

newsList.add(map);

}

dataMap.put("myListData",newsList);

String myPic = "";

String myPic2 = "";

try {

myPic = WordUtil.getImageString("D://doc//ganen.jpg");

myPic2 = WordUtil.getImageString("D://doc//friend.jpg");

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

dataMap.put("myPic", myPic);

dataMap.put("myPic2", myPic2);

//文件路径

String filePath= "D://doc";

//文件名称

String fileName = System.currentTimeMillis()+".doc";

/** 生成word */

WordUtil.createWord(dataMap, "teample-pic.ftl", filePath, fileName);

}

}

模版文件:

teample.ftl等见附件。

注意两个问题:

1、如果图片是网络图片时,getImageString() 方法中不可使用本地new FileInputStream处理图片,应该使用new URL()获取链接,然后openConnection(),最后connection.getInputStream()获取流

2、InputStream流转Byte[]时,使用new byte[in.available]可能会有问题,推荐使用IOUtils.toByteArray(in) 转换为byte数组。

在commons-io包中org.apache.commons.io.IOUtils类的toByteArray(InputStream input)已经有实现了,我们可以参考下思路,完成我们的方法,我们可以用类似下面的代码实现inputStream转化为byte[]数组

public static byte[] toByteArray(InputStream input) throws IOException {

ByteArrayOutputStream output = new ByteArrayOutputStream();

byte[] buffer = new byte[4096];

int n = 0;

while (-1 != (n = input.read(buffer))) {

output.write(buffer, 0, n);

}

return output.toByteArray();

}

下面是IOUtils中摘录出与toByteArray相关的方法

org.apache.commons.io.IOUtils.toByteArray

方法如下:

public static byte[] toByteArray(InputStream input)

throws IOException

{

ByteArrayOutputStream output = new ByteArrayOutputStream();

copy(input, output);

return output.toByteArray();

}

public static int copy(InputStream input, OutputStream output)

throws IOException

{

long count = copyLarge(input, output);

if (count > 2147483647L) {

return -1;

}

return (int)count;

}

public static long copyLarge(InputStream input, OutputStream output)

throws IOException

{

byte[] buffer = new byte[4096];

long count = 0L;

int n = 0;

while (-1 != (n = input.read(buffer))) {

output.write(buffer, 0, n);

count += n;

}

return count;

}

。。。

java word生成_JAVA生成WORD工具类相关推荐

  1. java 静态类 安全_Java静态static工具类线程安全问题研究

    针对静态方法有以下一些前提: 静态方法和实例方法的区别是静态方法只能引用静态变量,静态方法通过类名来调用,实例方法通过对象实例来调用 每个线程都有自己的线程栈,栈与线程同时创建,每一个虚拟机线程都有自 ...

  2. java计算工作日_Java工作日计算工具类

    工作日计算工具类 主要功能:传入两个日期,返回这两个日期之间有多少个工作日. 思路: 预先设置好一定年份范围内的节假日.补休到map里.(这里暂时只设置了2017 - 2018年的) 将这个年份范围内 ...

  3. java时间随机数_java开发代码工具类(时间戳/随机数/日期等)

    简介 java开发代码工具类,提高开发效率,持续更新~ 实践 package com.springboot.sixmonth.common.util; import java.math.BigInte ...

  4. java签名软件_Java实现签名工具类

    一 点睛 签名和验证签名常常用于网络安全,在此提供一个工具类. 二 代码 package com.imooc.demo.common.util; import org.apache.commons.c ...

  5. java校验文件格式_java验证文件格式工具类(获取文件真实格式)

    , String>();privateVerifyFileType(){} static{ getAllFileType();//初始化文件类型信息} /*** Discription:[get ...

  6. java 查找一行_Java培训之工具类通用的查询一行多列,非实体

    //通用的查询方法之四:查询多行多列,但每一行又不是一个JavaBean /* * SELECT did,AVG(salary),MAX(Salary) FROM t_employee GROUP B ...

  7. java将链接生成二维码工具类

    一.添加依赖 <!-- 生成二维码--><dependency><groupId>com.google.zxing</groupId><artif ...

  8. 分享一个Java生成二维码工具类

    分享一个Java生成二维码工具类 直接上代码: 1.CodeUtil.class package top.lrshuai.blog.util;import java.awt.BasicStroke; ...

  9. aliyun短信服务包含随机生成四位数字验证码工具类

    .1.pom文件 <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sd ...

  10. java每秒限流_java限流工具类

    代码 import com.google.common.util.concurrent.RateLimiter; import java.util.concurrent.ConcurrentHashM ...

最新文章

  1. 你还有学了三年建模的朋友吗?他有救了
  2. how to create view (windows)
  3. 巴西CC成为FreeStor全球首个用户
  4. R语言入门第三集 实验二:基本数据处理
  5. 5G-NR复用与信道编码
  6. [MVC学习笔记]5.使用Controller来代替Filter完成登录验证(Session校验)
  7. 业务流程图6个图例_史上最全PID图例攻略!
  8. Frameset使用教程
  9. AWS 聘用 Rust 编译器联合创始人,大企为何都爱 Rust?
  10. Grep 用法和正则表达式(一)
  11. FuisonInsight Hadoop中新增用户和Hbase授权
  12. 用友CDM系统“货位间商品移库单(一步)”表体增加“货位可用数量”字段,根据表头的选择的货位自动带出数值...
  13. WM_NOTIFY的使用
  14. 手把手教你制作R包(一)
  15. InletexEMC绿色好用的电脑屏幕共享软件
  16. 在线生成抖音风格的文字
  17. 2022 年值得安装的几个 chrome/edge 扩展神器
  18. JS实现页面快捷键功能
  19. 如何用ChatGPT做品牌联名方案策划?
  20. 夜神模拟器4K模拟配置

热门文章

  1. 出现#include错误,请更新includePath
  2. 【初等数学】三角函数及其图像
  3. C++实现水仙花数判断实例
  4. 动态规划法求解游艇租用问题C++代码
  5. 智慧养老解决方案之养老院人员定位系统,医养结合式养老,高精准人员定位-新导智能
  6. 微信公众号如何上传视频
  7. Surrounded Regions--LeetCode
  8. EF框架实现登录记住密码+首页欢迎
  9. 用户行为分析之数据采集
  10. AMBA AHB面试题连载(七)