转载自

一、封装一个通用的装载数据的实体类:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
import java.util.Map; @Data
@AllArgsConstructor
@NoArgsConstructor
public class ExcelDataVo implements Serializable {
/**
* excel sheet的名称
*/
private String sheetName; /**
* excel sheet表的标题
*/
private String sheetTopColHeaderTitle; /**
* excel sheet表的列头名称
*/
private String[] sheetTopColHeaderName; /**
* excel sheet表的列头属性
*/
private String[] sheetTopColHeaderAttribute; /**
* excel sheet表的数据
*/
private List<Map<String, Object>> sheetDataList;
}

二、通用数据处理的工具类:

import com.yfh.common.core.domain.ExcelDataVo;
import com.yfh.common.core.exception.BaseException;
import org.apache.poi.hssf.usermodel.*; import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; public class PackExcelSheetsDataUtil {
/*
* 封装需要导出的数据
* */
public void packExcelSheetsData(HttpServletResponse response, String excelName, List<ExcelDataVo> excelDataVoList) throws Exception{
try {
// 对excel进行判断
for(int j = 0; j < excelDataVoList.size(); j++){
String[] headerName = excelDataVoList.get(j).getSheetTopColHeaderName();
String[] headerAttribute = excelDataVoList.get(j).getSheetTopColHeaderAttribute();
if(headerName.length != headerAttribute.length){
throw new BaseException("列头长度与属性长度不对应!");
}
} // 创建一个excel对象
HSSFWorkbook workbook = new HSSFWorkbook();
OutputStream out = response.getOutputStream(); //定义标题以及设置响应头信息
response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(excelName+".xls", "UTF-8")); // 循环生成指定数量的sheet表
for(int j = 0; j < excelDataVoList.size(); j++){
// 获取单个sheet的数据
String sheetName = excelDataVoList.get(j).getSheetName();
String sheetTopColHeaderTitle = excelDataVoList.get(j).getSheetTopColHeaderTitle();
String[] headers = excelDataVoList.get(j).getSheetTopColHeaderName();
String[] headerCol = excelDataVoList.get(j).getSheetTopColHeaderAttribute();
List<Map<String, Object>> sheetDataList = excelDataVoList.get(j).getSheetDataList(); // 申请一个最后的list集合并封装数据
List<Object[]> dataList = new ArrayList<Object[]>();
Object[] objs = null;
for(int i = 0; i < sheetDataList.size(); i++){
// 封装lie数据
objs = new Object[headers.length];
for (int k = 0; k < headers.length; k++) {
objs[k] = sheetDataList.get(i).get(headerCol[k]);
} //数据添加到excel表格
dataList.add(objs);
} //使用流将数据导出
new ExcelSheetsUtil(sheetName, sheetTopColHeaderTitle, headers, dataList).export(workbook);
} // 最后将整个excel全部写到浏览器
workbook.write(out);
out.flush();
out.close();
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

三、通用导出的工具类:

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import java.util.List; public class ExcelSheetsUtil { //导出表的列名
private String[] rowName; //导出表的头部标题
private String oneheaders; //sheet表表名
private String sheettitle; // 需要导出的数据集合
private List<Object[]> dataList; /**
* @param sheettitle 单个sheet名称
* @param oneheaders 单个sheet头部名称
* @param rowName 单个sheet对应的列头
* @param dataList 单个sheet对应的数据
*/
public ExcelSheetsUtil(String sheettitle, String oneheaders, String[] rowName, List<Object[]> dataList){
this.dataList = dataList;
this.oneheaders = oneheaders;
this.rowName = rowName;
this.sheettitle = sheettitle;
} /*
* 导出数据
* */
public void export(HSSFWorkbook workbook) throws Exception{
try{
// 创建工作表
HSSFSheet sheet = workbook.createSheet(sheettitle); //获取列头样式对象
HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook); //单元格样式对象
HSSFCellStyle style = this.getStyle(workbook); //第一行
HSSFRow rowfirstName = sheet.createRow(0);
//创建列头对应个数的单元格
HSSFCell oneCellRowName = rowfirstName.createCell(0);
//设置列头单元格的数据类型
oneCellRowName.setCellType(CellType.STRING);
HSSFRichTextString onetext = new HSSFRichTextString(oneheaders);
//设置列头单元格的值
oneCellRowName.setCellValue(onetext);
//合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列
sheet.addMergedRegion(new CellRangeAddress(0,0,0, rowName.length - 1));
//设置列头单元格样式
oneCellRowName.setCellStyle(columnTopStyle); // 定义所需列数
int columnNum = rowName.length; /*** 绑定列头 ****/
// 在索引2的位置创建行(最顶端的行开始的第二行)
HSSFRow rowRowName = sheet.createRow(1);
//单元格样式对象
HSSFCellStyle styleHearer = this.getStyle(workbook);
Font headerFont = workbook.createFont();
headerFont.setFontName("微软雅黑");
headerFont.setFontHeightInPoints((short) 10);
headerFont.setBold(true);
headerFont.setColor(IndexedColors.BLACK.getIndex());
styleHearer.setFont(headerFont);
for(int n = 0; n < columnNum; n++){
//创建列头对应个数的单元格
HSSFCell cellRowName = rowRowName.createCell(n);
//设置列头单元格的数据类型
cellRowName.setCellType(CellType.STRING);
HSSFRichTextString text = new HSSFRichTextString(rowName[n]);
//设置列头单元格的值
cellRowName.setCellValue(text);
//设置列头单元格样式
cellRowName.setCellStyle(styleHearer);
} /*** 绑定数据 ****/
//将查询出的数据设置到sheet对应的单元格中
for(int i=0;i<dataList.size();i++){
Object[] obj = dataList.get(i);
//创建所需的行数(从第二行开始写数据)
HSSFRow row = sheet.createRow(i+2);
for(int j = 0; j < obj.length; j++){
//设置单元格的数据类型
HSSFCell cell = row.createCell(j, CellType.STRING);;
if(!"".equals(obj[j]) && obj[j] != null){
//设置单元格的值
cell.setCellValue(obj[j].toString());
}
//设置单元格样式
cell.setCellStyle(style);
}
} /*** 让列宽随着导出的列长自动适应 ****/
for (int colNum = 0; colNum < columnNum; colNum++) {
int columnWidth = sheet.getColumnWidth(colNum) / 256;
for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
HSSFRow currentRow;
//当前行未被使用过
if (sheet.getRow(rowNum) == null) {
currentRow = sheet.createRow(rowNum);
} else {
currentRow = sheet.getRow(rowNum);
}
if (currentRow.getCell(colNum) != null) {
HSSFCell currentCell = currentRow.getCell(colNum);
if (currentCell.getCellType() == CellType.STRING) {
int length = 0;
try {
length = currentCell.getStringCellValue().getBytes().length;
} catch (Exception e) {
e.printStackTrace();
} if (columnWidth < length) {
columnWidth = length;
}
}
}
}
if(colNum == 0){
sheet.setColumnWidth(colNum, (columnWidth-2) * 256);
}else{
sheet.setColumnWidth(colNum, (columnWidth+4) * 256);
}
}
}catch(Exception e){
e.printStackTrace();
}
} /*
* 列头单元格样式
*/
public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook) {
// 设置字体
HSSFFont font = workbook.createFont();
//设置字体大小
font.setFontHeightInPoints((short)11);
//字体加粗
//font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//设置字体名字
font.setFontName("宋体");
//设置样式;
HSSFCellStyle style = workbook.createCellStyle();
//在样式用应用设置的字体;
style.setFont(font);
//设置自动换行;
style.setWrapText(false);
//设置水平对齐的样式为居中对齐;
style.setAlignment(HorizontalAlignment.CENTER);
//设置垂直对齐的样式为居中对齐;
style.setVerticalAlignment(VerticalAlignment.CENTER);
return style;
} /*
* 列数据信息单元格样式
*/
public HSSFCellStyle getStyle(HSSFWorkbook workbook) {
// 设置字体
HSSFFont font = workbook.createFont();
//设置字体名字
font.setFontName("宋体");
//设置样式;
HSSFCellStyle style = workbook.createCellStyle();
//设置底边框;
style.setBorderBottom(BorderStyle.THIN);
//设置底边框颜色;
style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
//设置左边框;
style.setBorderLeft(BorderStyle.THIN);
//设置左边框颜色;
style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
//设置右边框;
style.setBorderRight(BorderStyle.THIN);
//设置右边框颜色;
style.setRightBorderColor(IndexedColors.BLACK.getIndex());
//设置顶边框;
style.setBorderTop(BorderStyle.THIN);
//设置顶边框颜色;
style.setTopBorderColor(IndexedColors.BLACK.getIndex());
//在样式用应用设置的字体;
style.setFont(font);
//设置自动换行;
style.setWrapText(false);
//设置水平对齐的样式为居中对齐;
style.setAlignment(HorizontalAlignment.CENTER);
//设置垂直对齐的样式为居中对齐;
style.setVerticalAlignment(VerticalAlignment.CENTER);
return style;
}
}

