Jsp中的table多表头导出excel文件具体实现

首先,需要使用JXL库来将数据导出为Excel文件。而实现table多表头导出Excel文件的关键是要在Excel中实现合并单元格。

以下是实现步骤:

1. 引入 JXL 库

在 JSP 页面中引入 jxl.jar 包。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ page import="jxl.*" %>

2. 打开 Excel 文件

在 JSP 中通过 JXL 库的 Workbook 类打开一个 Excel 文件。

 // 1. 创建工作簿
WritableWorkbook workbook = Workbook.createWorkbook(response.getOutputStream());
// 2. 创建工作表
WritableSheet sheet = workbook.createSheet("Sheet1", 0);

3. 设置表头

在 JSP 页面中设置表头,同时设置合并单元格。

// 合并第一行中的前两列
sheet.mergeCells(0, 0, 1, 0);
// 合并第一行中的第三列到第五列
sheet.mergeCells(2, 0, 4, 0);
// 写入表头内容
Label label = new Label(0, 0, "表头1");
sheet.addCell(label);
Label label2 = new Label(2, 0, "表头2");
sheet.addCell(label2);

4. 写入数据

在 JSP 页面中从后台获取数据,然后将这些数据写入到 Excel 文件中。

// 写入数据
for (int i = 1; i <= dataList.size(); i++) {
    for (int j = 0; j < columnList.size(); j++) {
        Label data = new Label(j, i, dataList.get(i-1).get(columnList.get(j)).toString());
        sheet.addCell(data);
    }
}

5. 关闭文件流

在 JSP 页面中关闭文件流,输出 Excel 文件。

workbook.write();
workbook.close();

接下来给出一个简单的示例说明一下具体实现:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Map"%>
<%@ page import="java.util.List"%>
<%@ page import="jxl.*"%>
<%
    // 相关的数据列表
    List<Map<String, Object>> dataList = (List<Map<String, Object>>) request.getAttribute("dataList");
    // 列表头
    List<String> columnList = (List<String>) request.getAttribute("columnList");

    // 设置response
    response.reset();
    response.setContentType("application/octet-stream");
    response.setHeader("content-disposition", "attachment;filename=export.xls");
    response.setCharacterEncoding("UTF-8");
    // 创建工作簿
    WritableWorkbook workbook = Workbook.createWorkbook(response.getOutputStream());
    // 创建工作表
    WritableSheet sheet = workbook.createSheet("Sheet1", 0);
    // 合并第一行中的前两列
    sheet.mergeCells(0, 0, 1, 0);
    // 合并第一行中的第三列到第五列
    sheet.mergeCells(2, 0, 4, 0);
    // 写入表头内容
    Label label = new Label(0, 0, "表头1");
    sheet.addCell(label);
    Label label2 = new Label(2, 0, "表头2");
    sheet.addCell(label2);
    // 写入数据
    for (int i = 1; i <= dataList.size(); i++) {
        for (int j = 0; j < columnList.size(); j++) {
            Label data = new Label(j, i, dataList.get(i-1).get(columnList.get(j)).toString());
            sheet.addCell(data);
        }
    }
    // 关闭文件
    workbook.write();
    workbook.close();
%>

另外一个更加复杂的实例,请看下面的代码:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Map"%>
<%@ page import="java.util.List"%>
<%@ page import="jxl.*"%>
<%
    // 相关的数据列表
    List<Map<String, Object>> dataList = (List<Map<String, Object>>) request.getAttribute("dataList");
    // 第一级表头数据
    List<String> columnList1 = (List<String>) request.getAttribute("columnList1");
    // 第二级表头数据
    List<String> columnList2 = (List<String>) request.getAttribute("columnList2");
    // 列表头第一级对应列数
    List<Integer> column1Col = (List<Integer>) request.getAttribute("column1Col");
    // 设置response
    response.reset();
    response.setContentType("application/octet-stream");
    response.setHeader("content-disposition", "attachment;filename=export.xls");
    response.setCharacterEncoding("UTF-8");
    // 创建工作簿
    WritableWorkbook workbook = Workbook.createWorkbook(response.getOutputStream());
    // 创建工作表
    WritableSheet sheet = workbook.createSheet("Sheet1", 0);
    // 表头设置
    Map<Integer, Integer> colMap = new HashMap<>();
    int colCount = 0;
    for (int i = 0; i < columnList1.size(); i++) {
        colMap.put(i, colCount);
        sheet.mergeCells(colCount, 0, (colCount + column1Col.get(i) - 1), 0);
        Label label1 = new Label(colCount, 0, columnList1.get(i));
        colCount += column1Col.get(i);
        sheet.addCell(label1);
    }
    for (int i = 0; i < columnList2.size(); i++) {
        Label label2 = new Label(i, 1, columnList2.get(i));
        sheet.addCell(label2);
    }
    // 写入数据
    for (int i = 0; i < dataList.size(); i++) {
        Map<String, Object> dataMap = dataList.get(i);
        for (int j = 0; j < columnList1.size(); j++) {
            List<String> current = (List<String>) dataMap.get(columnList1.get(j));
            for (int k = 0; k < current.size(); k++) {
                Label data = new Label(colMap.get(j) + k, i + 2, current.get(k));
                sheet.addCell(data);
            }
        }
        for (int j = 0; j < columnList2.size(); j++) {
            Label data = new Label(j, i + 2, dataMap.get(columnList2.get(j)).toString());
            sheet.addCell(data);
        }
    }
    // 关闭文件
    workbook.write();
    workbook.close();
