利用POI 技术动态替换word模板内容

简介: 项目中需要实现一个功能,动态替换给定模板里面的内容,生成word文档提供下载功能。中间解决了问题有:1.页眉的文档logo图片解决,刚开始的时候,HWPFDocument 对象无法读取图片对象(已测试)2.

项目中需要实现一个功能,动态替换给定模板里面的内容,生成word文档提供下载功能。

中间解决了问题有:

1.页眉的文档logo图片解决,刚开始的时候,HWPFDocument 对象无法读取图片对象(已测试)

2.文档的水印也无法读取

3.下载的乱码问题(火狐浏览器)

4.将文档中的阿拉伯数字的金额改为中文繁体显示

 

 

 

具体代码如下:

/**
* 拍卖结算之后,进行成交确认书的下载操作方法
*
* @param id
* @param response
*/
@RequestMapping(value="/aucLotDownLoad",method = RequestMethod.GET)
@ResponseBody
public void aucLotDownLoad(String id,HttpServletResponse response) {
if (logger.isDebugEnabled()) {
logger.debug("aucLotQuery, aucLotId ", id);
}
SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
AucLot aucLot = aucLotRepository.findOne(id);
AucBrand aucBrand = aucBrandRepository.findOneByAucLotAndIsBailPayedAndIsDealAndIsSettled(aucLot,AucBrand.AUCBRAND_ISBAILPAYED_YES,AucBrand.AUCBRAND_ISDEAL_SUCCESS,AucBrand.AUCBRAND_ISSETTLED_YES);
if (aucBrand != null) {
String goodsName = aucLot.goodsName();//标的名称
String brandNo = aucBrand.brandNo();//买受人号牌,竞买代码
Date startTime = aucLot.startTime();//拍卖开始时间
Date endTime = aucLot.endTime();//拍卖结束时间
BigDecimal dealPrice = aucBrand.dealPrice();//拍卖成交金额
BigDecimal clientCommison = aucLot.clientCommison();//委托佣金

//定义成交价和委托佣金的总和(两种方式体现)
BigDecimal totalPrice = dealPrice.add(clientCommison);//合计拍卖的总金额

try {
//获取模板文件的目录地址
String fileDir = new File(base.getFile(), "../../../../../../doc/").getCanonicalPath();
//获取模板文件
File demoFile=new File(fileDir + "/1.doc");

FileInputStream in = new FileInputStream(demoFile);
HWPFDocument hdt = new HWPFDocument(in);
//替换读取到的word模板内容的指定字段
Range range = hdt.getRange();
Map<String, String> map = new HashMap<String, String>();
map.put("$PMBD$", goodsName);
map.put("$PMKSSJ$", dateFormater.format(startTime));
map.put("$MSRHP$", brandNo);
map.put("$PMCJJ$", numberToHanZiUtility.number2CNMontrayUnit(dealPrice));
map.put("$PMYJ$", numberToHanZiUtility.number2CNMontrayUnit(clientCommison));
map.put("$HJ$", numberToHanZiUtility.number2CNMontrayUnit(totalPrice));
map.put("$PMCJJXX$", dealPrice + "");
map.put("$PMYJXX$", clientCommison + "");
map.put("$HJXX$", totalPrice + "");
map.put("$PMJSSJ$", dateFormater.format(endTime));
for (Map.Entry<String,String> entry:map.entrySet()) {
range.replaceText(entry.getKey(),entry.getValue());
}

//输出word内容文件流,提供下载
response.setContentType("application/x-msdownload");
String name = java.net.URLEncoder.encode("成交确认书_"+aucLot.goodsNo()+".doc", "UTF8");
name = new String((name).getBytes("UTF-8"), "ISO-8859-1");
response.addHeader("Content-Disposition", "attachment; filename*=utf-8'zh_cn'"+name);
ByteArrayOutputStream ostream = new ByteArrayOutputStream();
ServletOutputStream servletOS = response.getOutputStream();
hdt.write(ostream);
servletOS.write(ostream.toByteArray());
servletOS.flush();
servletOS.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}

 

 

 


}

 

相关文章
|
6月前
|
Java
Springboot 导出word,动态填充表格数据
Springboot 导出word,动态填充表格数据
|
XML 数据格式
Freemarker填充数据到word模板中
Freemarker填充数据到word模板中
122 1
|
6月前
|
存储 自然语言处理
QT案例词典 -- 存储内容及遍历
QT案例词典 -- 存储内容及遍历
46 1
Word文档中标题默认出现首行缩进的修改办法
本文介绍在Word中,标题样式跟随正文样式呈现首行缩进状态的解决办法~
406 1
Word文档中标题默认出现首行缩进的修改办法
|
移动开发 Python
批量查找文本中的内容
@echo off findstr /ims "查找内容" *.*>list.txtps:把含有相关文字内容的文档输出到list.txt文本中,适用于能用notepad打开的各种文档.   是一个修改升级的版本,原程序是这个《批量查找替换文本文件内容》。
1051 0
POI批量替换world文档XWPFParagraph.getRuns 出现分段混乱
POI批量替换world文档XWPFParagraph.getRuns 出现分段混乱
1008 1
|
前端开发
POI复制Excel模板并填充数据
我们最近需要对系统加一个报表导出的功能,可以通过POI直接导出,导出后的excel文件需要支持在office里面修改数据后图表也会自动变换。方法一可以使用jfreechart+poi,但是这种方法生成的图表是一张图片,不能在office中自动修改;第二种方法是poi调用 office的宏,它需要调用自定义的.dll 文件,也需要在windows环境中,所以不适用。
6514 0

相关实验场景

更多