我的需求:

项目中有一些工程表格需要导出,设计到行列合并,定制样式,原有工具类冗余,内聚性强。所以想写一个可以随意定制excel的工具类,工具类满足需求:

  1. 对于常用的工程表格有模板格式,可以任意插拔。
  2. 可以操作任意一个sheet页,进行行列合并,逻辑可以根据业务调整。
  3. 可以对当前存储sheet页数据行进行数据动态插入,单元格操作。
  4. 有实用的输出方式,比如报文实体,字节数组等。
  5. 最后轻量,代码逻辑清晰,好维护。

我是这样做的:

  1. 在构建上基于建造者设计模式
  2. 将excel的构建逻辑抽象,将数据注入逻辑从构建逻辑中分离出来,采用函数式编程的方式。
  3. 实现了样式不同的多sheet页构建。
  4. 在代码上结合原有工具类数据转化部分优点,利用JSON格式实现数据处理

嗯,时间有限,没有优化代码,小伙伴们有好的IDEA可以留言。可以基于这个扩展操作方法

使用方法:

public static void main(String[] args) {// 使用方法new WorkbookUtil()// 文件名称.setFileName(null)// TODO 初始化一个excel.initWorkbook()// TODO 初始化一个sheet页,可自定义逻辑,(HSSFWorkbook,String) ->{ HSSFSheet}.initSheet(null,null)// TODO 初始化sheet页表头 ,可自定义逻辑,(HSSFSheet,HeadDetails) ->{ HSSFSheet} 下同.initSheetHead(null,null,null,null)// 填充sheet页数据.setSheetData(null,null,null)// sheet页数据指定列合并行.setDataRowMerged(null,null,null)// sheet页数据指定相邻列合并,可以传入多值,(单行合并,值相同情况).setDataCellMerged(null,null,null)// 当前sheet当前行插入数据  data :Map<Integer, String> (列索引,数据).setSheetRow(null,null)// 当前sheet当前行强制合并    (firstCol,lastCol) 合并索引[必填].setRowMerged(null,null)// 当前sheet指定行强制合并.setCellRangeAddress(null,null)// 初始化表尾.initSheetFoot(null,null)// TODO 第二个sheet页...initSheet(null,null).initSheetHead(null,null,null,null).setSheetData(null,null,null).initSheetFoot(null,null).setDataRowAndCellMerged(null,null,null)//....// .builderByte()  输出字节数组// 直接写入报文.builderResponseEntity();}

具体的Demo:

基本的表格


简单的行列合并:


稍微复杂的行列合并:


代码

package com.hhwy.pwps.util.excel;import java.util.LinkedList;
import java.util.List;/*** @author Liruilong* @Date 2021-01-20 15:37* @Description:*/
public class HeadDetails {private List<HeadDetail> headDetails = new LinkedList<>();public static class HeadDetail{private String key;private String title;private int width = 50;//列数据单元格是否对齐private boolean  center = true;public String getKey() {return key;}public HeadDetail setKey(String key) {this.key = key;return this;}public String getTitle() {return title;}public HeadDetail setTitle(String title) {this.title = title;return this;}public int getWidth() {return width;}public HeadDetail setWidth(int width) {this.width = width;return this;}public boolean isCenter() {return center;}public HeadDetail setCenter(boolean center) {this.center = center;return this;}}public HeadDetails add(String key,String title,int width){this.headDetails.add(new HeadDetail().setTitle(title).setKey(key).setWidth(width));return this;}public HeadDetails add(String key,String title,int width,boolean center){this.headDetails.add(new HeadDetail().setTitle(title).setKey(key).setWidth(width).setCenter(center));return this;}public HeadDetails add(String key,String title){this.headDetails.add(new HeadDetail().setTitle(title).setKey(key));return this;}public List<HeadDetail>  builder(){return this.headDetails;}public int headSize(){return this.headDetails.size();}}
package com.hhwy.pwps.util.excel;import com.alibaba.fastjson.JSONObject;
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.*;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
import java.util.stream.Stream;/*** @author Liruilong* @Date 2021-01-20 17:07* @Description: excel导出工具类,可以通过 sheetBiFunction 自定义导入 逻辑*/
public class WorkbookUtil {public List<HSSFSheet> sheets = new ArrayList<>();public HSSFWorkbook hssfWorkbook;public volatile int sheetIndex = 0;public String fileName = "Excel默认名称.xls";public WorkbookUtil(String fileName) {this.fileName = fileName + ".xls";}public WorkbookUtil() {}public String getFileName() {return fileName;}public WorkbookUtil setFileName(String fileName) {if (Objects.nonNull(fileName)){this.fileName = fileName + ".xls";}return this;}public static void main(String[] args) {// 使用方法new WorkbookUtil()// 文件名称.setFileName(null)// TODO 初始化一个excel.initWorkbook()// TODO 初始化一个sheet页,可自定义逻辑,(HSSFWorkbook,String) ->{ HSSFSheet}.initSheet(null,null)// TODO 初始化sheet页表头 ,可自定义逻辑,(HSSFSheet,HeadDetails) ->{ HSSFSheet} 下同.initSheetHead(null,null,null,null)// 填充sheet页数据.setSheetData(null,null,null)// sheet页数据指定列合并行.setDataRowMerged(null,null,null)// sheet页数据指定相邻列合并,可以传入多值,(单行合并,值相同情况).setDataCellMerged(null,null,null)// 当前sheet当前行插入数据  data :Map<Integer, String> (列索引,数据).setSheetRow(null,null)// 当前sheet当前行强制合并    (firstCol,lastCol) 合并索引[必填].setRowMerged(null,null)// 当前sheet指定行强制合并.setCellRangeAddress(null,null)// 初始化表尾.initSheetFoot(null,null)// TODO 第二个sheet页...initSheet(null,null).initSheetHead(null,null,null,null).setSheetData(null,null,null).initSheetFoot(null,null).setDataRowAndCellMerged(null,null,null)//....// .builderByte()  输出字节数组// 直接写入报文.builderResponseEntity();}/*** <per>* <p>行列合并,一般根据特定需求编码,这里没有写默认的逻辑</p>* <per/>* @param merged 传递的参数,Map<合并行的列索引,合并列的列索引>* @param list* @param sheetBiFunction* @return com.hhwy.pwps.util.excel.WorkbookUtil* @throws* @Description : TODO* @author Liruilong* @Date 2021-01-24 18:28**/public WorkbookUtil setDataRowAndCellMerged(Map<int[], int[]> merged,List<?> list, BiFunction<HSSFSheet, Map<int[], int[]>, HSSFSheet> sheetBiFunction){HSSFSheet sheet = this.sheets.get(sheetIndex);if (Objects.nonNull(merged)  && Objects.nonNull(list) && Objects.isNull(sheetBiFunction)) {// 默认行列同时合并逻辑}sheets.add(sheetIndex, Objects.isNull(sheetBiFunction) ? sheet : sheetBiFunction.apply(sheet, merged));return this;}/*** <per>* <p>数据指定列索引合并</p>* <per/>** @param merged* @param list* @param sheetBiFunction* @return com.hhwy.pwps.managepointins.service.impl.WorkbookUtil* @throws* @Description : TODO* @author Liruilong* @Date 2021-01-22 11:19**/public WorkbookUtil setDataCellMerged(Map<Integer, Integer> merged, List<?> list, BiFunction<HSSFSheet, Map<Integer, Integer>, HSSFSheet> sheetBiFunction) {HSSFSheet sheet = this.sheets.get(sheetIndex);List<CellRangeAddress> cellRangeAddresses = new ArrayList<>();if (Objects.nonNull(merged) && Objects.isNull(sheetBiFunction)) {int numberOfRows = sheet.getPhysicalNumberOfRows() - list.size();List<Integer> cellIndex = merged.keySet().stream().collect(Collectors.toList());for (int j = 0; j < cellIndex.size(); j++) {int cellIndex_ = cellIndex.get(j);for (int i = numberOfRows; i < sheet.getPhysicalNumberOfRows(); i++) {HSSFRow sheetRow = sheet.getRow(i);String cell1 = sheetRow.getCell(cellIndex_).toString();String cell2 = sheetRow.getCell(merged.get(cellIndex_)).toString();if (cell1.equals(cell2)) {sheet.addMergedRegionUnsafe(new CellRangeAddress(i, i, cellIndex_, merged.get(cellIndex_)));}}}}sheets.add(sheetIndex, Objects.isNull(sheetBiFunction) ? sheet : sheetBiFunction.apply(sheet, merged));return this;}/*** <per>* <p>指定行索引强制合并指定的列数据:CellRangeAddress原始方法调用</p>* <per/>* @param merged* @param sheetBiFunction* @return com.hhwy.pwps.managepointins.service.impl.WorkbookUtil* @throws* @Description : TODO* @author Liruilong* @Date 2021-01-21 20:26**/public WorkbookUtil setCellRangeAddress(Map<int[], int[]> merged, BiFunction<HSSFSheet, Map<int[], int[]>, HSSFSheet> sheetBiFunction) {HSSFSheet sheet = this.sheets.get(sheetIndex);if (Objects.nonNull(merged) && Objects.isNull(sheetBiFunction)) {merged.forEach((o1, o2) -> {sheet.addMergedRegionUnsafe(new CellRangeAddress(o1[0], o1[1], o2[0], o2[1]));});}sheets.add(sheetIndex, Objects.isNull(sheetBiFunction) ? sheet : sheetBiFunction.apply(sheet, merged));return this;}/*** <per>* <p>数据列合并对应行数据</p>* <per/>** @param list            sheet数据[必填]* @param merged          列索引[必填]* @param sheetBiFunction* @return com.hhwy.pwps.managepointins.service.impl.WorkbookUtil* @throws* @Description : TODO* @author Liruilong* @Date 2021-01-21 15:13**/public WorkbookUtil setDataRowMerged(List<Integer> merged, List<?> list, BiFunction<HSSFSheet, List<Integer>, HSSFSheet> sheetBiFunction) {HSSFSheet sheet = this.sheets.get(sheetIndex);List<CellRangeAddress> cellRangeAddresses = new ArrayList<>();if (Objects.nonNull(merged) && Objects.isNull(sheetBiFunction)) {//数据起始行int numberOfRows = sheet.getPhysicalNumberOfRows();int first_ = numberOfRows - list.size();merged.stream().forEach(index -> {String old = null;int first = first_;for (int i = first; i < numberOfRows; i++) {HSSFRow sheetRow = sheet.getRow(i);String cell = sheetRow.getCell(index).toString();//第一行跳过if (i == first_) {old = cell;continue;}//合并逻辑if (!old.equals(cell)) {if (first != i - 1) {sheet.addMergedRegionUnsafe(new CellRangeAddress(first, i - 1, index, index));}first = i;old = cell;// 最后一行判断} else if (i == numberOfRows - 1) {if (first != i) {sheet.addMergedRegionUnsafe(new CellRangeAddress(first, i, index, index));//    cellRangeAddresses.add(new CellRangeAddress(first, i - 1, index, index));}}}});}sheets.add(sheetIndex, Objects.isNull(sheetBiFunction) ? sheet : sheetBiFunction.apply(sheet, merged));return this;}/*** <per>* <p>当前行实现单元格强制合并</p>* <per/>** @param merged          合并索引[必填] (firstCol,lastCol)* @param sheetBiFunction* @return com.hhwy.pwps.managepointins.service.impl.WorkbookUtil* @throws* @Description : TODO* @author Liruilong* @Date 2021-01-21 14:43**/public WorkbookUtil setRowMerged(Map<Integer, Integer> merged, BiFunction<HSSFSheet, Map<Integer, Integer>, HSSFSheet> sheetBiFunction) {HSSFSheet sheet = this.sheets.get(sheetIndex);if (Objects.nonNull(merged) && Objects.isNull(sheetBiFunction)) {int numberOfRows = sheet.getPhysicalNumberOfRows();List<Integer> cellIndex = merged.keySet().stream().collect(Collectors.toList());for (int i = 0; i < cellIndex.size(); i++) {int index = cellIndex.get(i);sheet.addMergedRegionUnsafe(new CellRangeAddress(numberOfRows - 1, numberOfRows - 1, index, merged.get(index)));}}sheets.add(sheetIndex, Objects.isNull(sheetBiFunction) ? sheet : sheetBiFunction.apply(sheet, merged));return this;}/*** <per>* <p>sheet页指定列索引插入单行数据</p>* <per/>** @param data            单行数据[必填]  Map<Integer, String> (列索引,数据)* @param sheetBiFunction* @return com.hhwy.pwps.managepointins.service.impl.WorkbookUtil* @throws* @Description : TODO Specify column index inserts single line data* @author Liruilong* @Date 2021-01-21 10:33**/public WorkbookUtil setSheetRow(Map<Integer, String> data, BiFunction<HSSFSheet, Map<Integer, String>, HSSFSheet> sheetBiFunction) {HSSFSheet sheet = this.sheets.get(sheetIndex);if (Objects.nonNull(data) && Objects.isNull(sheetBiFunction)) {int numberOfRows = sheet.getPhysicalNumberOfRows();HSSFRow sheetRow = sheet.createRow(numberOfRows);HSSFCellStyle cellStyle = hssfWorkbook.createCellStyle();cellStyle.setAlignment(HorizontalAlignment.CENTER_SELECTION);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);List<Integer> cellIndex = data.keySet().stream().collect(Collectors.toList());for (int i = 0; i < cellIndex.size(); i++) {int index = cellIndex.get(i);HSSFCell cell = sheetRow.createCell(index);cell.setCellValue(data.get(index));cell.setCellStyle(cellStyle);}}sheets.add(sheetIndex, Objects.isNull(sheetBiFunction) ? sheet : sheetBiFunction.apply(sheet, data));return this;}/*** <per>* <p>sheet页数据填充</p>* <per/>** @param headDetails     表头[必填]* @param list            数据[必填]* @param sheetBiFunction* @return com.hhwy.pwps.managepointins.service.impl.WorkbookUtil* @throws* @Description : TODO* @author Liruilong* @Date 2021-01-21 8:42**/public WorkbookUtil setSheetData(HeadDetails headDetails, List<?> list, BiFunction<HSSFSheet, List<?>, HSSFSheet> sheetBiFunction) {HSSFSheet sheet = this.sheets.get(sheetIndex);List<List<String>> sheetData = new ArrayList<List<String>>();if (Objects.nonNull(list) && Objects.isNull(sheetBiFunction)) {//准备数据list.stream().forEach(o -> {String jsonString = JSONObject.toJSONStringWithDateFormat(o, "yyyy-MM-dd HH:mm:ss");// 将单行数据转化为JSON串。JSONObject json = JSONObject.parseObject(jsonString);List<String> collect = headDetails.builder().stream().map(headDetail -> {String key = headDetail.getKey();Object obj = json.getObject(key, Object.class);if (obj instanceof String) {return obj.toString();} else if (obj instanceof BigDecimal) {return ((BigDecimal) obj).stripTrailingZeros().toPlainString();} else {if (obj != null) {return obj.toString();} else {return " ";}}}).collect(Collectors.toList());sheetData.add(collect);});int numberOfRows = sheet.getPhysicalNumberOfRows();HSSFCellStyle cellStyle = hssfWorkbook.createCellStyle();cellStyle.setAlignment(HorizontalAlignment.CENTER_SELECTION);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//数据解析for (int rowIndex = 0; rowIndex < sheetData.size(); rowIndex++) {HSSFRow sheetRow = sheet.createRow(numberOfRows + rowIndex);List<String> cells = sheetData.get(rowIndex);for (int cellIndex = 0; cellIndex < cells.size(); cellIndex++) {HSSFCell cell = sheetRow.createCell(cellIndex);cell.setCellValue(cells.get(cellIndex));if (headDetails.builder().get(cellIndex).isCenter()) {cell.setCellStyle(cellStyle);}}}}sheets.add(sheetIndex, Objects.isNull(sheetBiFunction) ? sheet : sheetBiFunction.apply(sheet, list));return this;}/*** <per>* <p>shell页表尾初始化</p>* <per/>** @param sheetFoot       表尾[可选]* @param sheetBiFunction* @return com.hhwy.pwps.managepointins.service.impl.WorkbookUtil* @throws* @Description : TODO* @author Liruilong* @Date 2021-01-20 22:19**/public WorkbookUtil initSheetFoot(String sheetFoot, BiFunction<HSSFSheet, String, HSSFSheet> sheetBiFunction) {HSSFSheet sheet = this.sheets.get(sheetIndex);if (Objects.nonNull(sheetFoot) && Objects.isNull(sheetBiFunction)) {HSSFCellStyle cellStyle = hssfWorkbook.createCellStyle();cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);HSSFFont font = hssfWorkbook.createFont();int numberOfRows = sheet.getPhysicalNumberOfRows();int numberOfCells = sheet.getRow(numberOfRows - 1).getPhysicalNumberOfCells();HSSFRow sheetRow = sheet.createRow(numberOfRows);sheetRow.setHeight((short) 800);font.setFontHeightInPoints((short) 8);font.setFontName("宋体");cellStyle.setFont(font);HSSFCell cell = sheetRow.createCell(0);cell.setCellValue(sheetFoot);cell.setCellStyle(cellStyle);sheet.addMergedRegionUnsafe(new CellRangeAddress(numberOfRows, numberOfRows, 0, numberOfCells - 1));}sheets.add(sheetIndex, Objects.isNull(sheetBiFunction) ? sheet : sheetBiFunction.apply(sheet, sheetFoot));return this;}/*** <per>* <p>shell页表头的初始化,可以传入BiFunction自定义初始化逻辑,使用默认值,传入null</p>* <per/>** @param headDetails     表头[必填]* @param sheetTitle      标题[可选]* @param projectName     工程名称[可选]* @param sheetBiFunction 初始化逻辑* @return org.apache.poi.hssf.usermodel.HSSFSheet* @throws* @Description : TODO* @author Liruilong* @Date 2021-01-20 17:52**/public WorkbookUtil initSheetHead(HeadDetails headDetails, String sheetTitle, String projectName, BiFunction<HSSFSheet, HeadDetails, HSSFSheet> sheetBiFunction) {//行索引int rowIndex = 0;HSSFCellStyle cellStyle = hssfWorkbook.createCellStyle();HSSFRow sheetRow = null;HSSFSheet sheet = this.sheets.get(sheetIndex);// 有标题行时if (Objects.nonNull(sheetTitle)) {HSSFCellStyle cellStyleTitle = hssfWorkbook.createCellStyle();HSSFFont fontTitle = hssfWorkbook.createFont();//对齐方式cellStyleTitle.setAlignment(HorizontalAlignment.CENTER_SELECTION);cellStyleTitle.setVerticalAlignment(VerticalAlignment.CENTER);fontTitle.setFontName("宋体");//大小fontTitle.setFontHeightInPoints((short) 21);cellStyleTitle.setFont(fontTitle);sheetRow = sheet.createRow(rowIndex++);sheetRow.setHeight((short) 800);HSSFCell cell = sheetRow.createCell(0);cell.setCellValue(sheetTitle);cell.setCellStyle(cellStyleTitle);// 合并单元格sheet.addMergedRegionUnsafe(new CellRangeAddress(rowIndex - 1, rowIndex - 1, 0, headDetails.headSize() - 1));}// 有项目工程名的时if (Objects.nonNull(projectName)) {HSSFCellStyle cellStyleName = hssfWorkbook.createCellStyle();HSSFFont fontName = hssfWorkbook.createFont();sheetRow = sheet.createRow(rowIndex++);HSSFCell cell = sheetRow.createCell(0);fontName.setBold(true);fontName.setFontHeightInPoints((short) 10);fontName.setFontName("微软雅黑");cellStyleName.setAlignment(HorizontalAlignment.LEFT);cellStyleName.setFont(fontName);cell.setCellStyle(cellStyleName);cell.setCellValue(projectName);// 合并单元格sheet.addMergedRegionUnsafe(new CellRangeAddress(rowIndex - 1, rowIndex - 1, 0, headDetails.headSize() - 1));}sheetRow = sheet.createRow(rowIndex++);List<HeadDetails.HeadDetail> builder = headDetails.builder();HSSFFont fontHead = hssfWorkbook.createFont();fontHead.setBold(true);cellStyle.setAlignment(HorizontalAlignment.CENTER_SELECTION);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);fontHead.setFontHeightInPoints((short) 10);fontHead.setFontName("微软雅黑");cellStyle.setFont(fontHead);for (int i = 0; i < headDetails.headSize(); i++) {HSSFCell cell = sheetRow.createCell(i);//填充单元格数据HeadDetails.HeadDetail headDetail = builder.get(i);cell.setCellStyle(cellStyle);cell.setCellValue(headDetail.getTitle());sheet.setColumnWidth(i, headDetail.getWidth() * 200);}sheets.add(sheetIndex, Objects.isNull(sheetBiFunction) ? sheet : sheetBiFunction.apply(sheet, headDetails));return this;}/*** <per>* <p>sheet页初始化,设置默认值,可以传入BiFunction自定义初始化逻辑,使用默认值,传入null</p>* <per/>** @param sheetName       sheet页名称[可选]* @param sheetBiFunction 自定义sheet页规则,使用默认传入 null* @return org.apache.poi.hssf.usermodel.HSSFSheet* @throws* @Description : TODO* @author Liruilong* @Date 2021-01-20 16:23**/public WorkbookUtil initSheet(String sheetName, BiFunction<HSSFWorkbook, String, HSSFSheet> sheetBiFunction) {HSSFSheet sheet = this.hssfWorkbook.createSheet(Optional.ofNullable(sheetName).orElse("sheet页XX"));//创建默认样式sheet.setDefaultColumnWidth(15);sheet.setDefaultRowHeight((short) 300);sheets.add(sheetIndex == 0 ? sheetIndex : ++sheetIndex, Objects.isNull(sheetBiFunction) ? sheet : sheetBiFunction.apply(this.hssfWorkbook, sheetName));return this;}/*** <per>* <p>Workbook 初始化</p>* <per/>** @param setCategory 文档类别[可选]* @param setManager  文档管理员[可选]* @param setCompany  设置公司信息[可选]* @param setTitle    文档标题[可选]* @param setAuthor   文档作者[可选]* @param setComments 文档备注[可选]* @return com.hhwy.pwps.managepointins.service.impl.ManagePointIn.WorkbookUtil* @throws* @Description : TODO* @author Liruilong* @Date 2021-01-20 16:27**/public WorkbookUtil initWorkbook(String setCategory, String setManager, String setCompany, String setTitle, String setAuthor, String setComments) {//1. 创建一个 Excel 文档HSSFWorkbook workbook = new HSSFWorkbook();//2. 创建文档摘要workbook.createInformationProperties();//3. 获取并配置文档信息DocumentSummaryInformation docInfo = workbook.getDocumentSummaryInformation();//文档类别docInfo.setCategory(Optional.ofNullable(setCategory).orElse("配网输出报表"));//文档管理员docInfo.setManager(Optional.ofNullable(setManager).orElse("配网工程评审平台"));//设置公司信息docInfo.setCompany(Optional.ofNullable(setCompany).orElse("XXXXXX"));docInfo.setDocumentVersion("1.0");//4. 获取文档摘要信息SummaryInformation summInfo = workbook.getSummaryInformation();//文档标题summInfo.setTitle(Optional.ofNullable(setTitle).orElse("配网输出报表"));//文档作者summInfo.setAuthor(Optional.ofNullable(setAuthor).orElse("配网工程评审平台"));// 创建时间summInfo.setCreateDateTime(new Date());// 文档备注summInfo.setComments(Optional.ofNullable(setComments).orElse(LocalDateTime.now().toString() + " 配网工程评审平台导出"));this.hssfWorkbook = workbook;return this;}public WorkbookUtil initWorkbook() {//1. 创建一个 Excel 文档HSSFWorkbook workbook = new HSSFWorkbook();this.hssfWorkbook = workbook;return this;}/*** <per>* <p>Excel以字节数组输出</p>* <per/>** @param* @return byte[]* @throws* @Description : TODO Output byte array* @author Liruilong* @Date 2021-01-21 8:44**/public byte[] builderByte() {return hssfWorkbook.getBytes();}/*** <per>* <p>Excel以application/octet-stream形式输出,返回二进制的报文实体</p>* <per/>** @param* @return org.springframework.http.ResponseEntity<byte       [       ]>* @throws* @Description : TODO* @author Liruilong* @Date 2021-01-21 8:43**/public ResponseEntity<byte[]> builderResponseEntity() {ByteArrayOutputStream baos = new ByteArrayOutputStream();HttpHeaders headers = new HttpHeaders();try {headers.setContentDispositionFormData("attachment", new String(fileName.getBytes("UTF-8"), "ISO-8859-1"));headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);hssfWorkbook.write(baos);} catch (IOException e) {e.printStackTrace();}return new ResponseEntity<byte[]>(baos.toByteArray(), headers, HttpStatus.CREATED);}}

javaExcel 导出(基于POI的复杂表格导出工具类)相关推荐

  1. java中使用jxl导出excel表格的工具类(全网唯一亲测可用,在原来基础上扩展)

    java中后台导出excel的话,有两种方案,一是使用poi(不过由于是windows版本的,存在不兼容,但功能更多,更强大),而是使用jxl(纯java编写,不过兼容,简单一些),可以设置输出的ex ...

  2. java给excel填充数据_使用poi操作Excel的处理工具类自动解析填充数据

    直接传入对应的对象直接生成Excel中的数据集合 Excel模板-表头所在行为1(所在行从一开始) image.png 首先需要导入的Excel表头行中要添加批注,内容为对应JavaBean的属性值. ...

  3. POI 方式-excle 表格导出实现-java-poi

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 效果: jsp 页面  用的Bootstrap : <li class="dropd ...

  4. 利用poi实现table表格导出excel

    思路:把table转成json数据传到后台(需要用到jquery.tabletojson.min.js),json转成list<list<String>>类型.利用poi导出e ...

  5. java 使用POI简单excel表格导出,通过浏览器直接下载

    pom.xl依赖 <!--POI Excel表格导出依赖--> <dependency><groupId>org.apache.poi</groupId> ...

  6. POI的Excel表格导出教程

    一.jsp页面 1.导出按钮 <button type="button" id="export">导出</button> 2.搜索栏条件 ...

  7. CAD表格怎么导出到Excel?CAD表格导出

    在使用浩辰CAD制图软件绘制图纸的过程中,有些时候需要将CAD图纸中的表格导出,具体如何操作呢?下面小编来给CAD制图初学入门者介绍一下CAD导出表格教程,使用的依然是小编最喜欢的国产CAD制图软件- ...

  8. Excel 导入导出、样式设计、Excel各种工具类整合,FileUtil、ExcelUtil

    2022-12-09 今天整理一下最近的excel导入导出经验,整理出了几个工具类,放心使用,可应付8成需求 excel导入导出现实需求可能很复杂,但基本都可以通过原生和easyexcel配合实现,开 ...

  9. Springboot+POI通用Excel表格导出表头样式设置方法

    private void setSheetHeader(XSSFWorkbook xWorkbook, Sheet sh,String[] title) { // 设置单元格格式为文本格式XSSFDa ...

最新文章

  1. 使用OpenCV与sklearn实现基于词袋模型的图像分类预测与搜索
  2. java 时间l_java中获取系统时间并格式化输出
  3. java语言基础及集合基础大总结
  4. c语言无符号中符号什么意思,C语言中无符号与有符号及相加问题
  5. 用ul li实现边框重合并附带鼠标经过效果
  6. hornetq_Spring 3 HornetQ 2.1集成教程
  7. 电子书及阅读器Demo
  8. javase实现银行转账
  9. 迈道科技生产安全风险调度管控系统
  10. 计算机科学技术专业单片机,计算机科学与技术专业毕业论文---基于单片机的智能浇花系统的设计与实现.docx...
  11. 如何在word左侧显示目录
  12. Android开发使用百度地图定位误差过大
  13. QQ微信实现连续发送消息【代码实现】
  14. 国泰君安证券 神策数据首发《证券行业数字化财富管理 3A3R 指标体系白皮书》...
  15. Android 回车换行的持久化
  16. 反编译“微软纸牌集合”资源文件
  17. 外汇市场百年风云演变,当代“钱”途之选就看EBC金融集团
  18. 线程池中各个参数如何合理设置
  19. ML之NB:基于news新闻文本数据集利用纯统计法、kNN、朴素贝叶斯(高斯/多元伯努利/多项式)、线性判别分析LDA、感知器等算法实现文本分类预测
  20. 分布式与云计算系统 考试内容总结

热门文章

  1. 25岁上下的你,现在混得怎么样?豆瓣6000 热帖,看完心里真的好难受!
  2. 国产小品牌纽麦平板T118的ADB清楚锁屏手势之旅
  3. UOJ#48. 【UR #3】核聚变反应强度 数学
  4. 计算机双师型教师认定标准,中职学校计算机专业“双师型”教师的培养研究
  5. java下载Excel表格(ajax处理流文件)
  6. 强迫症,是仅次于抑郁症、酒精依赖和恐惧症的第4个常见病
  7. springboot访问vue的html,Springboot中如何访问静态资源
  8. 【每日早报】2019/09/19
  9. 行政区划数据方案设计
  10. 【小程序】PCM音频录制播放小工具