java通用xls导出设计

背景

在后端日常开发中总会有各种各样的导出需求,实现这个需求必须要解决的两个问题:

1、表头不能直接使用字段名,需要显示为中文,甚至还需要考虑国际化

2、值需要翻译,比如性别、状态之类的字段

现状

现在主流写的比较好的方法是定义一个对象,对象上用自定义的注解+easytrans

我的解决方案

定义要导入的字段

1、解决表头与字段的映射

2、表头加#进行后续split,解决翻译问题

{
    "parkls": {
        "parkname": "停车场",
        "carno": "车牌号",
        "intime": "进场时间",
        "outtime": "出场时间",
        "paytime": "支付时间",
        "parktime": "停车时长(单位:分钟)",
        "amt":"支付金额(单位:元)",
        "paytype":"支付方式#paytype",
        "paystatus":"支付状态#paystatus",
        "isrecharge":"是否重新计费#YN",
        "ismonthcard":"是否月卡抵扣#YN"        
    }
}
翻译
{
    "YN": {
        "Y": "",
        "N": ""
    },
    "paystatus": {
        "0": "待支付",
        "1": "已支付",
        "2": "已过期"
    },
    "paytype":{
        "0": "微信支付",
        "1": "月卡支付",
        "2": "现金",
        "3":"余额"
    }
}
加载配置
package com.xf.tools;

import java.io.File;
import java.io.FileNotFoundException;
import java.net.URL;
import java.nio.charset.Charset;

import cn.hutool.core.io.FileUtil;
import cn.hutool.json.JSONConfig;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.val;

public class ExcelDeal {

    public static JSONObject head;
    public static JSONObject trans;

    public synchronized static void load() throws FileNotFoundException {
        URL url = ClassLoader.getSystemResource("exporthead.json");
//        head = JSONUtil.readJSONObject(new File(url.getPath()), Charset.forName("utf-8"));
        String jsonstr = FileUtil.readString(new File(url.getPath()), Charset.forName("utf-8"));
        val config = JSONConfig.create().setOrder(true);
        head = JSONUtil.parseObj(jsonstr, config);
        url = ClassLoader.getSystemResource("trans.json");
//        trans = JSONUtil.readJSONObject(new File(url.getPath()), Charset.forName("utf-8"));
        jsonstr = FileUtil.readString(new File(url.getPath()), Charset.forName("utf-8"));
        trans = JSONUtil.parseObj(jsonstr, config);
    }
}
写xls

这个方法我就不上了,留点大家发挥的空间。

主要是分享下自已的思路,欢迎大家交流。

后台兼职接单中,联系我微信:wjf88520

一杯奶茶协助解决各类开发运维问题,欢迎交流

by wujf

mail:921252375@qq.com

本文转载于网络 如有侵权请联系删除

