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

yizhihongxing

首先,需要使用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日

相关文章

  • java异常处理throws完成异常抛出详解

    Java异常处理:throws完成异常抛出详解 在Java编程中,异常处理是一个非常重要的知识点。而在进行异常处理时,throws关键字的使用也是一种常见的方式。本文将为您详细讲解使用throws关键字完成异常抛出的过程以及注意事项。 1. 异常处理的三种方式 在Java中,异常处理可以通过三种方式来完成: try-catch块:用于捕捉并处理异常。 thr…

    Java 2023年5月27日
    00
  • JSP之表单提交get和post的区别详解及实例

    JSP之表单提交get和post的区别详解及实例 在JSP中,表单可以使用get和post两种方法提交。本攻略将详细讲述两种方法的区别以及使用实例。 GET和POST的区别 GET方法将数据追加在URL末尾,而POST方法将数据放在HTTP请求的正文中。因此,使用GET方法提交的数据将被显示在URL中,而POST方法提交的数据不会在URL中显示。 由于数据被…

    Java 2023年6月15日
    00
  • java打印表格 将ResultSet中的数据打印成表格问题

    要将ResultSet中的数据打印成表格,我们可以采用以下步骤: 使用 ResultSetMetaData 获取结果集中的列信息,包括列名、列数据类型、列数等信息; 将列信息拼接成表头; 遍历 ResultSet,将每一行数据拼接成一行表格数据,并将所有行拼接成完整的表格; 使用 System.out.println() 或其他输出方式将表头和表格输出到控制…

    Java 2023年5月26日
    00
  • js前台分页显示后端JAVA数据响应

    为了在前台进行分页显示后端Java数据响应,我们需要进行以下步骤: 后端Java代码编写 首先,在后端Java代码中,需要完成以下任务: 获取数据库中的数据。 按照前台请求的分页大小和页码数,对数据进行分页。 将分页后的数据封装成JSON格式的数据,传递给前端。 这些任务可以通过使用Spring Boot框架和MyBatis ORM完成。 举个例子,示例代码…

    Java 2023年6月15日
    00
  • dl、dt、dd 标记来改造163邮箱的广告条

    如果想要改造网页上的广告条,可以使用HTML中的dl、dt、dd标记来达到目的。下面是详细的攻略: 1.使用dl、dt、dd标记 dl标记用于定义一个描述列表(description list),dt标记用于定义列表项中的项目名称(即定义术语或名称),dd标记用于定义项目的描述。可以使用这些标记分别定义广告条的标题、说明和一个链接。 2.示例一 下面是一个针…

    Java 2023年6月15日
    00
  • 浅谈SpringBoot项目如何让前端开发提高效率(小技巧)

    下面详细讲解一下“浅谈SpringBoot项目如何让前端开发提高效率(小技巧)”的攻略。 前言 开发SpringBoot项目有很多小技巧和工具可以帮助我们提高开发效率,其中比较重要的一点就是前端开发。本文将介绍如何在SpringBoot项目中使用一些小技巧,通过优化开发环境来提高前端开发效率。 正文 1. 静态资源缓存 静态资源(如图片、CSS和JS文件)是…

    Java 2023年5月19日
    00
  • Java超详细精讲数据结构之bfs与双端队列

    Java超详细精讲数据结构之bfs与双端队列 什么是BFS? BFS 是一种广度优先搜索的算法,与其对应的是 DFS (深度优先搜索) 算法。 BFS 的思想是从一个起始状态开始,一层一层向外扩散,直到扩散到目标状态为止。 具体的实现方式是使用队列来存储要扩散的状态,在每次扩散时,先将队首元素出队,然后将该状态的所有子状态入队。入队的操作会保证每个状态只被扩…

    Java 2023年5月19日
    00
  • 必须要学会的JMM与volatile

    下面我为你详细讲解必须要学会的JMM与volatile的完整攻略。 JMM介绍 JMM(Java Memory Model)即Java内存模型,用于规范Java程序中线程对共享变量的操作。JMM为Java程序中的线程提供可见性、有序性、原子性等保证,从而提高程序并发性能。 JMM提供的保证 可见性: 一个线程修改了共享变量的值,这个值的变化对其他线程是可见的…

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