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

人才网站建设方案做网站gzip压缩

人才网站建设方案,做网站gzip压缩,四川政务服务网,医院网站建设利法拉网络作者#xff1a;你在我家门口来源#xff1a;https://juejin.im/post/5c6b6b126fb9a04a0c2f024f前言公司项目最近有一个需要#xff1a;报表导出。整个系统下来#xff0c;起码超过一百张报表需要导出。这个时候如何优雅的实现报表导出#xff0c;释放生产力就显得很重要了…作者你在我家门口来源https://juejin.im/post/5c6b6b126fb9a04a0c2f024f前言公司项目最近有一个需要报表导出。整个系统下来起码超过一百张报表需要导出。这个时候如何优雅的实现报表导出释放生产力就显得很重要了。下面主要给大家分享一下该工具类的使用方法与实现思路。实现的功能点对于每个报表都相同的操作我们很自然的会抽离出来这个很简单。而最重要的是如何把那些每个报表不相同的操作进行良好的封装尽可能的提高复用性针对以上的原则主要实现了一下关键功能点导出任意类型的数据自由设置表头自由设置字段的导出格式使用实例上面说到了本工具类实现了三个功能点自然在使用的时候设置好这三个要点即可设置数据列表设置表头设置字段格式下面的export函数可以直接向客户端返回一个excel数据其中productInfoPos为待导出的数据列表ExcelHeaderInfo用来保存表头信息包括表头名称表头的首列尾列首行尾行。因为默认导出的数据格式都是字符串型所以还需要一个Map参数用来指定某个字段的格式化类型(例如数字类型小数类型、日期类型)。这里大家知道个大概怎么使用就好了下面会对这些参数进行详细解释。实现效果源码分析哈哈自己分析自己的代码有点意思。由于不方便贴出太多的代码大家可以先到github上clone源码再回来阅读文章。✨源码地址✨LZ使用的poi 4.0.1版本的这个工具想要实用海量数据的导出自然得使用SXSSFWorkbook这个组件。关于poi的具体用法在这里我就不多说了这里主要是给大家讲解如何对poi进行封装使用。成员变量我们重点看ExcelUtils这个类这个类是实现导出的核心先来看一下三个成员变量。 private List list; private List excelHeaderInfos; private Map formatInfo;list该成员变量用来保存待导出的数据。ExcelHeaderInfo该成员变量主要用来保存表头信息因为我们需要定义多个表头信息所以需要使用一个列表来保存ExcelHeaderInfo构造函数如下ExcelHeaderInfo(int firstRow, int lastRow, int firstCol, int lastCol, String title)firstRow该表头所占位置的首行lastRow该表头所占位置的尾行firstCol该表头所占位置的首列lastCol该表头所占位置的尾行title该表头的名称ExcelFormat该参数主要用来格式化字段我们需要预先约定好转换成那种格式不能随用户自己定。所以我们定义了一个枚举类型的变量该枚举类只有一个字符串类型成员变量用来保存想要转换的格式例如FORMAT_INTEGER就是转换成整型。因为我们需要接受多个字段的转换格式所以定义了一个Map类型来接收该参数可以省略(默认格式为字符串)。public enum ExcelFormat { FORMAT_INTEGER(INTEGER), FORMAT_DOUBLE(DOUBLE), FORMAT_PERCENT(PERCENT), FORMAT_DATE(DATE); private String value; ExcelFormat(String value) { this.value value; } public String getValue() { return value; }}核心方法1. 创建表头该方法用来初始化表头而创建表头最关键的就是poi中Sheet类的addMergedRegion(CellRangeAddress var1)方法该方法用于单元格融合。我们会遍历ExcelHeaderInfo列表按照每个ExcelHeaderInfo的坐标信息进行单元格融合然后在融合之后的每个单元首行和首列的位置创建单元格然后为单元格赋值即可通过上面的步骤就完成了任意类型的表头设置。2. 转换数据在进行正文赋值之前我们先要对原始数据列表转换成字符串的二维数组之所以转成字符串格式是因为可以统一的处理各种类型之后有需要我们再转换回来即可。这个方法中我们通过使用反射技术很巧妙的实现了任意类型的数据导出(这里的任意类型指的是任意的报表类型不同的报表导出的数据肯定是不一样的那么在Java实现中的实体类肯定也是不一样的)。要想将一个List转换成相应的二维数组我们得知道如下的信息:二维数组的列数二维数组的行数二维数组每个元素的值如果获取以上三个信息呢通过反射中的Field[] getDeclaredFields()这个方法获取实体类的所有字段从而间接知道一共有多少列List的大小不就是二维数组的行数了嘛虽然每个实体类的字段名不一样那么我们就真的无法获取到实体类某个字段的值了吗不是的你要知道你拥有了反射你就相当于拥有了全世界那还有什么做不到的呢。这里我们没有直接使用反射而是使用了一个叫做BeanUtils的工具该工具可以很方便的帮助我们对一个实体类进行字段的赋值与字段值的获取。很简单通过BeanUtils.getProperty(list.get(i), columnNames.get(j))这一行代码我们就获取了实体list.get(i)中名称为columnNames.get(j)这个字段的值。list.get(i)当然是我们遍历原始数据的实体类而columnNames列表则是一个实体类所有字段名的数组也是通过反射的方法获取到的具体实现可以参考LZ的源代码。3. 赋值正文这里的正文指定是正式的表格数据内容其实这一些没有太多的奇淫技巧主要的功能在上面已经实现了这里主要是进行单元格的赋值与导出格式的处理(主要是为了导出excel后可以进行方便的运算)。导出工具类的核心方法就差不多说完了下面说一下关于多线程查询的问题。多扯两点1. 多线程查询数据理想很丰满现实还是有点骨感的。LZ虽然对50w的数据分别创建20个线程去查询但是总体的效率并不是50w/20而是仅仅快了几秒钟知道原因的小伙伴可以给我留个言一起探讨一下。下面先说说具体思路因为多个线程之间是同时执行的你不能够保证哪个线程先执行完毕但是我们却得保证数据顺序的一致性。在这里我们使用了Callable接口通过实现Callable接口的线程可以拥有返回值我们获取到所有子线程的查询结果然后合并到一个结果集中即可。那么如何保证合并的顺序呢?我们先创建了一个FutureTask类型的List该FutureTask的类型就是返回的结果集。List tasks new ArrayList();当我们每启动一个线程的时候就将该线程的FutureTask添加到tasks列表中这样tasks列表中的元素顺序就是我们启动线程的顺序。 FutureTask task new FutureTask(new listThread(map)); log.info(开始查询第{}条开始的{}条记录
http://www.huolong8.cn/news/15291/

