本文介绍阿里巴巴导出工具easyexcell导出excell

介绍一下几种导出情况

1,导出单个sheet,无模型方式

2,导出单个sheet,模型方式

3,导出多个sheet,无模型方式

4,导出多个sheet,模型方式

5,导出多个sheet,到本地指定目录下

以上导出方式区别

1,(1-4)自动下载到c盘默认路径并创建文件;方式5,下载到指定目录及文件下

区别在于输出流的的创建

2,无模型方式,模型方式区别

2.1,前者不需要定义导出实体类,手动封装数表头信息及导出数据

且封装表头数据方式有两种,sheet和table

1)sheet

封装表头

  Sheet sheetMing = new Sheet(1, 0);sheetMing.setSheetName("沈明内购方案信息");//设置列List<List<String>> titlesMing = new ArrayList<>();titlesMing.add(Arrays.asList("方案编号"));titlesMing.add(Arrays.asList("主机厂"));titlesMing.add(Arrays.asList("方案名称"));titlesMing.add(Arrays.asList("可购品牌"));titlesMing.add(Arrays.asList("可购车型"));titlesMing.add(Arrays.asList("附件"));titlesMing.add(Arrays.asList("状态"));titlesMing.add(Arrays.asList("备注"));titlesMing.add(Arrays.asList("审批人"));titlesMing.add(Arrays.asList("审批时间"));titlesMing.add(Arrays.asList("审批意见"));titlesMing.add(Arrays.asList("创建人"));titlesMing.add(Arrays.asList("创建时间"));titlesMing.add(Arrays.asList("修改人"));titlesMing.add(Arrays.asList("修改日期"));sheetMing.setHead(titlesMing);

注意表头每一列用List<String>包装,setHead()入参是表头集合的集合

  public void setHead(List<List<String>> head) {this.head = head;}

封装数据

  List<List<String>> dataMing = new ArrayList<>();for (PlanVO object : listMing) {List<String> list = new ArrayList<>();list.add(object.getCode());list.add(object.getBrandName());list.add(object.getName());list.add(object.getBrandNameList());list.add(object.getVehicleTypeName());list.add(object.getFileName().toString());list.add(object.getStatusName());list.add(object.getDescription());list.add(object.getApprovalUser());list.add(DateUtil.getNormTime(object.getApprovalTime()));list.add(object.getApprovalResult());list.add(object.getCreateUser());list.add(DateUtil.getNormTime(object.getCreateTime()));list.add(object.getUpdateUser());list.add(DateUtil.getNormTime(object.getUpdateTime()));dataMing.add(list);}

写入导出数据

  public ExcelWriter write0(List<List<String>> data, Sheet sheet, Table table) {excelBuilder.addContent(data, sheet, table);return this;}

