SpringBoot使用freemarker导出word文件方法详解
在SpringBoot框架中,使用freemarker库可以轻松地将数据和模板结合起来生成各种文件类型。其中,导出word文件是一个常见的需求,本文将详细介绍SpringBoot如何使用freemarker导出word文件。
步骤一:添加依赖
首先,在pom.xml文件中添加freemarker和poi-ooxml的依赖。
<dependencies>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
</dependencies>
步骤二:编写模板
接下来,编写一个freemarker模板文件来定义word文件的样式和内容。下面是一个示例模板文件,其中包含了一个表格和一些文本:
<#assign xls = 'http://www.w3.org/TR/REC-html40'?>
<!DOCTYPE html PUBLIC "-//${xls}//DTD HTML 4.0 Transitional//EN">
<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Title</title>
<style>
table, th, td {
border: 1px solid black;
}
</style>
</head>
<body>
<table>
<thead>
<tr>
<th>姓名</th>
<th>性别</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
<#list users as user>
<tr>
<td>${user.name}</td>
<td>${user.gender}</td>
<td>${user.age}</td>
</tr>
</#list>
</tbody>
</table>
<p>${notice}</p>
</body>
</html>
步骤三:编写Java代码
有了模板文件,接下来只需要编写一些Java代码就可以生成word文件了。下面是一个示例代码:
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class WordGenerator {
public void generateWord() throws Exception {
// step1 创建freeMarker配置实例
Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
// step2 获取模板路径
String classpath = this.getClass().getResource("/").getPath();
String templatePath = classpath + "/templates/";
// step3 创建数据模型
Map<String, Object> dataMap = new HashMap<>();
List<User> users = new ArrayList<>();
users.add(new User("Alice", "Female", 20));
users.add(new User("Bob", "Male", 21));
users.add(new User("Carol", "Female", 22));
dataMap.put("users", users);
dataMap.put("notice", "本表格只供参考");
// step4 将模板加载到配置实例
configuration.setDirectoryForTemplateLoading(new File(templatePath));
Template template = configuration.getTemplate("user.ftl");
// step5 创建word文档
XWPFDocument document = new XWPFDocument();
FileOutputStream out = new FileOutputStream(new File("users.docx"));
// step6 将模板和数据合并,并输出到word文档
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer writer = new OutputStreamWriter(baos);
template.process(dataMap, writer);
writer.flush();
writer.close();
InputStream is = new ByteArrayInputStream(baos.toByteArray());
XWPFParagraph p = document.createParagraph();
XWPFRun r = p.createRun();
r.setText("Word文件内容如下:");
document.createParagraph().createRun().setText("");
document.createParagraph().createRun().setText("");
r.setText(is);
document.write(out);
out.flush();
out.close();
System.out.println("word文档生成完毕!");
}
}
以上代码包含了各种需要的步骤,包括加载模板、读取数据、合并模板和数据、创建word文档等。最后,调用generateWord()方法就可以生成word文件了。
示例一:基于ORM框架进行数据导出
这个示例中我们需要使用到Mybatis作为ORM框架,配置MySQL作为数据源,以及SpringBoot作为整个应用的框架。
首先,我们需要在pom.xml中添加以下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!--其他依赖省略...-->
</dependencies>
接下来,我们需要在application.properties文件中配置数据库连接:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
完成以上配置之后,我们需要编写一些Mybatis相关的代码来获取数据。下面是一个示例:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public List<User> listUsers() {
return userMapper.listUsers();
}
}
其中,listUsers()方法调用了Mybatis执行SQL语句来查询数据库中的数据列表,并返回结果为List
接下来,我们需要编写一个Controller来处理请求,并渲染模板:
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/users")
public String exportUsers(Model model) {
List<User> users = userService.listUsers();
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("users", users);
dataMap.put("notice", "本表格由SpringBoot和Freemarker生成");
Configuration configuration = new Configuration(Configuration.getVersion());
configuration.setClassForTemplateLoading(this.getClass(), "/templates/");
String templateName = "users.ftl";
Template template = null;
try {
template = configuration.getTemplate(templateName, "UTF-8");
} catch (IOException e) {
e.printStackTrace();
}
StringWriter sw = new StringWriter();
try {
template.process(dataMap, sw);
} catch (TemplateException | IOException e) {
e.printStackTrace();
}
return sw.toString();
}
}
在Controller中,我们先注入了UserService来获取用户数据,然后将数据和模板结合起来,最终将渲染结果返回到浏览器端。需要注意的是,这里我们返回的内容是一个字符串,而不是一个文件。
最后,我们需要在模板中添加导出按钮和相应的JS代码。下面是一个示例代码:
<button type="button" onclick="exportWord()" class="btn btn-primary">导出到Word</button>
<script type="text/javascript">
function exportWord() {
$.ajax({
url:'/export',
type:'get',
dataType:'text',
data:{
},
success:function(data){
console.log(data);
var link = document.createElement('a');
link.href = 'data:application/msword;base64,' + btoa(data);
link.download = 'users.doc'; // 文件下载后的名称
link.click();
}
});
}
</script>
以上代码添加了一个按钮,当用户点击按钮时,会向服务器发送一个/get请求,然后服务器返回生成的word文件内容。JS代码将文件内容转换成base64格式的字符串,并设置下载链接的href和download属性,然后触发click()事件以触发下载。
示例二:基于POJO进行数据导出
如果我们没有ORM框架和数据库,只有一个JavaBean的List,我们该如何导出word文件呢?这里提供一个基于POJO的示例代码。
假设我们有一个JavaBean类User:
public class User {
private String name;
private String gender;
private int age;
public User(String name, String gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
// 省略getter和setter方法...
}
我们也需要编写一个Controller来处理请求,并渲染模板:
@RestController
public class UserController {
@RequestMapping("/download")
public void download(HttpServletResponse response) throws Exception {
XWPFDocument doc = generateDocument();
response.setContentType("application/msword");
response.setHeader("Content-Disposition", "attachment;filename=users.docx");
OutputStream out = response.getOutputStream();
doc.write(out);
out.close();
System.out.println("导出word文件结束...");
}
private XWPFDocument generateDocument() throws Exception {
Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
configuration.setClassForTemplateLoading(this.getClass(), "/templates/");
Template template = configuration.getTemplate("pojo.ftl");
List<User> users = generateUsers();
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("users", users);
XWPFDocument doc = new XWPFDocument();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Writer writer = new OutputStreamWriter(baos);
template.process(dataMap, writer);
writer.flush();
writer.close();
InputStream is = new ByteArrayInputStream(baos.toByteArray());
XWPFParagraph p = doc.createParagraph();
XWPFRun r = p.createRun();
r.setText("Word文件内容如下:");
doc.createParagraph().createRun().setText("");
doc.createParagraph().createRun().setText("");
r.setText(is);
return doc;
}
private List<User> generateUsers() {
List<User> users = new ArrayList<>();
users.add(new User("Alice", "Female", 20));
users.add(new User("Bob", "Male", 21));
users.add(new User("Carol", "Female", 22));
return users;
}
}
在generateDocument()方法中,我们首先加载了模板,并生成了一些临时的数据。然后,我们将数据和模板结合起来,生成了一个XWPFDocument对象,该对象表示了一个word文件。最后,我们将XWPFDocument对象通过response.getOutputStream()直接输出到浏览器端。
结论
通过本文的介绍,我们可以看到,使用SpringBoot和freemarker库可以轻松地生成word文件。不同的场景需要使用不同的模板和数据来源。如果我们有一个JavaBean的列表,可以使用基于POJO的方式;如果我们有一个ORM框架和数据库,可以使用基于ORM的方式。无论哪种方式,用户只需要添加必要的依赖、编写必要的代码,就可以生成word文件。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot使用freemarker导出word文件方法详解 - Python技术站