相关文章:

  • 微网站内页百度推广下载安装
  • 坪洲网站建设泉州软件开发制作
  • 包装设计接单网站WordPress服务器应用镜像
  • 文山北京网站建设最好的国际贸易网站
  • 阿里巴巴国际站官网首页郑州快速建站模板
  • 大气微电影类网站织梦模板完整版登陆注册是静态网站
  • 网站弄论坛形式怎么做网站 pr
  • 宁安网站建设网络营销策划书的范文
  • 好网站建设公司九江网站制作
  • 做推广网站公司关键词排名点击软件工具
  • 镇江有哪些网站河北省住房和城乡建设厅网站主页
  • 那个做动态表情包的网站柏林网站建设
  • 网站建设 企业网站 框架科技企业网站设计
  • 自己建立网站多少钱电商平台开发需要哪些技术人员
  • 做了网站应该如何推广学做饺子馅上那个网站
  • 外贸必看网站关键词优化软件排行
  • 中国设计网官网图标seo如何优化图片
  • 做网站的去哪找私活百度网站下拉怎么做
  • 做美食网站视频株洲在线官网
  • wordpress 层实现seo网络推广知识
  • 网站后台 灰色经营网站需要什么资质
  • 网站建设分金手指排名十八软件定制开发网站
  • 98建筑网站创建论坛网站需要多少钱
  • 常州企业网站建设优设网免费素材
  • 网站用ps如何做句容市网站seo优化排名
  • 现在建设校园网站用什么软件wordpress的页面的
  • 网站开发后端怎么开发哪里长沙网站开发
  • 重庆商城网站建设地址东莞网站建设 环保设备
  • 陕西高速建设集团网站网站开发虚拟主机系统
  • 商标注册网站官网如何在本机搭建wordpress