第一步:在项目中导入POI的jar包,以及相关的jar包。

所需的jar包列表:

下载地址:http://download.csdn.net/download/qq_34908167/10046670

第二步:建立util工具类。

public class DocxUtil{

/**

* @Description: 将t中的字段转换成替换模板需要的数据${字段}-->字段值

* 在word模板中变量为${valuename},为每个值建一个以‘${valuename}’为键,‘value’为值的Map集合,

* 利用键去和Word模板中寻找相等的变量

*/

public MapcopyParamFromBean(T t, Mapparams) {

Field[] fields = t.getClass().getDeclaredFields();

String key;

String value;

for (Field field : fields) {

String fieldName = field.getName();

key = "${" + fieldName + "}";

String name = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);

try {

value = String.valueOf(t.getClass().getMethod(name).invoke(t));

params.put(key, value);

} catch (Exception e) {

e.printStackTrace();

}

}

return params;

}

/***

*替换Word模板中的对应变量。

*两种情况:1-段落中的变量。 2-表格中的变量

*/

public static void searchAndReplace(XWPFDocument document,Mapmap) {

try {

// 替换段落中的指定文字

IteratoritPara = document.getParagraphsIterator();//获得word中段落

while (itPara.hasNext()) { //遍历段落

XWPFParagraph paragraph = (XWPFParagraph) itPara.next();

Setset = map.keySet();

Iteratoriterator = set.iterator();

while (iterator.hasNext()) {

String key = iterator.next();

Listrun=paragraph.getRuns();

for(int i=0;iitTable = document.getTablesIterator();//获得Word的表格

while (itTable.hasNext()) { //遍历表格

XWPFTable table = (XWPFTable) itTable.next();

int count = table.getNumberOfRows();//获得表格总行数

for (int i = 0; i < count; i++) { //遍历表格的每一行

XWPFTableRow row = table.getRow(i);//获得表格的行

Listcells = row.getTableCells();//在行元素中,获得表格的单元格

for (XWPFTableCell cell : cells) { //遍历单元格

for (Entrye : map.entrySet()) {

if (cell.getText().equals(e.getKey())) {//如果单元格中的变量和‘键’相等,就用‘键’所对应的‘值’代替。

cell.removeParagraph(0);//所以这里就要求每一个单元格只能有唯一的变量。

cell.setText(e.getValue());

}

}

}

}

}

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 关闭输出流

*

* @param os

*/

public void close(OutputStream os) {

if (os != null) {

try {

os.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

第三步:在项目的对应目录下放入Word模板。

这里给出我的Word模板:http://download.csdn.net/download/qq_34908167/10046772

第四步:导出Word的java实现。

public String exportDoc(){

XWPFDocument doc = null;

OutputStream out = null;

FileInputStream in = null;

DocxUtil docxUtil = null;

try {

String rootPath = "";

ServletContext context = servletRequest.getSession().getServletContext();

String studentId = this.servletRequest.getParameter("studentid");//得到页面的参数

RankExportDocVO docVo=null;

if (studentId!=null) {

rootPath = context.getRealPath("/docmodel/PG/RankPrintAll_WordTemplate.docx");//Word模板所在的路径

docVo = rankPrintService.queryStudentInfo((studentId);//调用service得到对应的VO类

}else{

throw new Exception("传输字段为空!");

}

Mapparams = new HashMap();

docxUtil = new DocxUtil();

XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(rootPath));//读取Word模板

docxUtil.copyParamFromBean(docVo, params);//调用DocxUtil中的copyParamFromBean方法,为VO的每个值建立“${valuename}”键

docxUtil.searchAndReplace(document, params);//替换模板中的对应变量。

// 清空response

this.servletResponse.reset();

// 设置response的Header

String userAgent = this.servletRequest.getHeader("User-Agent");

String realname = "学生信息文档_"+docVo.getXm()+".docx";//最终导出文档的新文档名

if (userAgent.contains("Firefox")) {

// 采用BASE64编码

realname = "=?UTF-8?B?" + new BASE64Encoder().encode(realname.getBytes("utf-8")) + "?=";

} else {

// 其它浏览器 IE 、google 采用URL编码

realname = URLEncoder.encode(realname, "utf-8");

realname = realname.replace("+", " ");

}

servletResponse.setHeader("Content-Disposition", "attachment;filename=" + realname);

String minitype = ServletActionContext.getServletContext().getMimeType(realname);

servletResponse.setContentType(minitype);

out = this.servletResponse.getOutputStream();

document.write(out);

} catch (Exception e) {

e.printStackTrace();

} finally {

if (null != docxUtil) {

docxUtil.close(out);//关闭流

}

}

return null;

}

这就是利用Java-poi技术导出Word文档的全部步骤。

这样的好处,就在于我们可以根据需求制定我们需要的Word样式。

后语

注意事项:

1:Word模板中,表格的单元格的变量必须是唯一的,如果需要多个变量,我们可以利用word的隐藏表格功能,

来实现视觉上的一个单元格有多个变量的效果。

2:Word模板中的变量左右不能有空格,不然不能识别。

3:都 9102 年了,还在看java-poi吗?去看看我的另外一篇使用freemaker来根据模板定制word文档的博文吧:

Java-Freemarker替换模板文件.ftl中的变量,生成Word文档

-----------------------------------------------------------------------------------------不关注我“象话”吗?(哈哈,逗比)

java word模板 变量,Java-POI替换Word模板文档中的变量,生成Word文档相关推荐

  1. Java-POI替换Word模板文档中的变量,生成Word文档

    第一步:在项目中导入POI的jar包,以及相关的jar包. 所需的jar包列表: 下载地址:http://download.csdn.net/download/qq_34908167/10046670 ...

  2. 在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你

    在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你 目录 在word文档中如何自动生成目录,两种方法制作目录,总有一种适合你 1.文章中的标题较多,每个单独调整格式太费劲,这里我们用一 ...

  3. php访问父类变量,php – 如何使用parent :: method访问父类中的变量

    我在Parent Class.i中有受保护的变量UserId我将在我的子类中扩展变量,如下所示 class Main { protected $UserId = "151"; pr ...

  4. java excel 模板 替换_JAVA POI替换EXCEL模板中自定义标签(XLSX版本)满足替换多个SHEET中自定义标签...

    个人说明:为了简单实现导出数据较少的EXCEL(根据自定义书签模板) 一.替换Excel表格标签方法 ``` /** * 替换Excel模板文件内容 * @param map * 需要替换的标签建筑队 ...

  5. java导出生成word文档_java使用freemarker 生成word文档

    最近需要做一个导出word的功能, 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的样式也不美观,于是选择了另一种方式--- ...

  6. Java Web项目中使用Freemarker生成Word文档

    Web项目中生成Word文档的操作屡见不鲜,基于Java的解决方案也是很多的,包括使用Jacob.Apache POI.Java2Word.iText等各种方式,其实在从Office 2003开始,就 ...

  7. Java项目中使用Freemarker生成Word文档

    Web项目中生成Word文档的操作屡见不鲜,基于Java的解决方案也是很多的,包括使用Jacob.Apache POI.Java2Word.iText等各种方式,其实在从Office 2003开始,就 ...

  8. java web 操作word文档_Java Web项目中使用Freemarker生成Word文档

    Web项目中生成Word文档的操作屡见不鲜.基于Java的解决方式也是非常多的,包含使用Jacob.Apache POI.Java2Word.iText等各种方式,事实上在从Office 2003開始 ...

  9. 利用freemarker 在模板里面写入动态数据,动态表格,图片插入并生成word文档

    利用freemarker 在模板里面写入动态数据,动态表格,图片插入. 以下测试代码图片(image.jpg)和模板(template.xml)是直接放到src目录下面的,可以根据自己需求调整 废话不 ...

  10. php打开word文档_PHP使用phpword生成word文档

    写在前边的话 使用phpword生成文档有两种方式 直接使用代码编写word文档,用代码生成word,但是设置样式,格式,图片非常麻烦,不建议使用.如果客户或产品提供一份word的样式,我们也难以完全 ...

最新文章

  1. idea类模版,创建时生成一句歌词
  2. sqlserver启用登陆审计
  3. 实现连麦_直播课程系统如何实现互动连麦效果?
  4. C语言实现1~100的和(三种循环)
  5. Molile App(HTTP/HTML)—Record and Analyze Traffic
  6. [转]使用Visual C#制作可伸缩个性化窗体
  7. Loadrunner脚本优化-参数化之关联MySQL数据库获取数据
  8. 使用jmeter做接口测试----柠檬不萌!
  9. 通过MDaemon自带功能,实现同部门用同一账号对外收发邮件
  10. 必备的海外贸易沟通工具 - intbell使用教程
  11. 高阶常微分方程的求解
  12. 快速切换node版本
  13. 可靠性工程师是做什么的?需要哪些能力?
  14. 软件图形用户界面设计
  15. APP行业基准营销数据怎么获取?快用这两个免费应用数据工具
  16. 如何将苹果手机中的M4A音乐转换为MP3格式 1
  17. I Need Some Sleep / Eels
  18. 1079. 活字印刷
  19. 网络管理系统、网管、network manage system、运维系统
  20. Error (171173): Node xxxx from partition Top cannot preserve previous placement at PIN D16 and honor

热门文章

  1. 关于计算机网络通信协议
  2. 嵌入式linux UBoot移植篇
  3. ANDROID cmake版本下载,android studio中为gradle指定cmake版本
  4. puttygen convert ppk file to xshell key file
  5. SqList *L 和 SqList * L的区别
  6. 16QAM调制的仿真及其Python实现的代码(超级详细)
  7. java分页数据再次进行分页操作
  8. 记录用NoteExpress下载文献全文成功
  9. kutools for word 10(Word工具箱) 附安装教程
  10. 团队管理(二)-敏捷开发最佳团队协作管理平台(TAPD)