EasyExcel导出多sheet并设置单元格样式

前言

最近在做项目时遇到了特殊的Excel导出需求,需要对不同sheet设置不同样式,但网上找了很多方法都有问题😢。在经历一段时间的爬坑之后,终于解决,于是写这篇文章把他分享出来😊。

EasyExcel简介

EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。也是目前比较常用的Excel处理工具。

关于如何读取和写入Excel文件,官网教程已经很全面,这里不做过多赘述。

需求🤔

假设我们遇到了这样一个需求:

现在要导出一个数码产品的报表,有手机📱和电脑🖥︎两大类,需要在表头统计总价、均价、最高价、最低价,并需要按指标对数据进行特殊处理。

手机📱:

  1. 价格 > 5000,字体为红色;
  2. CPU 为 晓龙8 Gen3时,单元格高亮为黄色。

电脑🖥︎:

  1. 价格 > 10000,字体为红色;
  2. 显卡为4090时,单元格高亮为蓝色。

开始

导入依赖

❗️SpringBoot 依赖自行导入

 

xml

复制代码

<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.3.2</version> </dependency> <!-- hutool 工具集,为了构造模拟数据,具体项目请根据实际情况引入 --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.22</version> </dependency>

接口

❗️注:为了阅读简洁,这里简化了部分代码

 

java

复制代码

/** * 导出Excel 接口 * * @param response */ @PostMapping("export") public void exportExcel(HttpServletResponse response) { digitalProductService.exportExcel(response); }

服务实现类

首先模拟一部分数据

 

java

复制代码

