该方法借助freemarker的JAR包即可。
参考:
Java Web项目中使用Freemarker生成Word文档(带图片)
所需工具:
步骤:
1、在word中编辑好模版样式,设置好占位符,注意图片最好先黏上去
2、在word中,文件-另存为-XML格式
3、使用工具格式化上图的XML文件
a.在表格数据的TR中加入<#list myListData as tmp> 和</#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<String, Object> dataMap = new HashMap<String, Object>(); /** 组装数据 */ 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<Map<String, Object>> newsList=new ArrayList<Map<String,Object>>(); for(int i=1;i<=10;i++){ Map<String, Object> map=new HashMap<String, Object>(); 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文件主要涉及到的是对Microsoft Office文档的处理,这在很多企业级应用中非常常见,比如自动化报告生成、数据导入导出等。在Java中,由于Java本身并不直接支持与Windows API交互,因此需要借助第三方库...
"Java通过word模板配置书签生成word"是一个技术方案,它利用了Java的API来处理Microsoft Word文档,特别是Apache POI库,这是一种强大的工具,允许开发者在Java程序中创建、修改和展示MS Office格式的文件。...
在本篇内容中,我们将聚焦于"Aspose-17.8 Java 生成PDF工具类",了解如何利用Aspose库在Java环境中创建PDF文件。 首先,`aspose.pdf-17.8.jar`是Aspose.Pdf组件的核心库,它允许开发者在Java应用中创建、操作和转换...
java 利用iText生成word,word中插入图片工具类,自己封装的一个类,有疑问欢迎交流!
java中生成word文件,生成固定文件模板的word文件 封装成工具类,可以更方便的实现需求
Java生成Word模板是一种常见的技术,尤其在企业级应用中,用于自动生成报告、合同或任何需要格式化的文本文档。这个技术通常涉及到Java的IO流处理、模板引擎以及可能的库如Apache POI或OpenOffice API。 Apache POI...
在本案例中,"java POI生成word.zip"是一个压缩包,包含使用Java POI库生成Word文档的示例代码。以下是基于这个主题的相关知识点: 1. **Java POI库介绍** - Java POI 是一套API,用于处理Microsoft Office格式的...
2. **Java生成Word**:Aspose.Words for Java是Aspose库的一部分,它允许开发者通过编程方式创建、修改和操作Microsoft Word文档。你可以创建新的文档,插入文本、图片、表格,应用样式,执行复杂的排版任务,以及...
Java生成Word文档是常见的需求,尤其在自动化报告、数据导出或者系统集成中。iText是一个流行的开源Java库,用于创建和修改PDF和RTF文件。在这个压缩包中,我们有iText 2.7.1,iText rtf 2.7.1以及iTextAsian,这些...
在Java编程环境中,生成Word文档是一项常见的需求,特别是在数据报告、文档自动化或者系统集成的场景中。本篇文章将深入探讨如何使用iText这个强大的库来创建和操作Microsoft Word(.doc或.docx)文档。 首先,我们...
本实例将探讨如何使用Java代码实现填充Word模板并生成Word合同。 首先,我们需要理解Apache POI库。Apache POI是Java平台上的一个开源项目,它允许Java应用程序读取、写入和修改Microsoft Office格式的文件,包括...
### Apache POI:Java生成Word文档的标准工具 Apache POI是Apache软件基金会的一个开源项目,它提供了一系列的API,用于处理Microsoft Office格式的文件,包括Excel、PowerPoint和Word。对于Word文档的处理,主要...
Java调用PageOffice生成Word是一项常见的技术应用,主要用于在服务器端动态创建和编辑Microsoft Office文档。PageOffice是一款专为Java设计的Office文档处理组件,它提供了丰富的API接口,使得开发者可以方便地在...
总之,这个"java动态生成word文件Demo"为开发者提供了一个实用的工具,不仅能够方便地生成Word文件,还支持集成二维码,增加了文件的信息化程度。学习并运用这个Demo,有助于提升你在处理类似任务时的效率和质量。
Word文档通常使用Microsoft Office套件或者OpenOffice、LibreOffice等开源工具直接编辑,而Java生成的RTF文档则是通过编程实现,适合自动化和批量处理。 在Java中,除了使用特定库如`srw.jar`外,还可以使用Apache ...
Java生成Word文档是一种常见的需求,尤其在数据报告、合同生成或者自动化办公场景中。这个例子提供了直接在Eclipse环境中运行的代码,可以帮助开发者快速理解和实现这一功能。下面将详细介绍Java如何操作Word,并...