首先,需要使用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技术站