四、测试多表导出:

    /**
* 测试多个导出sheet
*/
@ApiOperation(value = "测试多个导出sheet", notes = "测试多个导出sheet", httpMethod = "GET")
@RequestMapping(value = "/exportTeenagerMoreSheet", method = RequestMethod.GET)
public void exportTeenagerMoreSheet(HttpServletResponse response){
// 定义学生信息
List<Map<String, Object>> list1 = Lists.newArrayList();
for (int i = 0; i < 3; i++) {
Map<String, Object> map1 = Maps.newHashMap();
map1.put("name", "张三"+i);
map1.put("sex", "男"+i);
map1.put("age", "23"+i);
map1.put("isSchool", "是"+i);
list1.add(map1);
} // 定义学校信息
List<Map<String, Object>> list2 = Lists.newArrayList();
for (int i = 0; i < 4; i++) {
Map<String, Object> map2 = Maps.newHashMap();
map2.put("name", "杭州天长小学"+i);
map2.put("adress", "浙江省杭州市"+i);
map2.put("concat", "王五"+i);
list2.add(map2);
} // 定义其他信息
List<Map<String, Object>> list3 = Lists.newArrayList();
for (int i = 0; i < 10; i++) {
Map<String, Object> map3 = Maps.newHashMap();
map3.put("protity", "其他1"+i);
map3.put("remark", "我是备注"+i);
list3.add(map3);
} // 封装需要导出的数据
List<ExcelDataVo> excelDataVoList = Lists.newArrayList(); // 封装学生信息
ExcelDataVo excelDataSheetOne = new ExcelDataVo();
excelDataSheetOne.setSheetName("学生信息");
excelDataSheetOne.setSheetTopColHeaderTitle("学生信息");
excelDataSheetOne.setSheetTopColHeaderName(new String[] {"姓名","性别","年龄", "学生"});
excelDataSheetOne.setSheetTopColHeaderAttribute(new String[] {"name","sex","age", "isSchool"});
excelDataSheetOne.setSheetDataList(list1);
excelDataVoList.add(excelDataSheetOne); // 封装学校信息
ExcelDataVo excelDataSheetTwo = new ExcelDataVo();
excelDataSheetTwo.setSheetName("学校信息");
excelDataSheetTwo.setSheetTopColHeaderTitle("学校信息");
excelDataSheetTwo.setSheetTopColHeaderName(new String[] {"学校","地址","联系人"});
excelDataSheetTwo.setSheetTopColHeaderAttribute(new String[] {"name","adress","concat"});
excelDataSheetTwo.setSheetDataList(list2);
excelDataVoList.add(excelDataSheetTwo); // 封装其他信息
ExcelDataVo excelDataSheetThree = new ExcelDataVo();
excelDataSheetThree.setSheetName("其他信息");
excelDataSheetThree.setSheetTopColHeaderTitle("其他信息");
excelDataSheetThree.setSheetTopColHeaderName(new String[] {"描述","备注"});
excelDataSheetThree.setSheetTopColHeaderAttribute(new String[] {"protity","remark"});
excelDataSheetThree.setSheetDataList(list3);
excelDataVoList.add(excelDataSheetThree); // 导出数据
try {
new PackExcelSheetsDataUtil().packExcelSheetsData(response, "学生基础信息", excelDataVoList);
} catch (Exception e) {
throw new BaseException("导出异常!");
}
}