2) table

 private void excellReport(List<PlanVO> planVO, HttpServletResponse servletResponse) {ExcelWriter writer = new ExcelWriter(getOutputStream("已发布内购方案", servletResponse), ExcelTypeEnum.XLSX);//设置SHEETSheet sheet = new Sheet(1, 0);sheet.setSheetName("sheet1");//设置列Table table = new Table(1);List<List<String>> titles = new ArrayList<>();titles.add(Arrays.asList("方案编号"));titles.add(Arrays.asList("主机厂"));titles.add(Arrays.asList("方案名称"));titles.add(Arrays.asList("可购品牌"));titles.add(Arrays.asList("可购车型"));titles.add(Arrays.asList("附件"));titles.add(Arrays.asList("状态"));titles.add(Arrays.asList("备注"));titles.add(Arrays.asList("审批人"));titles.add(Arrays.asList("审批时间"));titles.add(Arrays.asList("审批意见"));titles.add(Arrays.asList("创建人"));titles.add(Arrays.asList("创建时间"));titles.add(Arrays.asList("修改人"));titles.add(Arrays.asList("修改日期"));table.setHead(titles);// 封装数据List<List<String>> userList = new ArrayList<>();for (PlanVO object : planVO) {List<String> list = new ArrayList<>();list.add(object.getCode());list.add(object.getBrandName());list.add(object.getName());list.add(object.getBrandNameList());list.add(object.getVehicleTypeName());list.add(object.getFileName().toString());list.add(object.getStatusName());list.add(object.getDescription());list.add(object.getApprovalUser());list.add(DateUtil.getNormTime(object.getApprovalTime()));list.add(object.getApprovalResult());list.add(object.getCreateUser());list.add(DateUtil.getNormTime(object.getCreateTime()));list.add(object.getUpdateUser());list.add(DateUtil.getNormTime(object.getUpdateTime()));userList.add(list);}writer.write0(userList, sheet, table);writer.finish();}

写入数据调用方法

 public ExcelWriter write0(List<List<String>> data, Sheet sheet, Table table) {excelBuilder.addContent(data, sheet, table);return this;}

2.2,后者需要定义导出实体类,指定表头及顺序

实体类

@EqualsAndHashCode(callSuper = true)
@Data
public class TableHeaderExcelProperty extends BaseRowModel {/*** value: 表头名称* index: 列的号, 0表示第一列*/@ExcelProperty(value = "姓名", index = 0)private String name;@ExcelProperty(value = "年龄", index = 1)private int age;@ExcelProperty(value = "学校", index = 2)private String school;}

调用方法

 public ExcelWriter write(List<? extends BaseRowModel> data, Sheet sheet) {excelBuilder.addContent(data, sheet);return this;}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------上面大概介绍了一下,下面详细介绍每一种方式

一,导出单个sheet,无模型方式

sheet封装表头

  private void excellReport(List<PlanVO> planVO, HttpServletResponse servletResponse) {ExcelWriter writer = new ExcelWriter(getOutputStream("已发布内购方案", servletResponse), ExcelTypeEnum.XLSX);//设置SHEETSheet sheet = new Sheet(1, 0);sheet.setSheetName("sheet1");//设置列Table table = new Table(1);List<List<String>> titles = new ArrayList<>();titles.add(Arrays.asList("方案编号"));titles.add(Arrays.asList("主机厂"));titles.add(Arrays.asList("方案名称"));titles.add(Arrays.asList("可购品牌"));titles.add(Arrays.asList("可购车型"));titles.add(Arrays.asList("附件"));titles.add(Arrays.asList("状态"));titles.add(Arrays.asList("备注"));titles.add(Arrays.asList("审批人"));titles.add(Arrays.asList("审批时间"));titles.add(Arrays.asList("审批意见"));titles.add(Arrays.asList("创建人"));titles.add(Arrays.asList("创建时间"));titles.add(Arrays.asList("修改人"));titles.add(Arrays.asList("修改日期"));table.setHead(titles);// 封装数据List<List<String>> userList = new ArrayList<>();for (PlanVO object : planVO) {List<String> list = new ArrayList<>();list.add(object.getCode());list.add(object.getBrandName());list.add(object.getName());list.add(object.getBrandNameList());list.add(object.getVehicleTypeName());list.add(object.getFileName().toString());list.add(object.getStatusName());list.add(object.getDescription());list.add(object.getApprovalUser());list.add(DateUtil.getNormTime(object.getApprovalTime()));list.add(object.getApprovalResult());list.add(object.getCreateUser());list.add(DateUtil.getNormTime(object.getCreateTime()));list.add(object.getUpdateUser());list.add(DateUtil.getNormTime(object.getUpdateTime()));userList.add(list);}writer.write0(userList, sheet, table);writer.finish();}

创建输出流

 /*** 导出文件时为Writer生成OutputStream*/private static OutputStream getOutputStream(String fileName, HttpServletResponse response) {//创建本地文件String filePath = fileName + ".xlsx";File dbfFile = new File(filePath);try {if (!dbfFile.exists() || dbfFile.isDirectory()) {dbfFile.createNewFile();}fileName = new String(filePath.getBytes(), "ISO-8859-1");response.addHeader("Content-Disposition", "filename=" + fileName);return response.getOutputStream();} catch (IOException e) {throw new ExcelException("创建文件失败!");}}

二,导出单个sheet,模型方式

 @org.junit.Testpublic void writeWithTemplate() {String filePath = "D:\\share\\model.xlsx";List<TableHeaderExcelProperty> data = new ArrayList<>();for (int i = 0; i < 2; i++) {TableHeaderExcelProperty tableHeaderExcelProperty = new TableHeaderExcelProperty();tableHeaderExcelProperty.setName("cmj" + i);tableHeaderExcelProperty.setAge(22 + i);tableHeaderExcelProperty.setSchool("清华大学" + i);data.add(tableHeaderExcelProperty);}ExcelUtil.writeWithTemplate(filePath, data);}

详细方法见工具类

三,导出多个sheet,无模型方式和有模型方式

效果图

 Controller

    /*** 导出多个sheet 且表头,内容不同* 无模型方式* @param servletResponse* @param request*/@RequestMapping(value = "/export/duogeSheet")@LoggerManage(description = "导出多个sheet")public void exportDuogeSheet(HttpServletResponse servletResponse, BaseRequestModel request) {try {excelDemoSercice.exportDuogeSheet(servletResponse, request);} catch (Exception e) {e.printStackTrace();}}/*** 导出多个sheet 且表头,内容不同* 有模型方式* @param servletResponse*/@RequestMapping(value = "/export/duogeSheetModel")@LoggerManage(description = "导出多个sheet,模型方式")public void exportDuogeSheetModel(HttpServletResponse servletResponse) {try {excelDemoSercice.exportDuogeSheetModel(servletResponse);} catch (Exception e) {e.printStackTrace();}}

serviceImpl

/*** 无模型方式导出数据* @param servletResponse* @param request*/public void exportDuogeSheet(HttpServletResponse servletResponse, BaseRequestModel request) {// 查询数据shenmingList<PlanVO> listMing = queryDataMing(request);// 查询数据-其他List<PlanVO> listOther = queryData(request);ExcelWriter writer = new ExcelWriter(getOutputStream("已发布内购方案+购车方案", servletResponse), ExcelTypeEnum.XLSX);//内购方案-----------//设置SHEETSheet sheetMing = new Sheet(1, 0);sheetMing.setSheetName("沈明内购方案信息");//设置列List<List<String>> titlesMing = new ArrayList<>();titlesMing.add(Arrays.asList("方案编号"));titlesMing.add(Arrays.asList("主机厂"));titlesMing.add(Arrays.asList("方案名称"));titlesMing.add(Arrays.asList("可购品牌"));titlesMing.add(Arrays.asList("可购车型"));titlesMing.add(Arrays.asList("附件"));titlesMing.add(Arrays.asList("状态"));titlesMing.add(Arrays.asList("备注"));titlesMing.add(Arrays.asList("审批人"));titlesMing.add(Arrays.asList("审批时间"));titlesMing.add(Arrays.asList("审批意见"));titlesMing.add(Arrays.asList("创建人"));titlesMing.add(Arrays.asList("创建时间"));titlesMing.add(Arrays.asList("修改人"));titlesMing.add(Arrays.asList("修改日期"));sheetMing.setHead(titlesMing);// 封装数据List<List<String>> dataMing = new ArrayList<>();for (PlanVO object : listMing) {List<String> list = new ArrayList<>();list.add(object.getCode());list.add(object.getBrandName());list.add(object.getName());list.add(object.getBrandNameList());list.add(object.getVehicleTypeName());list.add(object.getFileName().toString());list.add(object.getStatusName());list.add(object.getDescription());list.add(object.getApprovalUser());list.add(DateUtil.getNormTime(object.getApprovalTime()));list.add(object.getApprovalResult());list.add(object.getCreateUser());list.add(DateUtil.getNormTime(object.getCreateTime()));list.add(object.getUpdateUser());list.add(DateUtil.getNormTime(object.getUpdateTime()));dataMing.add(list);}// 购车申请//设置SHEETSheet sheetOther = new Sheet(2, 0);sheetOther.setSheetName("其他用户内购方案信息");//设置列List<List<String>> titlesOther = new ArrayList<>();titlesOther.add(Arrays.asList("方案编号1"));titlesOther.add(Arrays.asList("主机厂1"));titlesOther.add(Arrays.asList("方案名称1"));titlesOther.add(Arrays.asList("可购品牌1"));titlesOther.add(Arrays.asList("可购车型1"));titlesOther.add(Arrays.asList("附件1"));titlesOther.add(Arrays.asList("状态1"));titlesOther.add(Arrays.asList("备注1"));titlesOther.add(Arrays.asList("审批人1"));titlesOther.add(Arrays.asList("审批时间1"));titlesOther.add(Arrays.asList("审批意见1"));titlesOther.add(Arrays.asList("创建人1"));titlesOther.add(Arrays.asList("创建时间1"));titlesOther.add(Arrays.asList("修改人1"));titlesOther.add(Arrays.asList("修改日期1"));sheetOther.setHead(titlesOther);// 封装数据List<List<String>> dataOther = new ArrayList<>();for (PlanVO object : listOther) {List<String> list = new ArrayList<>();list.add(object.getCode());list.add(object.getBrandName());list.add(object.getName());list.add(object.getBrandNameList());list.add(object.getVehicleTypeName());list.add(object.getFileName().toString());list.add(object.getStatusName());list.add(object.getDescription());list.add(object.getApprovalUser());list.add(DateUtil.getNormTime(object.getApprovalTime()));list.add(object.getApprovalResult());list.add(object.getCreateUser());list.add(DateUtil.getNormTime(object.getCreateTime()));list.add(object.getUpdateUser());list.add(DateUtil.getNormTime(object.getUpdateTime()));dataOther.add(list);}writer.write0(dataMing, sheetMing);writer.write0(dataOther, sheetOther);writer.finish();}/*** 沈明查询导出数据** @param request* @return*/public List<PlanVO> queryDataMing(BaseRequestModel request) {// PlanVO vo = JSON.parseObject(request.getReqData().toString(), PlanVO.class);// TestPlanVO vo = new PlanVO();//vo.setBrandId(Long.parseLong("100"));vo.setStatus(PlanStatusE.PUBLISHED.getValue());List<PlanVO> list = planMapper.selectPlanByStatus(vo);List<Map<String, Object>> isDelDict = DictUtils.getDictListByCode(DictTypeE.IS_DEL_CODE.getTypeCode());List<Map<String, Object>> statusDict = DictUtils.getDictListByCode(DictTypeE.PLAN_STATUS.getTypeCode());list.forEach(v -> {v.setIsDelName(DictUtils.getDictKeyByValue(v.getIsDel(), isDelDict));v.setStatusName(DictUtils.getDictKeyByValue(v.getStatus(), statusDict));// 附件Map<String, Object> map = new HashMap<>();PlanFileEntity planFileEntity = new PlanFileEntity();planFileEntity.setPlanId(v.getId());planFileEntity.setIsDel(DeleteStatusE.USEFUL.getValue());List<PlanFileEntity> pfList = planFileMapper.select(planFileEntity);List<String> files = new ArrayList<>();pfList.forEach(f -> {files.add(f.getFileName());});v.setFileName(files);map.put("file", pfList);v.setMap(map);});return list;}public List<PlanVO> queryData(BaseRequestModel request) {//PlanVO vo = JSON.parseObject(request.getReqData().toString(), PlanVO.class);// TestPlanVO vo = new PlanVO();vo.setBrandId(Long.parseLong("99"));Integer userType = 0;Long belongTo = Long.valueOf("754");Integer page = 0;Integer size = 2147483647;/*  Integer userType = request.getUserType();Long belongTo = request.getBelongTo();*/List<PlanVO> planVOList = new ArrayList<>();List<Long> branIdList = new ArrayList<>();List<Long> orgIds = new ArrayList<>();// 主机厂用户if (UserTypeE.ORG.getValue().equals(userType)) {orgIds.add(belongTo);}// 经销商用户else if (UserTypeE.DEALER.getValue().equals(userType)) {branIdList = dealerMapper.selectBrandIdByDealerId(belongTo);// 品牌取主机厂if (branIdList != null && !branIdList.isEmpty()) {Map<String, Object> map = new HashMap<>();map.put("branIdList", branIdList);orgIds = orgMapper.selectOrgByBrand(map);}//企业用户} else {CompanyEntity companyEntity = companyManageMapper.selectByPrimaryKey(belongTo);if (companyEntity != null) {String companyLevel = companyEntity.getCompanyLevel();// 二级用户以下取二级企业IDif (!CompanyTypeE.CONGLOMERATE.getValue().toString().equals(companyLevel) && !CompanyTypeE.SUBORDINATEENTERPRISE.getValue().toString().equals(companyLevel)) {belongTo = companyEntity.getApprovalCompany().longValue();}// 过滤主机厂Long brandId = vo.getBrandId();planVOList = planMapper.selectPlanByCompanyId(brandId, belongTo, PlanStatusE.PUBLISHED.getValue(), page, size);//total = planMapper.selectTotalPlanByCompanyId(brandId, belongTo, PlanStatusE.PUBLISHED.getValue(), page, size);}}// 主机厂,经销商用户// 1,同时勾选主机厂,过滤当前主机厂if (UserTypeE.ORG.getValue().equals(userType) || UserTypeE.DEALER.getValue().equals(userType)) {List<Long> orgIdFilt = new ArrayList<>();Long brandId = vo.getBrandId();if (brandId != null) {for (Long org : orgIds) {if (org.equals(brandId)) {orgIdFilt.add(org);}}if (orgIdFilt != null && !orgIdFilt.isEmpty()) {planVOList = planMapper.selectPlanByOrgIds(orgIdFilt, PlanStatusE.PUBLISHED.getValue(), page, size);//total = planMapper.selectPlanByOrgIdsTotal(orgIdFilt, PlanStatusE.PUBLISHED.getValue(), page, size);} else {return Arrays.asList();}}// 2,没勾选主机厂,直接查询if (brandId == null && orgIds != null && !orgIds.isEmpty()) {planVOList = planMapper.selectPlanByOrgIds(orgIds, PlanStatusE.PUBLISHED.getValue(), page, size);//total = planMapper.selectPlanByOrgIdsTotal(orgIds, PlanStatusE.PUBLISHED.getValue(), page, size);}}// 处理返回数据voHandle(planVOList);return planVOList;}/*** 处理返回数据** @param planVOList* @return*/public void voHandle(List<PlanVO> planVOList) {List<Map<String, Object>> isDelDict = DictUtils.getDictListByCode(DictTypeE.IS_DEL_CODE.getTypeCode());List<Map<String, Object>> statusDict = DictUtils.getDictListByCode(DictTypeE.PLAN_STATUS.getTypeCode());planVOList.forEach(v -> {v.setIsDelName(DictUtils.getDictKeyByValue(v.getIsDel(), isDelDict));v.setStatusName(DictUtils.getDictKeyByValue(v.getStatus(), statusDict));  // 附件Map<String, Object> map = new HashMap<>();PlanFileEntity planFileEntity = new PlanFileEntity();planFileEntity.setPlanId(v.getId());planFileEntity.setIsDel(DeleteStatusE.USEFUL.getValue());List<PlanFileEntity> pfList = planFileMapper.select(planFileEntity);List<String> files = new ArrayList<>();pfList.forEach(f -> {files.add(f.getFileName());});v.setFileName(files);map.put("file", pfList);v.setMap(map);});}/*** 使用模型方式导出** @param servletResponse*/public void exportDuogeSheetModel(HttpServletResponse servletResponse) {List<ExcelUtil.MultipleSheelPropety> listData = new ArrayList<>();// sheet1List<TableHeaderExcelProperty> list = new ArrayList<>();for (int i = 0; i < 10; i++) {TableHeaderExcelProperty tableHeaderExcelProperty = new TableHeaderExcelProperty();tableHeaderExcelProperty.setName("shenke" + i);tableHeaderExcelProperty.setAge(29 + i);tableHeaderExcelProperty.setSchool("阜阳师范大学" + i);list.add(tableHeaderExcelProperty);}Sheet sheet = new Sheet(1, 0);sheet.setSheetName("个人基本信息");ExcelUtil.MultipleSheelPropety multipleSheelPropety = new ExcelUtil.MultipleSheelPropety();multipleSheelPropety.setData(list);multipleSheelPropety.setSheet(sheet);// sheet2List<TableHeaderExcelPropertyTwo> listCom = new ArrayList<>();for (int i = 0; i < 10; i++) {TableHeaderExcelPropertyTwo tableHeaderExcelPropertyTwo = new TableHeaderExcelPropertyTwo();tableHeaderExcelPropertyTwo.setName("shenke" + i);tableHeaderExcelPropertyTwo.setCompany("法本" + i);tableHeaderExcelPropertyTwo.setSalary("100" + i);listCom.add(tableHeaderExcelPropertyTwo);}Sheet sheetCom = new Sheet(2, 0);sheetCom.setSheetName("个人公司信息");ExcelUtil.MultipleSheelPropety multipleSheelPropetyCom = new ExcelUtil.MultipleSheelPropety();multipleSheelPropetyCom.setData(listCom);multipleSheelPropetyCom.setSheet(sheetCom);// 封装数据listData.add(multipleSheelPropety);listData.add(multipleSheelPropetyCom);ExcelUtil.writeWithMultipleSheel("个人基本和公司信息导出", listData, servletResponse);}

entity 模型方式

@EqualsAndHashCode(callSuper = true)
@Data
public class TableHeaderExcelProperty extends BaseRowModel {/*** value: 表头名称* index: 列的号, 0表示第一列*/@ExcelProperty(value = "姓名", index = 0)private String name;@ExcelProperty(value = "年龄", index = 1)private int age;@ExcelProperty(value = "学校", index = 2)private String school;}
@EqualsAndHashCode(callSuper = true)
@Data
public class TableHeaderExcelPropertyTwo extends BaseRowModel {/*** value: 表头名称* index: 列的号, 0表示第一列*/@ExcelProperty(value = "姓名", index = 0)private String name;@ExcelProperty(value = "公司", index = 1)private String company;@ExcelProperty(value = "年薪", index = 2)private String salary;}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

测试及工具类

@SpringBootTest
@RunWith(SpringRunner.class)
public class TestExcell {/*** 读取少于1000行的excle*/@org.junit.Testpublic void readLessThan1000Row() {String filePath = "/home/chenmingjian/Downloads/测试.xlsx";List<Object> objects = ExcelUtil.readLessThan1000Row(filePath);objects.forEach(System.out::println);}/*** 读取少于1000行的excle,可以指定sheet和从几行读起*/@org.junit.Testpublic void readLessThan1000RowBySheet() {String filePath = "/home/chenmingjian/Downloads/测试.xlsx";Sheet sheet = new Sheet(1, 1);List<Object> objects = ExcelUtil.readLessThan1000RowBySheet(filePath, sheet);objects.forEach(System.out::println);}/*** 读取大于1000行的excle* 带sheet参数的方法可参照测试方法readLessThan1000RowBySheet()*/@org.junit.Testpublic void readMoreThan1000Row() {String filePath = "/home/chenmingjian/Downloads/测试.xlsx";List<Object> objects = ExcelUtil.readMoreThan1000Row(filePath);objects.forEach(System.out::println);}/*** 生成excle* 带sheet参数的方法可参照测试方法readLessThan1000RowBySheet()*/@org.junit.Testpublic void writeBySimple() {String filePath = "D:\\share\\noModel.xlsx";List<List<Object>> data = new ArrayList<>();data.add(Arrays.asList("111", "222", "333"));data.add(Arrays.asList("111", "222", "333"));data.add(Arrays.asList("111", "222", "333"));List<String> head = Arrays.asList("表头1", "表头2", "表头3");ExcelUtil.writeBySimple(filePath, data, head);}/*** 生成excle, 带用模型* 带sheet参数的方法可参照测试方法readLessThan1000RowBySheet()*/@org.junit.Testpublic void writeWithTemplate() {String filePath = "D:\\share\\model.xlsx";List<TableHeaderExcelProperty> data = new ArrayList<>();for (int i = 0; i < 2; i++) {TableHeaderExcelProperty tableHeaderExcelProperty = new TableHeaderExcelProperty();tableHeaderExcelProperty.setName("cmj" + i);tableHeaderExcelProperty.setAge(22 + i);tableHeaderExcelProperty.setSchool("清华大学" + i);data.add(tableHeaderExcelProperty);}ExcelUtil.writeWithTemplate(filePath, data);}/*** 生成excle, 带用模型,带多个sheet*/@org.junit.Testpublic void writeWithMultipleSheel() {List<ExcelUtil.MultipleSheelPropety> list1 = new ArrayList<>();for (int j = 1; j < 4; j++) {List<TableHeaderExcelProperty> list = new ArrayList<>();for (int i = 0; i < 10; i++) {TableHeaderExcelProperty tableHeaderExcelProperty = new TableHeaderExcelProperty();tableHeaderExcelProperty.setName("shenke" + i);tableHeaderExcelProperty.setAge(29 + i);tableHeaderExcelProperty.setSchool("阜阳师范大学" + i);list.add(tableHeaderExcelProperty);}Sheet sheet = new Sheet(j, 0);sheet.setSheetName("sheet" + j);ExcelUtil.MultipleSheelPropety multipleSheelPropety = new ExcelUtil.MultipleSheelPropety();multipleSheelPropety.setData(list);multipleSheelPropety.setSheet(sheet);list1.add(multipleSheelPropety);}ExcelUtil.writeWithMultipleSheel("D:\\share\\modelSheets.xlsx", list1);}/*** 优化* 生成excle, 带用模型,带多个sheet* 不同sheet名称和数据不同*/@org.junit.Testpublic void writeWithMultipleSheelDiffrent() {List<ExcelUtil.MultipleSheelPropety> listData = new ArrayList<>();// sheet1List<TableHeaderExcelProperty> list = new ArrayList<>();for (int i = 0; i < 10; i++) {TableHeaderExcelProperty tableHeaderExcelProperty = new TableHeaderExcelProperty();tableHeaderExcelProperty.setName("shenke" + i);tableHeaderExcelProperty.setAge(29 + i);tableHeaderExcelProperty.setSchool("阜阳师范大学" + i);list.add(tableHeaderExcelProperty);}Sheet sheet = new Sheet(1, 0);sheet.setSheetName("个人基本信息");ExcelUtil.MultipleSheelPropety multipleSheelPropety = new ExcelUtil.MultipleSheelPropety();multipleSheelPropety.setData(list);multipleSheelPropety.setSheet(sheet);// sheet2List<TableHeaderExcelPropertyTwo> listCom = new ArrayList<>();for (int i = 0; i < 10; i++) {TableHeaderExcelPropertyTwo tableHeaderExcelPropertyTwo = new TableHeaderExcelPropertyTwo();tableHeaderExcelPropertyTwo.setName("shenke" + i);tableHeaderExcelPropertyTwo.setCompany("法本" + i);tableHeaderExcelPropertyTwo.setSalary("100" + i);listCom.add(tableHeaderExcelPropertyTwo);}Sheet sheetCom = new Sheet(2, 0);sheetCom.setSheetName("个人公司信息");ExcelUtil.MultipleSheelPropety multipleSheelPropetyCom = new ExcelUtil.MultipleSheelPropety();multipleSheelPropetyCom.setData(listCom);multipleSheelPropetyCom.setSheet(sheetCom);// 封装数据listData.add(multipleSheelPropety);listData.add(multipleSheelPropetyCom);ExcelUtil.writeWithMultipleSheel("D:\\share\\modelSheets.xlsx", listData);}}

工具类

package com.anji.allways.business.sales.utils;import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.anji.allways.common.excel.easyexcel.utils.ExcelException;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/*** @description:* @author: chenmingjian* @date: 19-3-18 16:16*/
@Slf4j
public class ExcelUtil {private static Sheet initSheet;static {initSheet = new Sheet(1, 0);initSheet.setSheetName("sheet");//设置自适应宽度initSheet.setAutoWidth(Boolean.TRUE);}/*** 读取少于1000行数据** @param filePath 文件绝对路径* @return*/public static List<Object> readLessThan1000Row(String filePath) {return readLessThan1000RowBySheet(filePath, null);}/*** 读小于1000行数据, 带样式* filePath 文件绝对路径* initSheet :* sheetNo: sheet页码,默认为1* headLineMun: 从第几行开始读取数据,默认为0, 表示从第一行开始读取* clazz: 返回数据List<Object> 中Object的类名*/public static List<Object> readLessThan1000RowBySheet(String filePath, Sheet sheet) {if (!StringUtils.hasText(filePath)) {return null;}sheet = sheet != null ? sheet : initSheet;InputStream fileStream = null;try {fileStream = new FileInputStream(filePath);return EasyExcelFactory.read(fileStream, sheet);} catch (FileNotFoundException e) {log.info("找不到文件或文件路径错误, 文件:{}", filePath);} finally {try {if (fileStream != null) {fileStream.close();}} catch (IOException e) {log.info("excel文件读取失败, 失败原因:{}", e);}}return null;}/*** 读大于1000行数据** @param filePath 文件觉得路径* @return*/public static List<Object> readMoreThan1000Row(String filePath) {return readMoreThan1000RowBySheet(filePath, null);}/*** 读大于1000行数据, 带样式** @param filePath 文件觉得路径* @return*/public static List<Object> readMoreThan1000RowBySheet(String filePath, Sheet sheet) {if (!StringUtils.hasText(filePath)) {return null;}sheet = sheet != null ? sheet : initSheet;InputStream fileStream = null;try {fileStream = new FileInputStream(filePath);ExcelListener excelListener = new ExcelListener();EasyExcelFactory.readBySax(fileStream, sheet, excelListener);return excelListener.getDatas();} catch (FileNotFoundException e) {log.error("找不到文件或文件路径错误, 文件:{}", filePath);} finally {try {if (fileStream != null) {fileStream.close();}} catch (IOException e) {log.error("excel文件读取失败, 失败原因:{}", e);}}return null;}/*** 生成excle** @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx* @param data     数据源* @param head     表头*/public static void writeBySimple(String filePath, List<List<Object>> data, List<String> head) {writeSimpleBySheet(filePath, data, head, null);}/*** 生成excle** @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx* @param data     数据源* @param sheet    excle页面样式* @param head     表头*/public static void writeSimpleBySheet(String filePath, List<List<Object>> data, List<String> head, Sheet sheet) {sheet = (sheet != null) ? sheet : initSheet;if (head != null) {List<List<String>> list = new ArrayList<>();head.forEach(h -> list.add(Collections.singletonList(h)));sheet.setHead(list);}OutputStream outputStream = null;ExcelWriter writer = null;try {outputStream = new FileOutputStream(filePath);writer = EasyExcelFactory.getWriter(outputStream);writer.write1(data, sheet);} catch (FileNotFoundException e) {log.error("找不到文件或文件路径错误, 文件:{}", filePath);} finally {try {if (writer != null) {writer.finish();}if (outputStream != null) {outputStream.close();}} catch (IOException e) {log.error("excel文件导出失败, 失败原因:{}", e);}}}/*** 生成excle** @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx* @param data     数据源*/public static void writeWithTemplate(String filePath, List<? extends BaseRowModel> data) {writeWithTemplateAndSheet(filePath, data, null);}/*** 生成excle** @param filePath 绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx* @param data     数据源* @param sheet    excle页面样式*/public static void writeWithTemplateAndSheet(String filePath, List<? extends BaseRowModel> data, Sheet sheet) {if (CollectionUtils.isEmpty(data)) {return;}sheet = (sheet != null) ? sheet : initSheet;sheet.setClazz(data.get(0).getClass());OutputStream outputStream = null;ExcelWriter writer = null;try {outputStream = new FileOutputStream(filePath);writer = EasyExcelFactory.getWriter(outputStream);writer.write(data, sheet);} catch (FileNotFoundException e) {log.error("找不到文件或文件路径错误, 文件:{}", filePath);} finally {try {if (writer != null) {writer.finish();}if (outputStream != null) {outputStream.close();}} catch (IOException e) {log.error("excel文件导出失败, 失败原因:{}", e);}}}/*** 生成多Sheet的excle** @param filePath              绝对路径, 如:/home/chenmingjian/Downloads/aaa.xlsx* @param multipleSheelPropetys*/public static void writeWithMultipleSheel(String filePath, List<MultipleSheelPropety> multipleSheelPropetys) {if (CollectionUtils.isEmpty(multipleSheelPropetys)) {return;}OutputStream outputStream = null;ExcelWriter writer = null;try {outputStream = new FileOutputStream(filePath);writer = EasyExcelFactory.getWriter(outputStream);for (MultipleSheelPropety multipleSheelPropety : multipleSheelPropetys) {Sheet sheet = multipleSheelPropety.getSheet() != null ? multipleSheelPropety.getSheet() : initSheet;if (!CollectionUtils.isEmpty(multipleSheelPropety.getData())) {sheet.setClazz(multipleSheelPropety.getData().get(0).getClass());}writer.write(multipleSheelPropety.getData(), sheet);}} catch (FileNotFoundException e) {log.error("找不到文件或文件路径错误, 文件:{}", filePath);} finally {try {if (writer != null) {writer.finish();}if (outputStream != null) {outputStream.close();}} catch (IOException e) {log.error("excel文件导出失败, 失败原因:{}", e);}}}/*** 导出文件路径改造,不只是在某个文件夹下** @param fileName 文件名* @param multipleSheelPropetys* @param response*/public static void writeWithMultipleSheel(String fileName, List<MultipleSheelPropety> multipleSheelPropetys, HttpServletResponse response) {if (CollectionUtils.isEmpty(multipleSheelPropetys)) {return;}OutputStream outputStream = null;ExcelWriter writer = null;try {outputStream = getOutputStream(fileName, response);writer = new ExcelWriter(outputStream, ExcelTypeEnum.XLSX);for (MultipleSheelPropety multipleSheelPropety : multipleSheelPropetys) {Sheet sheet = multipleSheelPropety.getSheet() != null ? multipleSheelPropety.getSheet() : initSheet;if (!CollectionUtils.isEmpty(multipleSheelPropety.getData())) {sheet.setClazz(multipleSheelPropety.getData().get(0).getClass());}writer.write(multipleSheelPropety.getData(), sheet);}} catch (Exception e) {e.printStackTrace();} finally {try {if (writer != null) {writer.finish();}if (outputStream != null) {outputStream.close();}} catch (IOException e) {log.error("excel文件导出失败, 失败原因:{}", e);}}}/*** 导出文件时为Writer生成OutputStream*/private static OutputStream getOutputStream(String fileName, HttpServletResponse response) {//创建本地文件String filePath = fileName + ".xlsx";File dbfFile = new File(filePath);try {if (!dbfFile.exists() || dbfFile.isDirectory()) {dbfFile.createNewFile();}fileName = new String(filePath.getBytes(), "ISO-8859-1");response.addHeader("Content-Disposition", "filename=" + fileName);return response.getOutputStream();} catch (IOException e) {throw new ExcelException("创建文件失败!");}}/*********************匿名内部类开始,可以提取出去******************************/@Datapublic static class MultipleSheelPropety {private List<? extends BaseRowModel> data;private Sheet sheet;}/*** 解析监听器,* 每解析一行会回调invoke()方法。* 整个excel解析结束会执行doAfterAllAnalysed()方法** @author: chenmingjian* @date: 19-4-3 14:11*/@Getter@Setterpublic static class ExcelListener extends AnalysisEventListener {private List<Object> datas = new ArrayList<>();/*** 逐行解析* object : 当前行的数据*/@Overridepublic void invoke(Object object, AnalysisContext context) {//当前行// context.getCurrentRowNum()if (object != null) {datas.add(object);}}/*** 解析完所有数据后会调用该方法*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//解析结束销毁不用的资源}}}

easyexcell导出专题相关推荐

  1. EasyExcell导出excel添加水印

    EasyExcell导出excel添加水印 1.添加easyExcel相关依赖 2.准备基础工具类 3.创建水印handler类 4.创建单元测试类WriteTest.class 5.测试结果 1.添 ...

  2. 关于Unity中场景的导入与导出(专题九)

    Unity场景 场景虽然是由场景美术做好的,但是我们经常需要自己去导导出以及从别的项目导入,所以我们需要对场景的导入和导出有一个详细的了解 1: 场景是由美术人员搭建完成后提交给程序; 2: 场景一般 ...

  3. 图片隐写 放大放大再放大_放大结论

    图片隐写 放大放大再放大 重点 (Top highlight) A conversation about Zoom, security, and privacy in these times of s ...

  4. 开发指南专题十六:JEECG微云快速开发平台Excel导出

    开发指南专题十六:JEECG微云快速开发平台Excel导出 14.3.  Excel导出 导出工具类ExcelExportUtil 提供两个函数 //创建多个Sheet public static H ...

  5. 开发指南专题十五 JEECG微云快速开发平台EXCEL导入导出

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴!  开 ...

  6. 【Simulink专题】Simulink模型设置(一):求解器、数据导入/导出、数学和数据类型的设置

    前言 Simulink中模型设置是关乎着整个模型的运行模式以及代码生成样式,不同的设置关乎着不同的结果,今天就给大家讲解下作者对整个模型设置的理解,有疑问的地方还需要大家多多指出,谢谢 使用版本:MA ...

  7. mysql11导入数据_MySQL专题11之MySQL导出数据、MySQL导入数据

    1.MySQL导出数据 -  MySQL中你可以使用SELECT...INTO OUTFILE语句来简单的导出数据到文本文件中. a.使用SELECT...INTO OUTFILE -  以下实例中我 ...

  8. android专题-数据库Room

    android专题-数据库Room Room介绍 room是Google官方推荐的ORM数据库框架,抽象出sqlite访问的数据库. 包含三大组件: Entity 定义 表结构,每个entity类对一 ...

  9. 微页导出为html文件怎么打开吗,h5自动生成工具(示例代码)

    一.前言 写了很多h5之后,对于写手写html和css已经麻木的我决定动手写个工具自动生成h5结构和样式.其实这个想法由来已久,但总是觉得自己技术不够,所以一直没实行.直到某天我真的写够了,我决定动手 ...

  10. UA MATH567 高维统计 专题0 为什么需要高维统计理论?——以线性判别分析为例

    UA MATH567 高维统计 专题0 为什么需要高维统计理论?--以线性判别分析为例 线性判别分析基础 理论 算法 线性判别分析基础 理论 我们回顾一下二元假设检验问题,它的目标是判断某一个obse ...

最新文章

  1. hbase源码系列(十二)Get、Scan在服务端是如何处理?
  2. VPN之DSVPN的介绍
  3. python 连接db2_大迷糊的博客
  4. IEEE802.11e EDCA 中TXOP机制的分析与改进
  5. 计算机网申兴趣爱好怎么写,银行网申个人特长和兴趣爱好怎么写
  6. pytorch实现图像分类代码实例
  7. RHEL6/7 x86_64下cachefilesd占用cpu达到100%
  8. Codeforces Round #467 (Div. 2)
  9. 51nod 1256 扩展欧几里得
  10. unity头顶状态制作_Unity中结合IK实现Lookat
  11. C#使用redis(简单例子)
  12. MATLAB-画图汇总
  13. android的popwindow控件,及控件设为圆角
  14. 直观解释Gamma分布和Poisson分布
  15. python 画图 实时_Python matplotlib实时画图案例
  16. Android studio真机调试返回 Entry name ‘assets/ae/res.ck‘ collided
  17. 流程图中参与者_探索流程参与者的移动流程门户
  18. 关于zedboard无法烧写bit流文件的解决办法
  19. 爬虫第一步,网络信息采集
  20. Web简历信息管理系统

热门文章

  1. SQL Server 加密案例解析
  2. WF3设计时性能II
  3. torch 深度学习(5)
  4. 自带CA ,sha256 哈希签名,2048 位加密 脚本,通用
  5. java程序内存泄漏排查
  6. [LeetCode]题解(python):146-LRU Cache
  7. Sql2008中添加程序集(转)
  8. 中文分词:采用二元词图以及viterbi算法(三)
  9. Hi3536 uboot引导内核全过程
  10. FreeSWITCH mod_callcenter 整理