📜  Spring MVC-生成Excel示例(1)

📅  最后修改于: 2023-12-03 15:35:03.483000             🧑  作者: Mango

Spring MVC 生成 Excel 示例

在实际开发中,我们经常需要将一些数据导出为 Excel 文件,通常情况下,我们可以使用 Apache POI 这个工具来实现,不过如果能够结合 Spring MVC 框架来实现,就会更加方便易用。本文将介绍如何使用 Spring MVC 生成 Excel。

环境搭建
  • JDK 1.8+
  • Maven 3.0+
  • Spring 5.0.7.RELEASE
  • poi 3.17
添加依赖

在 pom.xml 文件中添加 poi 以及 Spring 相关依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.0.7.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.17</version>
    </dependency>
</dependencies>
创建 Controller

在 Spring MVC 中,我们可以通过访问 Controller 中的特定地址来触发生成 Excel 的操作,下面是一个简单的 Controller:

@Controller
@RequestMapping("/excel")
public class ExcelController {

    @GetMapping("/download")
    public void downloadExcel(HttpServletResponse response) {
        try {
            // 创建 Workbook
            HSSFWorkbook workbook = new HSSFWorkbook();
            HSSFSheet sheet = workbook.createSheet("Sheet1");

            // 创建标题行
            HSSFRow row = sheet.createRow(0);
            String[] titles = { "姓名", "年龄", "性别" };
            for (int i = 0; i < titles.length; i++) {
                HSSFCell cell = row.createCell(i);
                cell.setCellValue(titles[i]);
            }

            // 填充数据
            String[][] data = { { "小明", "18", "男" }, { "小红", "19", "女" }, { "小王", "20", "男" } };
            for (int i = 0; i < data.length; i++) {
                row = sheet.createRow(i + 1);
                for (int j = 0; j < data[i].length; j++) {
                    row.createCell(j).setCellValue(data[i][j]);
                }
            }

            // 设置响应头
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=user.xls");

            // 输出 Excel 文件
            workbook.write(response.getOutputStream());
            workbook.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

这个 Controller 包含了一个用于下载 Excel 的方法,它生成一个包含基本数据的 Excel 文件并将其写入 HttpServletResponse 输出流中,最后由浏览器自动下载。

配置视图解析器

在 Spring MVC 中,我们需要配置视图解析器来指定生成的 Excel 文件的视图类型,例如在 xml 配置文件中,可以这样配置:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
    <property name="order" value="2" />
</bean>

<bean id="excelViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver" />

<bean id="excelView" class="com.example.ExcelView" />

其中,excelViewResolver 定义了一个 BeanNameViewResolver,这个视图解析器会在处理程序返回的逻辑视图名称时查找具有相同名称的 bean,并将其视为视图。

在这里,我们定义了一个名为 excelView 的 bean,表示当我们的 Controller 返回 excelView 名称时,通过这个 bean 来渲染生成的 Excel 文件。

创建自定义视图

自定义视图是用于呈现生成的 Excel 文件的,它与普通视图的区别在于它不是将数据渲染成 HTML 页面,而是将数据以 Excel 文件的方式写入输出流。

public class ExcelView extends AbstractView {

    @Override
    protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
                                           HttpServletResponse response) throws Exception {
        HSSFWorkbook workbook = (HSSFWorkbook) model.get("workbook");
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment;filename=user.xls");
        workbook.write(response.getOutputStream());
        workbook.close();
    }

}

ExcelView 类继承了 AbstractView 类,并实现了 renderMergedOutputModel() 方法,这个方法接收三个参数:

  • model:Controller 中返回的模型数据。
  • request:当前请求的 HttpServletRequest 对象。
  • response:当前响应的 HttpServletResponse 对象。

在这里,我们先从模型数据中获取 Workbook 对象,设置响应头部信息,最后将 Workbook 对象写入 HttpServletResponse 输出流中。

测试

我们可以使用浏览器来访问 Controller 中的 downloadExcel() 方法,从而观察生成的 Excel 文件是否正常。这里以前端提交 Ajax 请求来触发下载操作:

<script>
    function download() {
        $.ajax({
            url: '${pageContext.request.contextPath}/excel/download',
            type: 'GET',
            success: function() {
                alert('Excel 已下载!');
            },
            error: function() {
                alert('Excel 下载失败!');
            }
        });
    }
</script>

<input type="button" value="下载 Excel" onclick="download()" />
总结

本文介绍了如何使用 Spring MVC 生成 Excel 文件,基本的步骤包括:

  • 创建 Controller,设置生成 Excel 文件的地址。
  • 创建 Workbook,填充数据。
  • 将 Workbook 写入 HttpServletResponse 输出流中。
  • 配置视图解析器。
  • 创建自定义视图。

在实际开发中,可以根据具体需求来修改代码,例如可以将 Excel 文件保存到服务器磁盘上,或者对 Excel 文件进行多样化的格式处理。