当前位置: 首页 > news >正文

芜湖弋江区最新消息沈阳seo优化排名公司

芜湖弋江区最新消息,沈阳seo优化排名公司,做论坛网站需要多大空间,寻找装修公司1 问题背景 需求要做一个导出excel的功能 2 前言 本篇着重阐述后端怎么实现,前端实现的部分只会粗略阐述。该实现方案是经过生产环境考验的,不是那些拿来练手的小demo。本文阐述的方案可以借鉴用来做毕设或者加到自己玩的项目中去。再次声明,…

在这里插入图片描述

1 问题背景

需求要做一个导出excel的功能

2 前言

  1. 本篇着重阐述后端怎么实现,前端实现的部分只会粗略阐述。该实现方案是经过生产环境考验的,不是那些拿来练手的小demo。本文阐述的方案可以借鉴用来做毕设或者加到自己玩的项目中去。
  2. 再次声明,本文是百万级数据量的企业级解决方案,不是学校里面的毕设或者自己搭环境玩玩的小demo。客户不会去一页一页地点击导出,本文阐述的是一键导出几千行甚至上万行的数据。如果本文与你了解到的方案有出入可以在评论区交流,像那种导出几行或十来行的方案就不要说了。
  3. 有读者在评论里提问“请教百万行能撑住吗?”笔者没有去验证,有兴趣或者有疑问的读者可以去验证下,本文的解决方案是导出几千或上万行数据。本文也只是想介绍电商生产环境中真实的需求以及真实的解决方案,如果要导出百万行,那就只能采用异步方式去进行导出了,文末有提供思路。

3 实现思路

  1. 后端查询要导出的数据,此处简称data
  2. 使用阿里的EasyExcel组件将data写到HttpServletResponse里面,返回指定的响应头、响应内容的类型、字符编码。响应出去的数据是二进制数据,此处简称bytes数据
  3. 前端使用前端框架提供的方法,将 bytes数据转成blob,然后生成下载地址,然后进行下载

4 后端实现

要引入阿里的EasyExcel依赖,此处不赘述

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.7</version></dependency>

下面是excel文件要保存的信息,需要指定列头

@Data
public class UserInfoVO {@ExcelProperty(value = "用户ID",index = 0)private Long id;@ExcelProperty(value = "用户姓名",index = 1)private String username;@ExcelProperty(value = "性别",index = 2)private String sex;
}

导出的伪代码如下:

  @PostMapping("/xx/xxx/xxx")public void export(HttpServletResponse reponse) {// 设置响应头等response.setHeader("Content-Disposition", "attachment;filename=" + "文件名(随便定义).xlsx");response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("UTF-8");// 查数据,假如要导出UserInfo的列表信息List<UserInfoVO> data = selectData();// 导出数据 EasyExcel.write(response.getOutputStream()).head(UserInfoVO.class).sheet().doWrite(data);}

5 设置Excel自适应列宽

思路:实现easyexcel提供的类并重写方法,写数据到HttpServletReponse的时候注册一个自适应列宽的bean

实现AbstractColumnWidthStyleStrategy类,如下所示:

public class CustomCellWriteWeightConfig extends AbstractColumnWidthStyleStrategy {private Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<>();@Overrideprotected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> cellDataList, Cell cell, Head head, Integer integer, Boolean isHead) {boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);if (needSetWidth) {Map<Integer, Integer> maxColumnWidthMap = CACHE.get(writeSheetHolder.getSheetNo());if (maxColumnWidthMap == null) {maxColumnWidthMap = new HashMap<>();CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);}Integer columnWidth = this.dataLength(cellDataList, cell, isHead);if (columnWidth >= 0) {if (columnWidth > 254) {columnWidth = 254;}Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex());if (maxColumnWidth == null || columnWidth > maxColumnWidth) {maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth);Sheet sheet = writeSheetHolder.getSheet();sheet.setColumnWidth(cell.getColumnIndex(), columnWidth * 256);}}}}/*** 计算长度* @param cellDataList* @param cell* @param isHead* @return*/private Integer dataLength(List<CellData> cellDataList, Cell cell, Boolean isHead) {if (isHead) {return cell.getStringCellValue().getBytes().length;} else {CellData cellData = cellDataList.get(0);CellDataTypeEnum type = cellData.getType();if (type == null) {return -1;} else {switch (type) {case STRING:// 换行符(数据需要提前解析好)int index = cellData.getStringValue().indexOf("\n");return index != -1 ?cellData.getStringValue().substring(0, index).getBytes().length + 1 : cellData.getStringValue().getBytes().length + 1;case BOOLEAN:return cellData.getBooleanValue().toString().getBytes().length;case NUMBER:return cellData.getNumberValue().toString().getBytes().length;default:return -1;}}}}
}

注册自适应列宽的组件:

EasyExcel.write(response.getOutputStream()).head(SubscriptionOrderExportResp.class)//  注册自适应列宽组件.registerWriteHandler(new CustomCellWriteWeightConfig()).sheet().doWrite(data);

6 方案优缺点

优点:实现简单,轻量级。能快速迭代上线 。

缺点:使用了同步方式返回数据,如果excel文件的数据量很多,那么将耗费很多时间,甚至http连接已经断开了还未响应出去。

改进:本文解决方案是采用了同步方式导出,实时返回excel文件。可以做一个异步方式,后端创建一个任务异步生成excel文件,然后文件上传到对象存储服务器。前端轮询任务是否完成,后端返回文件地址给前端下载。

http://www.hkea.cn/news/435323/

相关文章:

  • 做游戏网站有几个要素seo网站关键词优化报价
  • 蓬业东莞网站建设技术支持东莞做网站公司首选
  • 网站版式设计获客渠道有哪些
  • 今日军事新闻简短扬州seo优化
  • 国外好看的教育类网站模板下载东莞做网站最好的是哪家
  • 微擎与wordpress快速优化seo软件推广方法
  • 英文网站设计哪家好免费网站搭建
  • 网站建设公司 销量深圳谷歌seo公司
  • 新蔡哪有做网站建设的全球疫情今天最新消息
  • 怎么做平台网站百度seo报价方法
  • 帮人做网站 怎么收费怎么用网络推广
  • 网站排名优化建设百度广告投放技巧
  • 文件服务器网站搭建教程好的竞价托管公司
  • 黑龙江省城乡和住房建设厅网站首页百度链接地址
  • 网站模板修改工具专业seo关键词优化
  • 口碑好的句容网站建设yahoo搜索
  • 深圳网站建设外贸公司价格网络营销的背景和意义
  • 长春网站建设硕成传媒seo快速排名优化公司
  • web网站开发能使用c 吗免费建立个人网站申请
  • 织梦网站修改教程视频网站优化培训学校
  • 南沙区交通和建设局网站中国十大网络销售公司
  • 免费建设网站的方法百度网址大全 官网
  • 手机网站设计制作公司微信推广费用一般多少
  • 建设网站需要什么注册域名费用一般多少钱
  • 女性门户网站源码百度指数功能有哪些
  • 怎么帮公司做网站建设谷歌搜索引擎免费入口 香港
  • 请写出网站建设前期需要做的准备外贸定制网站建设电话
  • 南京门户网站建设网络营销优秀案例
  • 2012服务器如何做网站周口网络推广哪家好
  • 贵阳搜索玩的网站网络舆情软件免费入口