用Java实现FreeMarker来导出Word文档,包括图片、附件和表格?
时间: 2024-02-17 13:04:39 浏览: 128
Java实现用Freemarker完美导出word文档(带图片)
5星 · 资源好评率100%
好的,下面是一个简单的Java代码示例,演示如何使用FreeMarker模板引擎和Apache POI库来导出Word文档,包括图片、附件和表格。
首先,需要准备一个Word模板文件,其中包括需要导出的内容。可以使用Microsoft Word来创建模板文件,然后将其保存为.doc或.docx格式。
接着,需要添加以下依赖项到项目中:
```xml
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.0.0</version>
</dependency>
```
接下来,可以使用以下代码来填充模板文件并导出Word文档:
```java
import java.io.*;
import java.util.*;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.poi.util.IOUtils;
import freemarker.template.*;
public class WordExporter {
private static final String TEMPLATE_FILE = "template.docx";
private static final String OUTPUT_FILE = "output.docx";
public static void main(String[] args) throws Exception {
Map<String, Object> dataModel = new HashMap<>();
dataModel.put("name", "John Smith");
dataModel.put("age", 30);
dataModel.put("email", "john.smith@example.com");
List<String> skills = Arrays.asList("Java", "Python", "JavaScript");
dataModel.put("skills", skills);
byte[] pictureData = IOUtils.toByteArray(new FileInputStream("picture.jpg"));
dataModel.put("picture", pictureData);
List<File> attachments = Arrays.asList(new File("attachment1.pdf"), new File("attachment2.docx"));
dataModel.put("attachments", attachments);
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
cfg.setClassForTemplateLoading(WordExporter.class, "/");
Template template = cfg.getTemplate(TEMPLATE_FILE);
XWPFDocument document = new XWPFDocument();
FileOutputStream out = new FileOutputStream(new File(OUTPUT_FILE));
template.process(dataModel, document);
document.write(out);
out.close();
document.close();
}
}
```
在上面的示例中,我们首先创建了一个dataModel对象,其中包含了需要在模板文件中使用的变量,包括name、age、email、skills、picture和attachments等。其中,picture和attachments变量分别表示图片和附件的数据。
接着,我们创建了一个Configuration对象和一个Template对象,用于处理模板文件。在这里,我们将模板文件保存在项目根目录下,名为template.docx。
然后,我们创建了一个XWPFDocument对象,用于表示导出的Word文档。并且创建了一个FileOutputStream对象,用于将导出的文档保存到本地磁盘上的一个文件中。
最后,我们使用template.process方法将dataModel中的数据填充到模板文件中,然后将填充后的文档保存到指定的位置。
需要注意的是,在模板文件中,可以使用FreeMarker标签来引用dataModel中的变量,例如:${name},${age},${skills}等。对于图片和附件,可以使用POI库的API来插入它们,例如:
```java
byte[] pictureData = ... // 从文件中读取图片数据
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
run.addPicture(new ByteArrayInputStream(pictureData), XWPFDocument.PICTURE_TYPE_JPEG, "picture.jpg", Units.toEMU(200), Units.toEMU(200));
```
上面的代码可以在Word文档中插入一张名为picture.jpg的图片,并且设置它的宽度和高度为200像素。
对于附件,可以使用下面的代码将它们插入到Word文档中:
```java
List<File> attachments = ... // 从文件系统中获取附件文件
XWPFParagraph paragraph = document.createParagraph();
for (File attachment : attachments) {
XWPFRun run = paragraph.createRun();
run.addBreak(BreakType.TEXT_WRAPPING);
InputStream is = new FileInputStream(attachment);
run.addPicture(is, XWPFDocument.PICTURE_TYPE_PNG, attachment.getName(), Units.toEMU(16), Units.toEMU(16));
is.close();
run.setText(" " + attachment.getName());
}
```
上面的代码可以将附件文件插入到Word文档中,并且在每个附件名字前面添加一个小图标。
阅读全文