相关文章

  • 电脑软件:推荐八款电脑必备效率软件,值得收藏

    今天给大家推荐八款电脑必备效率软件,每一款都值得拥有。1、PowerToys微软官方效率神器PowerToys是Windows官方出品的一个效率神器,软件包含了多个实用功能。最常用的是PowerToysRun:快速快捷启动应用程序或者打开浏览器进行搜索,大家可自定义快捷键。第二个实用功能FancyZones窗口布局自由设定:当运行多窗口时可以按照自己设定的大小布局排列,非常实用。PowerToys有十多个实用小功能,其余的功能大家可以自己下载研究,并且该软件属于微软官方软件免费开源无广告。2、Ditto剪切板神器Ditto是一个剪切板增强工具,使用的时候可以快捷键ctrl+`可以调出程序面板。Ditto对于那些经常写文案和做自媒体的朋友简直来说太实用了。3、AnyTXTSearcher文本搜索神器AnyTXTSearcher是一款免费且非常强大的文本搜索神器,比Windows自带的搜索功能好太多了,AnyTXTSearcher内置了强大的文档解析引擎,不用安装其他软件即可提取日常文档格式的文本,结合内置的高速索引系统来存储文本的元数据,使用AnyTXTSearcher可以快速查找电脑上

  • 更便捷的goroutine控制利器- Context

    首先要和大家说声抱歉哈,由于工作上、生活上的某些琐事,以至于造成本节的断更。不过请不要悲伤。因为我在这期间也是做过详细的复习的。我相信一定会让你有更加深入的理解,同时也欢迎你向我提出不足。我们共同进步。话不多说,我相信你已经迫不及待了。还在等什么?let‘sGO在本文中,我首先会介绍context是什么,它有什么作用,以及如何使用,其中还会参杂一点个人的理解,以及部分源码的了解。Whatareyouwaitingfor?Context:来自官方文档Context包定义了上下文类型,该类型在API边界之间以及进程之间传递截止日期,取消信号和其他请求范围的值对服务器的传入请求应创建一个Context,而对服务器的传出调用应接受一个Context。它们之间的函数调用链必须传播Context,可以选择将其替换为使用WithCancel,WithDeadline,WithTimeout或WithValue创建的派生Context。取消上下文后,从该上下文派生的所有上下文也会被取消。WithCancel,WithDeadline和WithTimeout函数采用Context(父级)并返回派生的Co

  • 你还在等NVIDIA Xavier NX么?那就先买Jetson NANO开发套件吧

    去年11月,NVIDIA发布了新一代嵌入式模组:XavierNX(NVIDIAJetson家族又添新成员,老黄一出手就知有没有!)。当时说会在今年3月份上市。按照我们对NV的了解,不出意外会在NVIDIA美国GTC大会后就全面上市了! 于是就有不少开发者说:那我等NX上市吧让我们回顾一下NX的规格:注意NX跟Xavier一样,支持Int8、FP16,还具备DLA硬件加速性能相比JetsonNANO,JetsonTX2如何呢?一句话:NX体积很小,功耗不高,性能比TX2要好!但是——NVIDIA说发布的是NX模组,是模组,是模组!不是开发套件!就好像你买个单独的芯片回去是没用的.....这个模组的价格是399美金!所以你还需要载板!没有载板就用不起来!Lady我也特别跟NVIDIA求证,是否会发布NX开发套件。NV给我的答复是:Wedon'thaveinformationtoshareaboutthatatthistime.TheXavierNXmodulewillbeabletobeusedfromtheB01-revisionJetsonNanoDeveloperKit(P

  • Faster R-CNN 目标检测体验篇

    上次我们分享了目标检测One-Stage的代表YOLO,从体验、理论到代码实战。其实One-Stage还有一个代表是SSD,这个等到下一次我们再讲解,因为SSD涉及到部分Two-Stage目标检测的知识。本期我们分享的是Two-Stage的代表作FaterR-CNN,这是属于R-CNN系列中比较经典的一个,目前比较流行。今天我们就带大家体验一把FasterR-CNN的检测,代码不多。代码说明我们代码使用的是Pytorch提供的目标检测模型fasterrcnn_resnet50_fpnmodel=torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)复制模型预测后得到的结果是Boundingboxes[x0,y0,x1,y1]边框的四个值Labels所有预测的标签Scores所有标签的分数以下就是本次内容的所有代码:importtorchvision#0.3.0version这里指的是所使用包的版本 fromtorchvisionimporttransformsasT importcv2#4.1.1ver

  • taro+react导航条组件/自定义底部Tabbar导航

    最近在研究taro框架技术,发现官方提供的实例基本都是H5、小程序,对于RN端实例甚少,如是自己就实现了自定义导航栏+tabbar组件,支持自定义背景、颜色、左侧图标、标题居中、搜索框,右侧按钮支持图标/文字/图片,还可以设置样式,红点提示、事件处理三端效果图Taro引入阿里字体图标Iconfont下载阿里字体图标,然后复制fonts文件夹到项目下,将iconfont.css复制一份改为iconfont.scss引入图标:import'./styles/fonts/iconfont.scss'h5、小程序下这种写法即可:<TextclassName="iconfonticon-back"></Text>不过为了兼容RN,只能通过Unicode方式这样写:<TextclassName="iconfont">&#xe84c;</Text>通过变量传递:letback='\ue84c'<Text>{back}</Text>Taro自定

  • 上万条数据解析微博热搜背后的故事!

    关于新浪微博,向来都是各路吃瓜群众聚集之地,大家在微博中可以尽情吃瓜,各种类型的瓜应有尽有,只有你想不到的,没有你吃不到的。微博热搜榜更是各路明星的“必争之地”,能够上热搜也是代表了其知名度,“包月热搜套餐”,“买热搜”是否存在迄今也是一个未解之谜除了吃瓜群众,新浪微博也聚集着一群被整个互联网圈所同情的一群苦逼程序员,每当有明星放出新闻,特别是结婚、离婚、分手、恋爱这类婚恋题材,新浪微博程序员都会严阵以待,此时的服务器会因为吃瓜群众的大量涌入而变得脆弱起来,随时有崩溃的风险,下图就是一张此前广为流传的程序员在自己婚礼处理服务器崩溃的经典图片:我们此次通过爬取2019年2W+条热搜数据,包括内容以及搜索指数,为大家揭开微博热搜2019的诸多秘密,一起利用数据“硬核吃瓜”,包括:2019微博热搜最大的瓜,微博程序员集体加班的日子,微博热搜的常客,热搜里的2019互联网……瓜源获取我们此次并没有直接去爬取微博的原始数据,而是从一个专门记录微博热搜历史数据的网站获取,网站界面如下: 通过网站的数据接口,我们获取到了今天1月1日至今的2W多条数据,爬取代码如下:resou=pd.DataFram

  • Oceanus:基于Apache Flink的一站式实时计算平台

    FlinkForward是由Apache官方授权,用于介绍Flink社区的最新动态、发展计划以及Flink相关的生产实践经验的会议。2018年12月20日,FlinkForward首次来到中国举办。腾讯TEG数据平台部参加了会议并在会上介绍了腾讯内部基于Flink打造的一站式实时计算平台Oceanus。一、背景介绍TEG实时计算团队作为腾讯内部最大的实时数据服务部门,为业务部门提供高效、稳定和易用的实时数据服务。其每秒接入的数据峰值达到了2.1亿条,每天接入的数据量达到了17万亿条,每天的数据增长量达到了3PB,每天需要进行的实时计算量达到了20万亿次。近年来大数据技术的发展,特别是HDFS和HBase这些大数据存储系统以及Hadoop和Spark这些大数据计算系统,已经使人们能较好地处理数据规模的问题。但是人们对于数据内在价值的追求是无止境的。一方面,人们开发了越来越多复杂的数据挖掘算法来发现数据更深层次的关系信息;而另一方面,由于数据价值往往随着时间的流逝而消失,人们对数据分析时效性的要求也越来越高。越来越多的业务开始使用实时计算来及时获取数据反馈。之前实时计算团队基于Apache

  • Spring Security 实战 - Remember me

    有个用户初访并登录了你的网站,然而第二天又来了,却必须再次登录 于是就有了“记住我”这样的功能来方便用户使用,然而有一件不言自明的事情,那就是这种认证状态的”旷日持久“早已超出了用户原本所需要的使用范围 这意味着,他们可以关闭浏览器,然后再关闭电脑,下周或者下个月,乃至更久以后再回来,只要这间隔时间不要太离谱,该网站总会知道谁是谁,并一如既往的为他们提供所有相同的功能和服务——与许久前他们离开的时候别无二致。 1基本原理用户认证成功之后调用RemeberMeService根据用户名名生成Token由TokenRepository写到数据库,同时也将Token写入到浏览器的Cookie中重启服务之后,用户再次登入系统会由RememberMeAuthenticationFilter过滤,从Cookie中读取Token信息,与persistent_logins表匹配判断是否使用记住我功能最后由UserDetailsService查询用户信息2实现2.1建表2.2登陆页面添加记住我复选框name须为remeber-me2.3配置MerryyouSecurityConfig3效果4源码分析4.1

  • 2个基于TensorFlow的Github开源项目,1篇TensorFlow的概念和方法梳理文章

    介绍2个非常接地气的Github开源项目,都是基于TensorFlow框架开发的,通过练习这些项目,能很快提升使用TF的能力,同时加深理解常用的神经网络结构。Char-RNN-TensorFlowMulti-languageCharRNNinTensorFlow.YoucanusethiscodetogenerateEnglishtext,Chinesepoetriesandlyrics,Japanesetextandtextinotherlanguage.一个基于最新版本TensorFlow的CharRNN实现。可以实现生成英文、写诗、歌词、小说、生成代码、生成日文等功能。本项目使用了TF中的API:RNN,LSTM网络,项目练习起到加深对这些网络的原理理解,同时,熟悉TF中训练网络的套路,对于找工作很有好处。如下为实现的诗歌,每行字数不同。我知道 我的世界一种解 我一直实现语不是我 有什么(客)我只是一口 我想想我不来你的微笑 我说你我你的你 只能有我一个梦的 我说的我的 我不能再想 我的爱的手一点有美 我们你的我你不会再会爱不到还支持其他多种语言输出。项目的Github地址:h

  • iOS 远程推送注册的小问题

    iOS8有了新方法,用新方法后,用7.0版本运行会奔溃。只要加一句判断就ok:#ifdef__IPHONE_8_0 //在iOS8下注册苹果推送,申请推送权限。 UIUserNotificationSettings*settings=[UIUserNotificationSettingssettingsForTypes:(UIUserNotificationTypeBadge |UIUserNotificationTypeSound |UIUserNotificationTypeAlert)categories:nil]; [[UIApplicationsharedApplication]registerUserNotificationSettings:settings]; #else //注册苹果推送,申请推送权限。 [[UIApplicationsharedApplication]registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeAlert|UIRemo

  • 找不到交互设计实例?看这里!

    现在很多优秀的网站、移动应用中都广泛的使用到交互设计。网络上也有很多相关的文章,例如什么是交互设计,交互设计的流程是怎样的?但是设计从来不是空谈,理论和实际的碰撞,才能激发出更多的灵感。以下是我自己总结出来的10个优秀的交互设计实例(APP,网页),希望对你们有帮助。移动应用交互设计实例1.3D立体展示图片列表以立体展示的方式呈现所有的图片内容。左侧时间轴会根据滑动图片时的停留,显示对应图片的拍摄时间。最终停留的图片会在界面中部完全显示。2.上下滑动切换的卡片化图片展示这个案例中采用了卡片式设计,通过上下滑动切换图片。卡片式的设计不仅能给人很好的视觉一致性,而且更易于设计上的迭代。图文混排的模式,既在视觉上做到尽量一致,又很好的平衡文字和图片的强弱。卡片化和上下滑动的交互结合也是一个不错的效果。3.富有星空元素的搜索页导航页面融入星空元素,每一个图标代表不同的导航功能。在页面上滑动导航图标,被选中的图标自动放大尺寸,其他图标则自动变换位置和大小。交互设计的优势在炫酷简洁的星空元素中发挥到极致。4.数据化的创意设计APP 这款文件管理应用将所有文件的存储量以数据化的方式呈现,直观简洁,一

  • nginx 反向代理 nacos2.1.1集群 报错Request nacos server failed:

     报错信息如下:com.alibaba.nacos.api.exception.NacosException:Requestnacosserverfailed: atcom.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.requestToServer(NamingGrpcClientProxy.java:288)~[nacos-client-2.1.0.jar:na] atcom.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.doSubscribe(NamingGrpcClientProxy.java:229)~[nacos-client-2.1.0.jar:na] atcom.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.subscribe(NamingGrpcClientProxy.java:214)~[nacos-client-2.1.0.jar:n

  • 实战 | 记一次攻防演练中的溯源经历

    缘起在今年的攻防期间,通过安全设备告警分析,需要对某个源攻击IP进行溯源反制,并且需要记录整个溯源过程和提交溯源报告。开展溯源研判在溯源之前,首先应该判断是否真的存在攻击行为,攻击的特征,攻击类型,攻击者意图都是需要搞清楚的,不能盲目地对某个IP就展开溯源,这样不仅方向跑偏了,又浪费了时间。经过研判分析,判断IP(106.14.x.x)确实存在恶意攻击,这里就不再叙述如何研判的了,经验丰富的师傅们一看就知道了,确定IP之后,作为防守方需要站在攻击者的角度去溯源,用攻击者的思维还原整个攻击过程,这样更有利于溯源。溯源信息收集威胁情报信息收集 通过微步情报中心分析得出是未知安全,估计是没来得及做更新,于是换其他情报中心测试。果然,通过其他情报中心验证,此IP存在恶意攻击行为。IP反查域名在前面威胁情报收集之后,该IP是阿里云的一台云服务器,推测应该属于个人的服务器,于是对IP反查绑定的域名,若存在域名,便可以查询域名备案信息,从而溯源到攻击者。IP反查得到最近绑定的三个域名,需要验证这三个域名是否解析到攻击源IP。为什么要验证呢?因为有些攻击者攻击完之后,会故意将域名解析的IP进行更换,这

  • 最长上升子序列的二分优化

    http://blog.csdn.net/wall_f/article/details/8295812 作者写的太好了,转载一下~ 我简单总结一下,我的理解。 最长上升子序列的转移方程:b[k]=max(max(b[j]|a[j]<a[k],j<k)+1,1); 其优化主要在求解当前最长长度是要查找前面的b数组中是否有最大的值,且当前期a[j]<a[k],因此就是要找小于当前值的最大值。 所以我们一般需要从1~k-1扫描一遍找到最大值,复杂度为o(n^2),耗时太长。 因此我们可以直接记录下来,0-k的所有b[k]值便于查找。 二分优化的思想就是,数组下标作为长度,值记录符合当前条件长度的序列最后一位的最小值。 因为很明显长度越长,则其最小位置一定比前面的都大。所以序列保持单调递增。因此当一个数字加进来的时候,我们就用二分查找他的前面的符合条件的下标值即可。 如果找的到,说明符合条件,那么就判断一下,长度为d[j]+1时当前值是否是符合条件的最小值,即求min{a[k],S[d[j]+1]} 最后求出所有d[i]的最大值即可。 我觉得好神奇啊~

  • 64_r2

    ruby-gnomecanvas2-0.90.4-7.fc26.3.x86_64.rpm13-Feb-201708:0075794 ruby-gnomecanvas2-devel-0.90.4-7.fc26.3.i686.rpm13-Feb-201708:0117406 ruby-gnomecanvas2-devel-0.90.4-7.fc26.3.x86_64.rpm13-Feb-201708:0117390 ruby-gnomevfs-0.90.4-7.fc26.3.x86_64.rpm13-Feb-201708:0154018 ruby-gnomevfs-devel-0.90.4-7.fc26.3.i686.rpm13-Feb-201708:0117390 ruby-gnomevfs-devel-0.90.4-7.fc26.3.x86_64.rpm13-Feb-201708:0017378 ruby-gtkglext-0.90.4-7.fc26.3.x86_64.rpm13-Feb-201708:0146538 ruby-gtkglext-devel-0.90.4-7.fc26.

  • 与或非 实习day09

    今天也是第九天了好快呀!   今天也是九点到十点半看浏览器工作原理:            三个大的进化路线,希望能让你了解目前的Web应用到底能做什么,以及未来能适用于那些新领域知道浏览器是如何工作的就可以知道怎么去优化我们的界面 让我们的服务渲染更加的好      Chrome启动了4个进程,你也许会好奇,只是打开了1个页面,为什么要启动这么多进程呢? 进程和线程 什么是并行处理 计算机中的并行处理就是同一时刻处理多个任务,比如我们要计算下面这三个表达式的值,并显示出结果 多线程可以并行处理任务,但是线程是不能单独存在的,它是由进程来启动和管理的。那什么又是进程呢?   讲得还可以,就是篇幅会有点大,以后慢慢看吧 可以每天看一点吧这个东西。浏览器工作原理 现在还是得整理计算器还有过一下微信小程序的文档的东西   文档的东西在:E:\BaiduNetdiskDownload\81-浏览器工作原理与实践   阮一峰的:http://es6.ruanyif

  • 基于Spark和Tensorflow构建DCN模型进行CTR预测

    实验介绍 数据采用CriteoDisplayAds。这个数据一共11G,有13个integerfeatures,26个categoricalfeatures。 Spark 由于数据比较大,且只在一个txt文件,处理前用split-l400000train.txt对数据进行切分。 连续型数据利用log进行变换,因为从实时训练的角度上来判断,一般的标准化方式,如Z-Score和最大最小标准化中用到的值都跟某一批数据的整体统计结果有关,换一批数据后标准化就程度就不一样了。 而对于离散型分类数据,一般企业应该都会有类别表而不需要自己从数据中获取(这样能节省计算时间,而且流处理下只能针对特定批量或者时间段出现的数据进行数字编码,所以对超出该批量和时间的新类别就无法进行编码了)。虽然如此,如果在离线情况且真的需要自己从数据中提取类别并进行编码,比如现在这种情况,最直接的方法是使用ML模块的StringIndexer。这个工具方面使用,但是对于数据类别过多或者需要进行编码的列数量较多时容易出现OOM。通过StringIndexer的源码可以知道,它的实现是先利用rdd的countByValue得

  • git:rebase的原理

    git:rebase的原理 前提: 在最近的项目中,我碰到这样一个情况:第一版app上线之后,团队紧接着进行第二版本的开发,由于团队成员对git使用不熟悉,所以开发的每一次提交都是往远端master分支上提交。 第一版本打包上线之后,我想让后续的开发中master分支保持代码高可用性,于是在远端建立新的分支second_version用于第二版本的开发,到时候再合并到master分支上,奈何有的团队成员不会提交远程其他分支,导致master被污染(如下图) 由于团队成员对git的熟练程度不同,有的使用可视化工具提交,有的使用命令行(比如我),当使用merge的时候会出现如上图所示的问题,点线图错综复杂,原因是在merge时会将本地的提交与拉取的提交融合成新的提交,也就是如图所示的Mergeremote-trackingbranch...,并且会将所有的提交显示在点线图上,十分混乱。但是使用rebase的时候,点线图则会很优雅: 点线图是一条直线。网上有很多关于rebase和merge的区别解释,以下分享的是我自己对rebase的观点,希望可以帮助大家理解。 rebase原理

  • 前端页面部署之后更新缓存

    前端页面部署更新之后,因为缓存问题,用户正在浏览的页面或者收藏夹中直接访问,页面在不刷新更新缓存的情况下,用户不知道页面是否有更新 解决方案: 服务端支持: 1.服务端给予一个版本号的返回接口,定时器轮询时间长一些,询问是否更新 2.socket,推送消息 3.服务端做个中间件拦截用户一些请求,判断它携带的版本 不需要支持: 1.在编译的时候自己生成一个js文件,作为版本监控,然后前端用jsonp去请求这个js,判断是否有更新。   这里主要是前端不需要服务端支持的情况下   1.思路:在打包的时候,生成版本号,使用jsonp的方式请求获取版本号,   2.第二次有更新时,打包生成版本号与上一个版本进行对比,若不一样就提醒用户有更新,执行reload刷新页面,进而更新缓存 constfs=require('fs') constpath=require('path') //打包的时候生成版本号 if(isProduction){ varversion1=newDate().getTime() varcontent="getVersion('"+version1+"')

  • react简书

    开发项目之前的准备 https://www.chromefor.com/ 登录此网站下载相关crxreact插件不然要FQ 下载ReactDeveloperTools谷歌插件下载ReduxDevTools插件 npminstallaxios  //安装axios npminstall--savestyled-components 安装css.js npminstallreact-transition-group--save安装动画插件 npminstall--saveredux安装redux  npminstall--savereact-redux安装react-redux方便在react中使用redux npminstall--save-devredux-devtools-extension  增加Redux-DevTools调试 npminstallimmutable 用来辅助state的不改变state的原始值 npminstallredux-immutable用来进阶辅助 不改变state

  • Mvc Swagger报错的解决办法。

    报错信息:NotsupportedbySwagger2.0:Multipleoperationswithpath‘xxxx.aspx’ andmethod'POST'  解决办法出处:https://stackoverflow.com/questions/39706508/swagger-not-supported-by-swagger-2-0-multiple-operations-with-path 解决办法: 第一步:找到SwaggerConfig页面,引用:usingSystem.Linq; 第二步: 找到大概175行的代码,是注释状态,取消注释。再执行可以解决。 c.ResolveConflictingActions(apiDescriptions=>apiDescriptions.First());  

相关推荐

推荐阅读