%>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Jsp中的table多表头导出excel文件具体实现 - Python技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • Maven项目中resources配置总结

    下面我将详细讲解“Maven项目中resources配置总结”的完整攻略。 一、resources配置概述 在 Maven 中,main 目录中的 resources 目录代表应用程序 resources 路径,resources 目录下的内容会被打包进最终的 JAR 或 WAR 包中,因此在项目中需要合理地进行 resources 的管理。 二、resou…

    Java 2023年5月20日
    00
  • java中 Set与Map排序输出到Writer详解及实例

    概述 Set 与 Map 都是 Java 中常用的集合类型,它们各自有不同的特点和用途。而排序则是对集合中的元素进行按照特定规则的排序,使得输出的结果更加具有可读性和便于理解。本篇文章将详细讲解如何对 Set 和 Map 进行排序,并将最终结果输出到 Writer 中。 Set排序输出到Writer的示例 下面是如何对 Set 进行排序,然后输出到 Writ…

    Java 2023年5月26日
    00
  • Java性能工具JMeter实现上传与下载脚本编写

    完整攻略: Java性能工具JMeter实现上传与下载脚本编写 本教程旨在通过JMeter实现上传与下载功能的性能测试,为此要求读者已经了解如何使用JMeter进行测试。如果您是JMeter新手,请参阅JMeter官方文档以获取更多信息。 步骤1:下载测试文件 为了执行上传和下载脚本的性能测试,我们需要先准备一些测试文件。可以使用wget命令或浏览器下载,务…

    Java 2023年5月19日
    00
  • 史上最简单的MyBatis动态SQL入门示例代码

    以下是针对“史上最简单的MyBatis动态SQL入门示例代码”的完整攻略: 环境搭建 在开始编写示例代码之前,需要先搭建好MyBatis的开发环境。具体步骤如下: 安装Java和Maven,并配置好环境变量。 创建一个Maven项目,在pom.xml中加入MyBatis和MyBatis-Spring依赖。 在resources目录下新建mybatis-con…

    Java 2023年5月19日
    00
  • 详解spring mvc(注解)上传文件的简单例子

    Spring MVC是一种常用的Web框架,它提供了一种方便的方式来处理HTTP请求和响应。在Spring MVC中,我们可以使用注解来处理文件上传。本文将详细讲解“详解Spring MVC(注解)上传文件的简单例子”的完整攻略,并提供两个示例说明。 步骤一:添加依赖 我们需要在pom.xml文件中添加以下依赖: <dependency> &lt…

    Java 2023年5月18日
    00
  • SpringMVC超详细介绍自定义拦截器

    以下是关于“SpringMVC超详细介绍自定义拦截器”的完整攻略,其中包含两个示例。 SpringMVC超详细介绍自定义拦截器 在SpringMVC中,拦截器是一种非常重要的组件,它可以在请求到达控制器方法之前或之后进行一些处理。SpringMVC提供了一种自定义拦截器的方式,本攻略将详细介绍如何自定义拦截器。 自定义拦截器 自定义拦截器需要实现Handle…

    Java 2023年5月16日
    00
  • Sprint Boot @ConditionalOnMissingBean使用方法详解

    @ConditionalOnMissingBean是Spring Boot中的一个注解,它用于根据Spring容器中是否缺少指定的Bean来决定是否启用或禁用某个组件。在使用Spring Boot开发应用程序时,@ConditionalOnMissingBean是非常有用的。本文将详细介绍@ConditionalOnMissingBean的作用和使用方法,并…

    Java 2023年5月5日
    00
  • Java SpringMVC异步处理详解

    以下是关于“Java SpringMVC异步处理详解”的完整攻略,其中包含两个示例。 Java SpringMVC异步处理详解 在Java SpringMVC中,异步处理可以提高Web应用程序的性能和吞吐量。异步处理可以将请求处理过程中的等待时间转换为处理其他请求的时间,从而提高系统的并发处理能力。在SpringMVC中,异步处理可以通过以下两种方式实现: …

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