12、HSSFWorkbook实现多张sheet导出
一、封装一个通用的装载数据的实体类:
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导出的更多相关文章
- 数据库多张表导出到excel
数据库多张表导出到excel public static void export() throws Exception{ //声明需要导出的数据库 String dbName = "hdcl ...
- NPOI大数据量多个sheet导出源码(原)
代码如下: #region NPOI大数据量多个sheet导出 /// <summary> /// 大数据量多个sheet导出 /// </summary> /// <t ...
- HSSFWorkBooK用法 —Excel表的导出和设置
HSSFWorkBooK用法 —Excel表的导出和设置 2013年02月21日 ⁄ 综合 ⁄ 共 9248字 ⁄ 字号 小 中 大 ⁄ 评论关闭 public ActionResult excelP ...
- 将Mysql的一张表导出至Excel格式文件
将Mysql的一张表导出至Excel格式文件 导出语句 进入mysql数据库,输入如下sql语句: select id, name, age from tablename into outfile ' ...
- 超级简单POI多sheet导出Excel实战
本章节主要基于上一章节单sheet导出的基础上进行改造实现多sheet的导出,上一章节参考地址:https://www.cnblogs.com/sunny1009/p/11437005.html 1. ...
- 多张报表导出到一个多sheet页excel
业务需求: 通过勾选不同的报表名称,然后直接执行导出excel.并且这些报表需要统一导入到一个excel的多个sheet页中,并且对某些报表可能需要增加一些类似'已审核'之类的图片(展现时并没有 ...
- HSSFWorkBooK用法 ---Excel表的导出和设置
public ActionResult excelPrint() { HSSFWorkbook workbook = new HSSFWorkbook();// 创建一个Excel文件 HSSFShe ...
- java导出excel单sheet超过65535数据报错拆分多sheet导出
在开发过程中,数据导出excel的功能很常见,数据少,到没问题,一旦超过65535条数据就会报错,因此可以考虑导出多个sheet来解决,代码如下: private static void export ...
- 使用openpyxl复制整张sheet
通过无能的baidu逛了一圈,发现有两三段能用的代码,不过参考之下,发现还有不足的: 不能拷贝有合并格式的sheet.没有拷贝cell的相关格式(填充.边框.对齐)等参数 所以通过bing继续发掘,最 ...
随机推荐
- JuiceFS 元数据引擎选型指南
文件系统是我们常见的存储形式,内部主要由数据和元数据两部分组成.其中数据是文件的具体内容,通常会直接展现给用户:而元数据是描述数据的数据,用来记录文件属性.目录结构.数据存储位置等.一般来说,元数据有 ...
- Mysql知识点整理
索引相关 abcd联合索引搜索ba会走索引么 会,重排 索引的底层实现是B+树,为何不采用红黑树,B树? (1):B+Tree非叶子节点只存储键值信息,降低B+Tree的高度,所有叶子节点之间都有一个 ...
- Vue3 SFC 和 TSX 方式调用子组件中的函数
在开发中会遇到这样的需求:获取子组件的引用,并调用子组件中定义的方法.如封装了一个表单组件,在父组件中需要调用这个表单组件的引用,并调用这个表单组件的校验表单函数或重置表单函数.要实现这个功能,首先要 ...
- 《吐血整理》高级系列教程-吃透Fiddler抓包教程(29)-Fiddler如何抓取Android7.0以上的Https包-终篇
1.简介 上一篇宏哥介绍的Xposed是一款可以在不修改APK的情况下影响程序运行的框架.可以编写并加载自己编写的插件app,实现对目标apk的注入.拦截等.一般研究移动安全的都会使用Xposed. ...
- [WPF] 抄抄超强的苹果官网滚动文字特效实现
1. 前言 今天 ChokCoco 大佬发布了一篇博客 超强的苹果官网滚动文字特效实现,iPhone 我是买不起的,但不妨碍我对抄特效感兴趣,正好我这周安排的工作已经完成了,于是有空练练手实现了一个 ...
- 2.CBV和类视图as_view源码解析
一.FBV和CBV # 视图基于函数开发 FBV: function.base.views # 视图基于类开发 CBV: class .base .views #Python是一个面向对象的编程语言, ...
- windows和虚拟机上的Ubuntu互传文件
1.简介 本文讲述的是通过ssh登录虚拟机上的Ubuntu系统,实现互传文件 2.Ubuntu端 2.1.安装ssh sudo apt-get update sudo apt-get install ...
- k8s机器群扩容问题
今天遇到了一个很奇葩的问题.公司新人吧k8s集权扩容完后,发现服务器上的磁盘没有做分区2T磁盘没有做任何动作 把两台slave节点扩容上去的节点弄到了/目录.由于是生产环境情况比较特殊并没通过kube ...
- Pandas常用方法
数据处理很多需要用到pandas,有两个基本类型:Series表示一维数据,DataFrame表示多维.以下是一些常用方法的整理: pandas.Series 创建 Series pandas.Ser ...
- 现代 CSS 指南 -- at-rule 规则扫盲
大部分同学都用过 CSS 的屏幕宽度媒体查询,像是这样: @media screen and (min-width: 900px) { div { padding: 1rem 3rem; } } 这里 ...