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日

相关文章

  • JSP读取文件实例

    JSP(Java Server Pages)是一种用于创建动态Web页面的技术,它允许在HTML页面中嵌入Java代码,这样就能够动态地生成页面内容。在实际开发中,通常需要从文件中读取数据,以便动态地加载页面内容或配置信息。本文将介绍如何在JSP中读取文件内容,主要包括以下步骤: Java文件流读取文件内容 将文件内容传递到JSP页面 在JSP页面中显示文件…

    Java 2023年6月15日
    00
  • Springboot中如何自动转JSON输出

    在Spring Boot中,可以通过添加相关依赖和注解的方式实现自动转JSON输出。下面是详细的攻略: 添加依赖 首先需要在pom.xml文件中添加相关依赖,这些依赖包括spring-boot-starter-web、spring-boot-starter-json等。 例如,在maven项目中可以添加以下依赖: <dependencies> &…

    Java 2023年5月26日
    00
  • 纯Java代码实现流星划过天空

    下面是纯Java代码实现流星划过天空的完整攻略。 步骤一:实现画布 首先需要使用Java的GUI库,比如Swing或JavaFX,来创建一个窗口,并在窗口上绘制流星。 使用JavaFX实现画布 import javafx.application.Application; import javafx.scene.Group; import javafx.sce…

    Java 2023年5月26日
    00
  • Java中的内部类你了解吗

    当我们在Java程序中声明一个类,这个类通常是在某一个包中的一个独立的.java文件中进行声明。但是Java中也存在一种叫做内部类的概念,内部类是被声明在一个外部类内部的类。在本文中,我们将详细讲解Java中的内部类的使用。 内部类的分类 Java中的内部类被分为4类,分别是: 成员内部类(Member Inner Class) 静态内部类(Static I…

    Java 2023年5月26日
    00
  • cmd使用javac和java及注意事项

    当使用 Windows 操作系统时,CMD 是一种最为常见的命令行工具。在使用 CMD 运行 Java 命令时,需要使用 javac 和 java 命令。本篇攻略将详细讲解 CMD 使用 javac 和 java 命令的注意事项以及两条示例。 注意事项 在使用 CMD 运行 Java 命令时,需要按照以下步骤进行操作: 环境变量设置:首先需要设置 JAVA_…

    Java 2023年5月23日
    00
  • Java中的命名与目录接口JNDI基本操作方法概览

    下面我将详细讲解“Java中的命名与目录接口JNDI基本操作方法概览”的完整攻略。 什么是JNDI JNDI (Java Naming and Directory Interface,Java 命名和目录接口) 是 Java 平台上命名和目录服务的应用编程接口,用于帮助 Java 应用程序访问各种命名和目录服务。JNDI 定义了程序访问命名和目录服务的通用接…

    Java 2023年5月26日
    00
  • JS工厂模式开发实践案例分析

    JS工厂模式开发实践案例分析 什么是JS工厂模式 在JavaScript中,工厂模式是一种用于创建对象的设计模式。工厂模式基于工厂方法,即通过调用工厂方法,返回所需的对象实例。在JavaScript中,这种模式非常常见,因为它可以帮助我们快速创建多个相似的对象。 工厂模式的优缺点 优点 工厂模式可以帮助我们将代码组织得更加清晰和易于管理。 工厂模式允许我们复…

    Java 2023年5月26日
    00
  • springBoot集成mybatis 转换为 mybatis-plus方式

    以下是使用springBoot集成mybatis转换为mybatis-plus的完整攻略。 1. 添加mybatis-plus依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</art…

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