12、HSSFWorkbook实现多张sheet导出的更多相关文章

  1. 数据库多张表导出到excel

    数据库多张表导出到excel public static void export() throws Exception{ //声明需要导出的数据库 String dbName = "hdcl ...

  2. NPOI大数据量多个sheet导出源码(原)

    代码如下: #region NPOI大数据量多个sheet导出 /// <summary> /// 大数据量多个sheet导出 /// </summary> /// <t ...

  3. HSSFWorkBooK用法 —Excel表的导出和设置

    HSSFWorkBooK用法 —Excel表的导出和设置 2013年02月21日 ⁄ 综合 ⁄ 共 9248字 ⁄ 字号 小 中 大 ⁄ 评论关闭 public ActionResult excelP ...

  4. 将Mysql的一张表导出至Excel格式文件

    将Mysql的一张表导出至Excel格式文件 导出语句 进入mysql数据库,输入如下sql语句: select id, name, age from tablename into outfile ' ...

  5. 超级简单POI多sheet导出Excel实战

    本章节主要基于上一章节单sheet导出的基础上进行改造实现多sheet的导出,上一章节参考地址:https://www.cnblogs.com/sunny1009/p/11437005.html 1. ...

  6. 多张报表导出到一个多sheet页excel

     业务需求: 通过勾选不同的报表名称,然后直接执行导出excel.并且这些报表需要统一导入到一个excel的多个sheet页中,并且对某些报表可能需要增加一些类似'已审核'之类的图片(展现时并没有 ...

  7. HSSFWorkBooK用法 ---Excel表的导出和设置

    public ActionResult excelPrint() { HSSFWorkbook workbook = new HSSFWorkbook();// 创建一个Excel文件 HSSFShe ...

  8. java导出excel单sheet超过65535数据报错拆分多sheet导出

    在开发过程中,数据导出excel的功能很常见,数据少,到没问题,一旦超过65535条数据就会报错,因此可以考虑导出多个sheet来解决,代码如下: private static void export ...

  9. 使用openpyxl复制整张sheet

    通过无能的baidu逛了一圈,发现有两三段能用的代码,不过参考之下,发现还有不足的: 不能拷贝有合并格式的sheet.没有拷贝cell的相关格式(填充.边框.对齐)等参数 所以通过bing继续发掘,最 ...

随机推荐

  1. Linux 下模拟制作块设备并挂载

    Linux 下模拟制作块设备并挂载 作者:Grey 原文地址: 博客园:Linux 下模拟制作块设备并挂载 CSDN:Linux 下模拟制作块设备并挂载 环境 CentOS-7 下载地址:下载 Cen ...

  2. 齐博x1标签动态调用数据

    示例代码如下: {qb:tag name="news_list_page_listdata02" type="cms" union="fid" ...

  3. Android掌控WiFi不完全指南

    前言 如果想要对针对WiFi的攻击进行监测,就需要定期获取WiFi的运行状态,例如WiFi的SSID,WiFi强度,是否开放,加密方式等信息,在Android中通过WiFiManager来实现 WiF ...

  4. CJK备注

    pip清华镜像库 :pip install XXX -i https://pypi.tuna.tsinghua.edu.cn/simple pip阿里巴巴镜像库:pip install XXX -i ...

  5. 二十四、PV与PVC介绍

    PV 与 PVC介绍 一.概念介绍 ​PersistentVolume (PV) 是由管理员设置的存储,它是群集的一部分.就像节点是集群中的资源一样,PV 也是集群中的资源. PV 是Volume 之 ...

  6. 现代GPGPU 架构汇总

    本篇是GPGPU 架构汇总的总章,参考的是AMD公布OpenCL 手册,该手册总结了AMD. Nvdia 早年的GPGPU体系架构,以及Opencl 各个API 与硬件结构的映射关系.本篇除了整理这两 ...

  7. Python基础之函数:5、内置函数、迭代器对象、异常的捕获和处理

    目录 一.重要内置函数 1.zip() 2.filter() 3.sorted() 二.常见内置函数 1. abs() 2.all.any() 3.bin.oct.hex.int() 4.bytes( ...

  8. java学习之springboot

    0x00前言 呀呀呀时隔好久我又来做笔记了,上个月去大型保密活动了,这里在网上看了一些教程如果说不是去做java开发我就不做ssm的手动整合了采用springboot去一并开发. Spring Boo ...

  9. 使用kubeadm方式搭建K8S集群

    使用kubeadm方式搭建K8S集群 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Ma ...

  10. 2022春每日一题:Day 37

    题目:[USACO14FEB]Auto-complete S 字典树套路题,字典树优化剪枝,加个cnt标记即可 代码: #include <cstdio> #include <cst ...