java word生成_JAVA生成WORD工具类
该方法借助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工具类相关推荐
- java 静态类 安全_Java静态static工具类线程安全问题研究
针对静态方法有以下一些前提: 静态方法和实例方法的区别是静态方法只能引用静态变量,静态方法通过类名来调用,实例方法通过对象实例来调用 每个线程都有自己的线程栈,栈与线程同时创建,每一个虚拟机线程都有自 ...
- java计算工作日_Java工作日计算工具类
工作日计算工具类 主要功能:传入两个日期,返回这两个日期之间有多少个工作日. 思路: 预先设置好一定年份范围内的节假日.补休到map里.(这里暂时只设置了2017 - 2018年的) 将这个年份范围内 ...
- java时间随机数_java开发代码工具类(时间戳/随机数/日期等)
简介 java开发代码工具类,提高开发效率,持续更新~ 实践 package com.springboot.sixmonth.common.util; import java.math.BigInte ...
- java签名软件_Java实现签名工具类
一 点睛 签名和验证签名常常用于网络安全,在此提供一个工具类. 二 代码 package com.imooc.demo.common.util; import org.apache.commons.c ...
- java校验文件格式_java验证文件格式工具类(获取文件真实格式)
, String>();privateVerifyFileType(){} static{ getAllFileType();//初始化文件类型信息} /*** Discription:[get ...
- java 查找一行_Java培训之工具类通用的查询一行多列,非实体
//通用的查询方法之四:查询多行多列,但每一行又不是一个JavaBean /* * SELECT did,AVG(salary),MAX(Salary) FROM t_employee GROUP B ...
- java将链接生成二维码工具类
一.添加依赖 <!-- 生成二维码--><dependency><groupId>com.google.zxing</groupId><artif ...
- 分享一个Java生成二维码工具类
分享一个Java生成二维码工具类 直接上代码: 1.CodeUtil.class package top.lrshuai.blog.util;import java.awt.BasicStroke; ...
- aliyun短信服务包含随机生成四位数字验证码工具类
.1.pom文件 <dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sd ...
- java每秒限流_java限流工具类
代码 import com.google.common.util.concurrent.RateLimiter; import java.util.concurrent.ConcurrentHashM ...
最新文章
- 你还有学了三年建模的朋友吗?他有救了
- how to create view (windows)
- 巴西CC成为FreeStor全球首个用户
- R语言入门第三集 实验二:基本数据处理
- 5G-NR复用与信道编码
- [MVC学习笔记]5.使用Controller来代替Filter完成登录验证(Session校验)
- 业务流程图6个图例_史上最全PID图例攻略!
- Frameset使用教程
- AWS 聘用 Rust 编译器联合创始人,大企为何都爱 Rust?
- Grep 用法和正则表达式(一)
- FuisonInsight Hadoop中新增用户和Hbase授权
- 用友CDM系统“货位间商品移库单(一步)”表体增加“货位可用数量”字段,根据表头的选择的货位自动带出数值...
- WM_NOTIFY的使用
- 手把手教你制作R包(一)
- InletexEMC绿色好用的电脑屏幕共享软件
- 在线生成抖音风格的文字
- 2022 年值得安装的几个 chrome/edge 扩展神器
- JS实现页面快捷键功能
- 如何用ChatGPT做品牌联名方案策划?
- 夜神模拟器4K模拟配置