package com.penga.demo.service.impl; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.StrUtil; import com.penga.demo.service.IDigitalProductService; import com.penga.demo.util.DigitalProductCellWriteHandler; import com.penga.demo.util.EasyExcelUtils; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @Service public class DigitalProductServiceImpl implements IDigitalProductService { @Override public void exportExcel(HttpServletResponse response) { // 初始化多个sheet List<String> sheetNames = ListUtil.toList("手机", "电脑"); // 初始化数据集 List<List<List<Object>>> dataLists = getDatas(); // 统计数据 List<BigDecimal> phonePriceList = dataLists.get(0).stream().map(dl -> Convert.toBigDecimal(dl.get(3))).collect(Collectors.toList()); List<BigDecimal> pcPriceList = dataLists.get(1).stream().map(dl -> Convert.toBigDecimal(dl.get(2))).collect(Collectors.toList()); String phoneTotalHeader = getTotalHeader(phonePriceList); String pcTotalHeader = getTotalHeader(pcPriceList); // 初始化每个sheet里面的header List<List<List<String>>> headerLists = getHeaders(phoneTotalHeader, pcTotalHeader); EasyExcelUtils.writeExcelSheets(response, "数码产品报表", sheetNames, headerLists, dataLists, new DigitalProductCellWriteHandler()); } private List<List<List<String>>> getHeaders(String phoneTotalHeader, String pcTotalHeader) { String phoneTitle = "手机-统计报表"; String pcTitle = "电脑-统计报表"; List<List<List<String>>> headerLists = new ArrayList<>(); List<List<String>> headerList1 = new ArrayList<>(); headerList1.add(ListUtil.toList(phoneTitle, phoneTotalHeader, "序号")); headerList1.add(ListUtil.toList(phoneTitle, phoneTotalHeader, "型号")); headerList1.add(ListUtil.toList(phoneTitle, phoneTotalHeader, "上市日期")); headerList1.add(ListUtil.toList(phoneTitle, phoneTotalHeader, "价格")); headerList1.add(ListUtil.toList(phoneTitle, phoneTotalHeader, "CPU")); headerList1.add(ListUtil.toList(phoneTitle, phoneTotalHeader, "RAM容量")); headerList1.add(ListUtil.toList(phoneTitle, phoneTotalHeader, "ROM容量")); List<List<String>> headerList2 = new ArrayList<>(); headerList2.add(ListUtil.toList(pcTitle, pcTotalHeader, "序号")); headerList2.add(ListUtil.toList(pcTitle, pcTotalHeader, "配置")); headerList2.add(ListUtil.toList(pcTitle, pcTotalHeader, "价格")); headerList2.add(ListUtil.toList(pcTitle, pcTotalHeader, "CPU")); headerList2.add(ListUtil.toList(pcTitle, pcTotalHeader, "显卡")); headerList2.add(ListUtil.toList(pcTitle, pcTotalHeader, "内存")); headerList2.add(ListUtil.toList(pcTitle, pcTotalHeader, "硬盘容量")); headerLists.add(headerList1); headerLists.add(headerList2); return headerLists; } private String getTotalHeader(List<BigDecimal> priceList) { BigDecimal sum = priceList.stream().reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal avg = sum.divide(new BigDecimal(priceList.size()), 2, RoundingMode.HALF_UP); BigDecimal max = priceList.stream().max(BigDecimal::compareTo).orElse(BigDecimal.ZERO); BigDecimal min = priceList.stream().min(BigDecimal::compareTo).orElse(BigDecimal.ZERO); return StrUtil.format("总价:{} 均价:{}\n最高价:{} 最低价:{}", sum, avg, max, min); } private List<List<List<Object>>> getDatas() { List<List<List<Object>>> dataLists = new ArrayList<>(); // dataList 的顺序一定要与 headerList 的顺序一一对应 List<List<Object>> dataList1 = new ArrayList<>(); dataList1.add(ListUtil.toList(1, "iQOO 12 Pro", "2023年11月7日", new BigDecimal("4999.00"), "高通 骁龙8 Gen3", "16GB", "256GB")); dataList1.add(ListUtil.toList(2, "小米14 Pro", "2023年10月31日", new BigDecimal("5499.00"), "高通 骁龙8 Gen3", "16GB", "512GB")); dataList1.add(ListUtil.toList(3, "HUAWEI Mate 60 Pro", "2023年8月29日", new BigDecimal("6999.00"), "海思 麒麟 9000s", "12GB", "512GB")); dataList1.add(ListUtil.toList(4, "苹果iPhone 15 Pro", "2023年09月22日", new BigDecimal("10999.00"), "苹果 A17 Pro", "8GB", "256GB")); dataList1.add(ListUtil.toList(5, "vivo X90s", "2023年06月30日", new BigDecimal("4099.00"), "联发科 天玑9200+", "12GB", "512GB")); dataLists.add(dataList1); List<List<Object>> dataList2 = new ArrayList<>(); dataList2.add(ListUtil.toList(1, "配置1", new BigDecimal("5199.00"), "Intel 酷睿 i5 13400F", "RTX 4060", "16GB", "固态硬盘 1TB")); dataList2.add(ListUtil.toList(2, "配置2", new BigDecimal("17599.00"), "Intel 酷睿 i9 14900KF", "RTX 4080", "32GB", "机械硬盘 1TB")); dataList2.add(ListUtil.toList(3, "配置3", new BigDecimal("30999.00"), "Intel 酷睿 i9 14900KF", "RTX 4090", "32GB", "固态硬盘 2TB")); dataLists.add(dataList2); return dataLists; } }

❗️这里针对几个list进行说明

  1. List<String> sheetNames 显而易见,就是创建多个 sheet
  2. List<List<List<String>>> headerLists最外层 list 代表每个 sheet 创建一个 header,第二层 list 代表横向的 header,第三层 list 代表纵向的。EasyExcel会将第二层 list 中的每个三层 list 元素同序(index)相等的字符进行合并,利用这个特性可以很方便的创建多级表头。
  3. List<List<List<Object>>> dataLists同样的,最外层 list 代表每个 sheet 里的数据,第二层 list 代表纵向每行的数据,第三层 list 代表单元格的数据

Excel导出工具

 

java

复制代码

package com.penga.demo.util; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder; import com.alibaba.excel.write.handler.WriteHandler; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.style.WriteCellStyle; import com.alibaba.excel.write.metadata.style.WriteFont; import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; import org.apache.poi.ss.usermodel.*; import org.springframework.http.MediaType; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; public class EasyExcelUtils { /** * @param response 返回 * @param fileName 文件名 * @param sheetNames sheet集合 * @param headerLists 表头集合 * @param dataLists 数据集合 * @param writeHandler 自定义样式 */ public static void writeExcelSheets(HttpServletResponse response, String fileName, List<String> sheetNames, List<List<List<String>>> headerLists, List<List<List<Object>>> dataLists, WriteHandler writeHandler) { ServletOutputStream out = null; try { out = getOut(response, fileName); sheetNames = sheetNames.stream().distinct().collect(Collectors.toList()); int num = sheetNames.size(); // 设置基础样式 HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(getHeadStyle(), getContentStyle()); ExcelWriter excelWriter = EasyExcel.write(out).build(); for (int i = 0; i < num; i++) { ExcelWriterSheetBuilder sheetBuilder = EasyExcel.writerSheet(i, sheetNames.get(i)).head(headerLists.get(i)) // 自动列宽(按实际情况加入) .registerWriteHandler(new CustomHandler()) .registerWriteHandler(horizontalCellStyleStrategy); if (Objects.nonNull(writeHandler)) { // 自定义样式设置 sheetBuilder.registerWriteHandler(writeHandler); } WriteSheet writeSheet = sheetBuilder.build(); if (CollectionUtil.isEmpty(dataLists)) { excelWriter.write(new ArrayList<>(), writeSheet); } else { excelWriter.write(dataLists.get(i), writeSheet); } } excelWriter.finish(); } catch (Exception e) { e.printStackTrace(); } finally { if (Objects.nonNull(out)) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } } private static ServletOutputStream getOut(HttpServletResponse response, String fileName) throws Exception { fileName = fileName + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ExcelTypeEnum.XLSX.getValue(); setAttachmentResponseHeader(response, fileName); response.setCharacterEncoding("utf-8"); response.setContentType(MediaType.MULTIPART_FORM_DATA_VALUE); response.setContentType("application/vnd.ms-excel;charset=utf-8"); return response.getOutputStream(); } /** * 下载文件名重新编码 * * @param response 响应对象 * @param realFileName 真实文件名 * @return */ public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException { String percentEncodedFileName = percentEncode(realFileName); String contentDispositionValue = "attachment; filename=" + percentEncodedFileName + ";filename*=utf-8''" + percentEncodedFileName; response.setHeader("Access-Control-Expose-Headers", "Content-Disposition"); response.setHeader("Content-Disposition", contentDispositionValue); } /** * 百分号编码工具方法 * * @param s 需要百分号编码的字符串 * @return 百分号编码后的字符串 */ public static String percentEncode(String s) throws UnsupportedEncodingException { String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString()); return encode.replaceAll("\+", "%20"); } /** * 头部样式 */ private static WriteCellStyle getHeadStyle() { // 头的策略 WriteCellStyle headWriteCellStyle = new WriteCellStyle(); // 背景颜色 headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND); // 字体 WriteFont headWriteFont = new WriteFont(); //设置字体名字 headWriteFont.setFontName("微软雅黑"); //设置字体大小 headWriteFont.setFontHeightInPoints((short) 10); //字体加粗 headWriteFont.setBold(false); //在样式用应用设置的字体 headWriteCellStyle.setWriteFont(headWriteFont); // 边框样式 setBorderStyle(headWriteCellStyle); //设置自动换行 headWriteCellStyle.setWrapped(true); //设置水平对齐的样式为居中对齐 headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); //设置垂直对齐的样式为居中对齐 headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); //设置文本收缩至合适 // headWriteCellStyle.setShrinkToFit(true); return headWriteCellStyle; } /** * 内容样式 */ private static WriteCellStyle getContentStyle() { // 内容的策略 WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); // 背景白色 // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定 contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex()); contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND); // 设置字体 WriteFont contentWriteFont = new WriteFont(); //设置字体大小 contentWriteFont.setFontHeightInPoints((short) 10); //设置字体名字 contentWriteFont.setFontName("宋体"); //在样式用应用设置的字体 contentWriteCellStyle.setWriteFont(contentWriteFont); //设置样式 setBorderStyle(contentWriteCellStyle); // 水平居中 contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); // 垂直居中 contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER); //设置自动换行 contentWriteCellStyle.setWrapped(true); //设置单元格格式是:文本格式,方式长数字文本科学计数法 // contentWriteCellStyle.setDataFormatData(); //设置文本收缩至合适 // contentWriteCellStyle.setShrinkToFit(true); return contentWriteCellStyle; } /** * 边框样式 */ private static void setBorderStyle(WriteCellStyle cellStyle) { //设置底边框 cellStyle.setBorderBottom(BorderStyle.THIN); //设置底边框颜色 cellStyle.setBottomBorderColor(IndexedColors.BLACK1.getIndex()); //设置左边框 cellStyle.setBorderLeft(BorderStyle.THIN); //设置左边框颜色 cellStyle.setLeftBorderColor(IndexedColors.BLACK1.getIndex()); //设置右边框 cellStyle.setBorderRight(BorderStyle.THIN); //设置右边框颜色 cellStyle.setRightBorderColor(IndexedColors.BLACK1.getIndex()); //设置顶边框 cellStyle.setBorderTop(BorderStyle.THIN); //设置顶边框颜色 cellStyle.setTopBorderColor(IndexedColors.BLACK1.getIndex()); } }

自定义样式

如果要设置其他样式,可以在评论区提出来,或阅读源码。

 

java

复制代码

package com.penga.demo.util; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.write.handler.CellWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.write.metadata.holder.WriteTableHolder; import org.apache.poi.ss.usermodel.*; import java.util.List; public class DigitalProductCellWriteHandler implements CellWriteHandler { @Override public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { int rowIndex = cell.getRowIndex(); int columnIndex = cell.getColumnIndex(); String sheetName = cell.getSheet().getSheetName(); if (rowIndex == 1 && columnIndex == 0) { // 设置表头统计的样式,由于单元格是合并的,只设置第一列就行了 setTotalStyle(writeSheetHolder, cellDataList, cell); return; } if (!isHead) { // 内容样式处理 Workbook workbook = cell.getSheet().getWorkbook(); if (sheetName.equals("手机")) { // 判断是否为”手机“sheet if (columnIndex == 3) { // 判断价格 // 注意,这里的 cell.get**Value 有多个方法,一定要准确,否则会报错,报错后不会再进入这个拦截器,直接导出了 // 如果无法准确判断应该用哪个 getValue,可以 debug 测试 double value = cell.getNumericCellValue(); if (value > 5000.00) { // 字体样式改为红色 CellStyle cellStyle = getContentCellStyle(workbook, IndexedColors.WHITE.getIndex(), IndexedColors.RED.getIndex()); //设置当前单元格样式 cell.setCellStyle(cellStyle); // 这里要把 WriteCellData的样式清空 // 不然后面还有一个拦截器 FillStyleCellWriteHandler 默认会将 WriteCellStyle 设置到cell里面去 会导致自己设置的不一样 cellDataList.get(0).setWriteCellStyle(null); } } else if (columnIndex == 4) { // 判断CPU String value = cell.getStringCellValue(); if (value.contains("骁龙8 Gen3")) { // 背景改为黄色 CellStyle cellStyle = getContentCellStyle(workbook, IndexedColors.YELLOW.getIndex(), IndexedColors.BLACK.getIndex()); cell.setCellStyle(cellStyle); cellDataList.get(0).setWriteCellStyle(null); } } } else { // ”电脑“sheet if (columnIndex == 2) { // 判断价格 double value = cell.getNumericCellValue(); if (value > 10000.00) { // 字体样式改为红色 CellStyle cellStyle = getContentCellStyle(workbook, IndexedColors.WHITE.getIndex(), IndexedColors.RED.getIndex()); cell.setCellStyle(cellStyle); cellDataList.get(0).setWriteCellStyle(null); } } else if (columnIndex == 4) { String value = cell.getStringCellValue(); if (value.contains("RTX 4090")) { // 背景改为蓝色 CellStyle cellStyle = getContentCellStyle(workbook, IndexedColors.LIGHT_BLUE.getIndex(), IndexedColors.BLACK.getIndex()); cell.setCellStyle(cellStyle); cellDataList.get(0).setWriteCellStyle(null); } } } } } private CellStyle getContentCellStyle(Workbook workbook, short ffColorIndex, short fontColorIndex) { // 单元格策略 CellStyle cellStyle = workbook.createCellStyle(); // 设置背景颜色 cellStyle.setFillForegroundColor(ffColorIndex); cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 设置垂直居中为居中对齐 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 设置左右对齐为居中对齐 cellStyle.setAlignment(HorizontalAlignment.CENTER); // 自动换行 cellStyle.setWrapText(true); // 设置边框 setBorderStyle(cellStyle); // 字体 Font font = workbook.createFont(); //设置字体名字 font.setFontName("宋体"); //设置字体大小 font.setFontHeightInPoints((short) 10); // 设置字体颜色 font.setColor(fontColorIndex); //字体加粗 font.setBold(false); //在样式用应用设置的字体 cellStyle.setFont(font); return cellStyle; } private void setTotalStyle(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell) { Workbook workbook = cell.getSheet().getWorkbook(); //设置行高 writeSheetHolder.getSheet().getRow(cell.getRowIndex()).setHeight((short) (1.4 * 256 * 2)); // 单元格策略 CellStyle cellStyle = workbook.createCellStyle(); // 设置背景颜色灰色 cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 设置垂直居中为居中对齐 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 设置左右对齐为靠右对齐 cellStyle.setAlignment(HorizontalAlignment.RIGHT); // 自动换行 cellStyle.setWrapText(true); // 设置边框 setBorderStyle(cellStyle); // 字体 Font font = workbook.createFont(); //设置字体名字 font.setFontName("微软雅黑"); //设置字体大小 font.setFontHeightInPoints((short) 10); //字体加粗 font.setBold(false); //在样式用应用设置的字体 cellStyle.setFont(font); //设置当前单元格样式 cell.setCellStyle(cellStyle); // 这里要把 WriteCellData的样式清空 // 不然后面还有一个拦截器 FillStyleCellWriteHandler 默认会将 WriteCellStyle 设置到cell里面去 会导致自己设置的不一样 cellDataList.get(0).setWriteCellStyle(null); } /** * 边框样式 */ private static void setBorderStyle(CellStyle cellStyle) { //设置底边框 cellStyle.setBorderBottom(BorderStyle.THIN); //设置底边框颜色 cellStyle.setBottomBorderColor(IndexedColors.BLACK1.getIndex()); //设置左边框 cellStyle.setBorderLeft(BorderStyle.THIN); //设置左边框颜色 cellStyle.setLeftBorderColor(IndexedColors.BLACK1.getIndex()); //设置右边框 cellStyle.setBorderRight(BorderStyle.THIN); //设置右边框颜色 cellStyle.setRightBorderColor(IndexedColors.BLACK1.getIndex()); //设置顶边框 cellStyle.setBorderTop(BorderStyle.THIN); //设置顶边框颜色 cellStyle.setTopBorderColor(IndexedColors.BLACK1.getIndex()); } }

❗️设置自定义样式后,一定要将原来的样式清空(cellDataList.get(0).setWriteCellStyle(null);),否则会导致自定义的样式设置不进去

自动列宽

这个方法也不太准确,有的情况下列会特别宽,如果有更好的方法,欢迎在评论区指出😄

 

java

复制代码

package com.penga.demo.util; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy; import org.apache.poi.ss.usermodel.Cell; import java.util.HashMap; import java.util.List; import java.util.Map; public class CustomHandler extends AbstractColumnWidthStyleStrategy { /** * 最大列宽 */ private static final int MAX_COLUMN_WIDTH = 255; private static final Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<>(8); public CustomHandler() { } @Override protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { boolean needSetWidth = isHead || !CollectionUtil.isEmpty(cellDataList); if (isHead) { // 如果不是最后一个表头,则不改变列宽 List<String> headNameList = head.getHeadNameList(); if (CollectionUtil.isNotEmpty(headNameList)) { int size = headNameList.size(); if (!cell.getStringCellValue().equals(headNameList.get(size - 1))) { return; } } } if (needSetWidth) { Map<Integer, Integer> maxColumnWidthMap = CACHE.computeIfAbsent(writeSheetHolder.getSheetNo(), k -> new HashMap<>(16)); Integer columnWidth = this.dataLength(cellDataList, cell, isHead); if (columnWidth >= 0) { if (columnWidth > MAX_COLUMN_WIDTH) { columnWidth = MAX_COLUMN_WIDTH; } Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex()); if (maxColumnWidth == null || columnWidth > maxColumnWidth) { maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth); writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256); } } } } private Integer dataLength(List<WriteCellData<?>> cellDataList, Cell cell, Boolean isHead) { if (isHead) { return cell.getStringCellValue().getBytes().length; } else { WriteCellData<?> cellData = cellDataList.get(0); CellDataTypeEnum type = cellData.getType(); if (type == null) { return -1; } else { switch (type) { case STRING: return cellData.getStringValue().getBytes().length; case BOOLEAN: return cellData.getBooleanValue().toString().getBytes().length; case NUMBER: return cellData.getNumberValue().toString().getBytes().length; case DATE: return cellData.getDateValue().toString().getBytes().length; default: return -1; } } } } }

导出

使用API调试工具发送请求:

image.png

最终的导出效果如下:

image.png

image.png

image.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值