SpringBoot使用freemarker导出word文件方法详解

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技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 详解微信小程序开发用户授权登陆

    详解微信小程序开发用户授权登陆 微信小程序开发用户授权登陆是小程序中常见的功能之一,允许用户授权登录并获取用户信息。本攻略将详细介绍如何实现微信小程序用户授权登录,并提供示例代码供参考。 1. 开发者配置 在微信公众平台中注册小程序,并在开发者工具中创建小程序项目。在小程序管理后台中,开启“用户信息”权限,同时设置授权回调页面路径。 2. 获取用户权限 在小…

    Java 2023年5月30日
    00
  • 使用express获取微信小程序二维码小记

    使用express获取微信小程序二维码的方式,主要有两种:一种是通过调用微信小程序的API获取,这需要开发者权限;另一种是通过第三方服务商API获取,不需要开发者权限。下面分别介绍这两种获取二维码的方式。 通过调用微信小程序API获取二维码 1. 准备工作 在使用微信小程序API之前,需要先申请开发者权限,具体步骤可以参考微信官方文档。获取开发者权限后,需要…

    Java 2023年5月23日
    00
  • 如何避免Java内存溢出?

    如何避免Java内存溢出? Java内存溢出问题是Java开发中常见的问题之一。解决这类问题需要从以下方面考虑: 内存分配问题 内存泄漏问题 内存计算问题 下面我们分别来看一下如何避免Java内存溢出问题。 一、内存分配问题 在Java中,内存分配通过JVM自动管理。如果JVM配置不当,就会导致内存分配问题。 JVM内存配置Java应用使用的内存由JVM进行…

    Java 2023年5月11日
    00
  • jsp页面显示数据库的数据信息表

    下面是如何在JSP页面中显示数据库的数据信息表的完整攻略。 第一步:连接数据库 在JSP中连接数据库需要使用JDBC驱动程序。我们可以使用以下代码来连接MySQL数据库。 <%@ page import="java.sql.*" %> <% Connection con = null; Statement stmt = …

    Java 2023年6月15日
    00
  • 员工管理系统java版

    这里为您详细讲解“员工管理系统java版”的完整攻略。 系统概述 这是一个基于Java语言开发的员工管理系统,主要功能包括员工信息录入、查询、修改和删除,部门信息录入、查询和修改,以及用户权限管理等。 系统环境 本系统运行需要JDK1.8及以上版本,建议使用IntelliJ IDEA等集成开发环境进行开发和调试。 数据库设计 本系统使用MySQL数据库进行数…

    Java 2023年5月23日
    00
  • java取两个字符串的最大交集

    Java取两个字符串的最大交集的算法可以通过动态规划(Dynamic Programming)来实现,其中最长公共子串(Longest Common Substring, LCS)就是该问题的一个特例。 以下是完整的攻略: 步骤1:定义状态 定义一个二维数组 dp[i][j],表示字符串 a 的前 i 个字符和字符串 b 的前 j 个字符的最长公共子串长度。…

    Java 2023年5月27日
    00
  • Hibernate中获取Session的两种方式代码示例

    获取 Hibernate 中的 Session 可以通过两种方式:getCurrentSession() 和 openSession()。 getCurrentSession() 方法 getCurrentSession() 方法获取的 Session 是与当前线程绑定的,使用完后会自动关闭。 示例代码如下: Session session = sessio…

    Java 2023年5月31日
    00
  • SpringMVC中@controllerAdvice注解的详细解释

    下面是关于SpringMVC中@controllerAdvice注解的详细解释。 一、什么是@controllerAdvice注解 在SpringMVC中,@ControllerAdvice注解用于标记一个类,该类则被用于定义一些全局控制器Advice。这个注解使用的类可以包含@ExceptionHandler、@InitBinder和@ModelAttri…

    Java 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部