SpringBoot EasyPoi Vue实现Excel、Word、pdf实时预览

落日余晖 2024-03-26 ⋅ 205 阅读

引言

在许多业务场景中,我们经常需要处理和生成Excel、Word和PDF文档。通过使用SpringBoot、EasyPoi和Vue,我们可以轻松地实现这些文档的实时预览功能。本文将介绍如何使用这些工具来创建一个功能强大且易于使用的文档预览功能。

准备工作

在开始之前,我们需要准备以下环境:

  • Java开发环境
  • Maven构建工具
  • Vue.js开发环境

安装EasyPoi

EasyPoi是一款基于POI的Java Excel和Word处理工具。它提供了简单而强大的API,可以帮助我们处理Excel和Word文档。首先,我们需要在我们的SpringBoot项目中引入EasyPoi依赖。

在pom.xml中添加如下依赖:

<dependency>
  <groupId>cn.afterturn</groupId>
  <artifactId>easypoi-spring-boot-starter</artifactId>
  <version>5.1.2</version>
</dependency>

创建SpringBoot项目

使用Maven构建工具创建一个新的SpringBoot项目。

mvn archetype:generate -DgroupId=com.example -DartifactId=springboot-easypoi-vue -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

然后在pom.xml中添加EasyPoi和其他必要的依赖。

<!-- EasyPoi -->
<dependency>
  <groupId>cn.afterturn</groupId>
  <artifactId>easypoi-base</artifactId>
  <version>5.1.2</version>
  <exclusions>
    <exclusion>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
    </exclusion>
  </exclusions>
</dependency>

<dependency>
  <groupId>cn.afterturn</groupId>
  <artifactId>easypoi-web</artifactId>
  <version>5.1.2</version>
  <exclusions>
    <exclusion>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
    </exclusion>
  </exclusions>
</dependency>

<!-- 其他依赖 -->

编写Java代码

创建一个UserController类,用于处理用户相关的请求。

@RestController
@RequestMapping("/user")
public class UserController {

    @GetMapping("/exportExcel")
    public void exportExcel(HttpServletResponse response) throws IOException {
        List<User> userList = getUserList();

        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode("用户列表", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");

        ExcelWriter writer = EasyExcel.write(response.getOutputStream(), User.class).build();
        WriteSheet sheet = EasyExcel.writerSheet("Sheet1").build();
        writer.write(userList, sheet);
        writer.finish();
    }

    @GetMapping("/exportWord")
    public void exportWord(HttpServletResponse response) throws IOException {
        List<User> userList = getUserList();

        response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode("用户列表", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx");

        XWPFDocument document = new XWPFDocument();

        XWPFTable table = document.createTable(userList.size() + 1, 2);
        table.getRow(0).getCell(0).setText("姓名");
        table.getRow(0).getCell(1).setText("年龄");

        for (int i = 0; i < userList.size(); i++) {
            User user = userList.get(i);
            table.getRow(i + 1).getCell(0).setText(user.getName());
            table.getRow(i + 1).getCell(1).setText(String.valueOf(user.getAge()));
        }

        document.write(response.getOutputStream());
    }

    @GetMapping("/exportPdf")
    public void exportPdf(HttpServletResponse response) throws IOException {
        List<User> userList = getUserList();

        response.setContentType("application/pdf");
        response.setCharacterEncoding("utf-8");
        String fileName = URLEncoder.encode("用户列表", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".pdf");

        Document document = new Document();
        PdfWriter.getInstance(document, response.getOutputStream());
        document.open();

        PdfPTable table = new PdfPTable(2);
        table.addCell("姓名");
        table.addCell("年龄");

        for (User user : userList) {
            table.addCell(user.getName());
            table.addCell(String.valueOf(user.getAge()));
        }

        document.add(table);
        document.close();
    }

    private List<User> getUserList() {
        List<User> userList = new ArrayList<>();
        userList.add(new User("张三", 20));
        userList.add(new User("李四", 30));
        userList.add(new User("王五", 25));
        return userList;
    }
}

创建一个User类,用于表示用户实体。

public class User {
    private String name;
    private Integer age;

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    // Getters and setters
}

构建前端项目

src/main/resources/static目录下创建Vue.js项目。

vue create frontend

修改Vue.js项目的src/App.vue文件,添加以下代码:

<template>
  <div>
    <div class="grid-container">
      <div class="grid-item">
        <h2>导出Excel</h2>
        <button @click="exportExcel">导出</button>
        <div>
          <iframe :src="excelUrl" frameborder="0" width="100%" height="600"></iframe>
        </div>
      </div>
      <div class="grid-item">
        <h2>导出Word</h2>
        <button @click="exportWord">导出</button>
        <div>
          <iframe :src="wordUrl" frameborder="0" width="100%" height="600"></iframe>
        </div>
      </div>
      <div class="grid-item">
        <h2>导出PDF</h2>
        <button @click="exportPdf">导出</button>
        <div>
          <iframe :src="pdfUrl" frameborder="0" width="100%" height="600"></iframe>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      excelUrl: "",
      wordUrl: "",
      pdfUrl: ""
    };
  },
  methods: {
    exportExcel() {
      this.excelUrl = "/user/exportExcel";
    },
    exportWord() {
      this.wordUrl = "/user/exportWord";
    },
    exportPdf() {
      this.pdfUrl = "/user/exportPdf";
    }
  }
};
</script>

<style>
.grid-container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-column-gap: 20px;
  grid-row-gap: 20px;
}

.grid-item {
  padding: 20px;
  border: 1px solid #ccc;
}
</style>

运行项目

在SpringBoot项目的根目录下执行以下命令:

mvn spring-boot:run

在Vue.js项目的根目录下执行以下命令:

npm run serve

打开浏览器,访问http://localhost:8080,即可看到预览界面。

结语

通过使用SpringBoot、EasyPoi和Vue,我们可以轻松地实现Excel、Word和PDF文档的实时预览功能。这样的功能在许多业务场景下都是非常有用的。希望本文对你有所帮助,谢谢阅读!

参考链接:


全部评论: 0

    我有话说: