- ?
“数据集成”提了那么多年,为什么还那么“乱”?
情丝
展开
专利技术解决非侵入式增量捕获难题,超30家部省单位、广泛行业应用,支持业内主流数据库及云数据库如Oracle、PG、阿里巴巴、华为全系列数据产品,单工作节点60MB/S处理能力,单节点TPS可达10W,支持超30种数据源,1键接入,0开发执行任务,0代码建立传输任务……
“17万行/秒的高速同步性能;快速场景化适配,小需求2天上线;自动化批量同步数据。”实现上述功能的,正是数梦工场的——DThink DataBridge数据集成平台(以下简称DataBridge),其数据集成处理功能性和性能经国家工业和信息化部电子科学技术情报研究所赛瑞评测中心严格测试,107项测试用例全部通过,单节点数据传输性能高达60MB/S。在某税务机关使用过程中,DataBridge一扫其工作人员每天数据同步、清分的痛苦,超出了该机关预期性能3倍以上,大获赞誉。
而在另一个大型国企使用过程中,其需要基于单位庞大的系统数据支撑掌上办事大厅和网上办事大厅并进行实时数据分析。如果用传统的触发器的方式,对实时增量数据进行集成分析,会对源数据库的读取性能造成较大影响。数梦工场DataBridge以专利技术——非侵入式增量数据捕获,实现多张百亿级大表每天超3000万条的增量数据高速同步,同等条件下性能超业界平均水平10倍以上,一举解决了长期困扰该企业的难题。
不仅如此,DataBridge同时支持多源异构数据转换,包括各大主流数据库和大数据平台,如Oracle、MySQL、GreenPlum等;支持与阿里云的RDS、DRDS和MaxCompute等组件的数据互通;支持华为数据产品FusionInsight LibrA;支持文件搬移与文件解析等。
因为支持多源异构、简单易用、高性能、高可靠等,DataBridge广泛应用于“互联网+政务服务”平台建设中,有利于促进互联网政务服务门户、政务服务管理平台、业务办理系统和政务服务数据共享平台各组成部分之间实现数据互联互通,形成业务流、信息流;极大助力数据集中和共享,有助于推进技术融合、业务融合、数据融合,实现跨层级、跨地域、跨系统、跨部门、跨业务的协同管理和服务。
产品介绍:DThink DataBridge数据集成平台
DThink DataBridge数据集成平台是数梦工场自主研发的、拥有完全自主知识产权的一款基于分布式架构的ETL数据集成产品。ETL是指:从不同结构的数据源中抽取数据(Extract),并对数据进行复杂的加工处理(Transform),最后将数据加载到各种存储结构中(Load)。
DataBridge包括数据源管理、转换管理、作业管理、运维监控、日志管理、用户管理和租户管理等功能模块。用户可以通过简单易用的Web界面,以拖拽点击的方式进行任务配置和监控管理界面操作,非常灵活地进行数据的截取、转换等操作,任务作业可以根据需要进行自动的周期性调度。轻松实现诸如数据同步、数据汇聚整合、数据分发和数据清洗等应用场景。
作为新型互联网的倡导者,数梦工场秉持“以云为基、数据环流、互联网+、安全可控”的新型互联网平台战略,研发创新方向涵盖云计算、大数据、人工智能等领域,基于新型互联网架构致力于数字中国建设。数梦工场DThink DataBridge数据集成平台是新型互联网架构中数据中台的重要组成部分,更是数据集成共享不可或缺的环节,能够一站式解决数据集成过程中的一系列难题,广受好评,堪称神器!
五大产品优势
1、多源异构
支持超30种数据源,一键接入,无需繁琐配置,0开发执行数据任务。
2、高性能
单工作节点的处理能力可达 60M/s,支持集群部署,性能随集群节点扩充性能近线性提升。
3、非侵入式增量数据获取
采用非侵入式增量数据捕获方式(专利技术),通过DataBridge同步获取源数据库的增量数据,且无需安装任何代理,不影响数据的读取性能。
4、简单易用,可视化运维
采用 B/S 架构,Web 拖拉拽配置和结果显示,0代码建立传输任务,降低运维人员的技术门槛,简单易用。一站式综合管控内部所有数据的交换进展,直观可视,打造数据交换的“管理驾驶舱”。
5、高可靠
采用多点部署方式,避免单点故障导致整个系统的不可用;在Web Service和任务调度的前端,部署了HA节点,提升平台的高可靠性;支持增量任务的断点续传。
DataBridge不仅仅可以应用于税务、审计、公安、电力等各级政务部门数据集成共享交换和企业数字化转型中,更多行业应用由你来定义。
- ?
DOTA2数据分析入门(一):获取数据源
水桃
展开
我决定再抬大家一手,把我做DOTA2数据分析以来,积累的经验、踩过的坑,写成这个系列文章...
序言:我是怎么转行做了数据分析师?(着急看课程的可以直接跳过)
2016年夏天,我和室友昊哥下班回到家,通常会一起操作几盘刀塔。
老年人连跪几把之后,到了「赢一把睡觉」的关键局,我们会默契的掏出开黑英雄组合——发条&沉默。昊哥选发条劣单,我玩沉默走中,6级后发条勾上去、沉默开大稳定秒一个(智力+2),4000分的鱼塘基本没输过。相处非常融洽。
一旦有比赛,场面就没有这么和谐了,昊哥是B神粉丝,我是CTY粉丝。大部分比赛都是各看各的,毫无交流。偶尔B神对阵CTY,也是同屏异梦,各怀鬼胎。
但是!谁也没有想到!TI6前大地震一波操作,最后的结果居然是BCHRS合体组成VG战队,开启了燃烧的远征。听到这个消息,我和昊哥一下子就激动了!B神和CTY成了队友,我们两个小粉丝可以愉快的支持同一只战队了!
除了摇旗呐喊,我们两个码农决定做一个小软件——「BP助手」,统计各个队伍的BP特点(展示英雄协作和克制关系),想为燃烧军团出一份力...结果第二天昊哥接到一个新的工作任务,鸽了...我一个电子科大计院的水硕,离开浙大牛硕的支持,进展缓慢。
后来的事情大家都知道了——承载着万千粉丝希望的燃烧军团,一路披荆斩棘,却倒在了最后一战,抱憾离开TI6的赛场。(CTY曾回顾这段经历:作彼此的宝搞。)然而神奇的是,我对DOTA2数据分析的热情,并没有随着燃烧军团的失败而褪去,反而愈来愈高。从此之后,我没有再玩过一局刀塔,而是把以前拿来玩DOTA2的时间,全部用来学习数据分析(以DOTA2职业比赛为数据源),年底转行做了一名商业数据分析师。
在这一年半中,我用空余时间写了数十篇DOTA2数据分析文章。承蒙大家抬爱,阅读量不错,粉丝过十万,竟也成了自媒体。慢慢就有很多人私信我,问我如何学习数据分析。
点击图片查看大图
我很想好好回答这些问题,不辜负大家的信任。但是一方面零基础入门数据分析需要学习的东西很多,三言两语讲不清楚;另一方面我做数据分析师才一年,才疏学浅也不敢造次。
正巧当时「优达学城」的中国区负责人看到《TI7伤害之王》后找到我(这位兄弟也是doter),希望让我做数据分析课程的明星学员,体验并给出建议。深度了解之后,我觉得这个在线课程的课程质量、代码批阅、项目过关和学习氛围都挺不错。于是找优达学城订制了「DOTA2」专属优惠码,把数据分析师(入门)课程课程推荐给大家。
到目前为止,已经有数十人使用DOTA2优惠码报名了课程,而且学得不错。所以,我决定再抬大家一手,把我做DOTA2数据分析以来,积累的经验、踩过的坑,写成这个系列文章,让各位电子竞技爱好者在学习数据分析的时候,多一个参考~
现在开始上课。DOTA2数据分析入门(一):获取数据源
适合阅读本系列文章的读者
正在优达学城学习数据分析课程,同时又对电子竞技感兴趣的朋友
热爱DOTA2,想给自己点一个「数据分析」技能的朋友
本节课学完之后,你能回答这些问题
统计kpii场均要发几次:>漂亮。
各战队BP的核心英雄是哪些?
几只顶尖战队的资源分配有什么差异?
给XX选手的第一条建议。
其他任何你觉得有意思的问题。
一、如何获取DOTA2数据源
获取DOTA2数据源的方式大致有四种:
手工统计。打开DOTA2客户端,看赛后统计或者游戏录像, 拿小本本(excel)手工记录。缺点:效率太低。
查询数据统计网站(DOTABUFF\DOTAMAX\刀魔数据等)。缺点:无法获取特定(定制)数据,可能你想看的数据网站并没有展示,也很难对数据进行再加工。
调用官方和第三方提供的数据接口API,或者查询第三方数据库【这是我们今天要学的】。缺点:门槛略高,需要掌握SQL(Structured Query Language)和python。另外API一般不会提供游戏细节数据(比如,只能告诉你肉山被杀了几次,而无法告诉你击杀肉山的最后一下伤害是多少)
解析录像。计算机代替人眼把游戏录像从头到尾看一遍(比任何人都看得更仔细,不会漏掉任何一个细节),得到游戏中发生的所有事情。缺点:门槛很高,需要会java或者golang语言。【一般的数据分析不需要用到如此细粒度的数据】
二、业界最好的DOTA2数据源在哪里
先说API,码农世界的API指的是Application Programming Interface,应用程序编程接口...是不是有点晕?有一种「黑板是吸收知识的地方,只是教室的阳光,那颜色我不太喜欢,没有操场的自然」的感觉?
没关系,我们换一个解释方式:API就是约定好一套规则,一方发出请求,一方按要求执行,并返回结果。举例!我早上去买热干面,跟老板说:一碗热干面,不要辣。付款之后等个几分钟,老板就会把热干面递给我。(老板提供了「热干面API」供我使用!)
点击图片查看大图
DOTA2数据API也是一样,你只用告诉系统要哪场比赛的数据,系统就会把数据传给你。只不过沟通语言从普通话换成了编程语言(python、java等),返回的结果从热干面换成了数据(json格式等),面馆也变成了数据提供方(官方API、OPENDOTA提供的API等)。
点击图片查看大图
那么,业界哪一个数据团队做的热干面最好吃(提供的数据最好用)?——OPENDOTA团队!有同学就要问了,OPENDOTA是个啥?数据不应该都在V社爸爸手里吗?为什么不用V社提供的API?
V社确实提供了官方API,但是很久没有维护(可能在度假吧,你看网站老掉牙的UI...),使用体验很差。我当初研究DOTA2数据源的时候,浪费了大量时间探索官方提供的WEBAPI。所以,这个坑大家就别踩了!
点击图片查看大图
调用API,需要掌握一门编程语言(我推荐python)。但编程语言的学习门槛略高,如果直接从python调用API入手,很容易在体验到数据分析的乐趣之前就被折磨的敲出GG。(python可以在网上找资料自学,如果基础太差没啥自信,也可以使用DOTA2优惠码报名优达学城的python入门课程。)
所以,让我们从使用SQL查询数据库开始学习!这里要给OPENDOTA点一个大大的赞!他们非常人性化的提供了一个交互查询功能,只输入SQL查询语句,网站就会把数据从数据库中取出来呈现给你。(不需要安装任何软件,对初学者很友好)
点击图片查看大图
那么如何学习SQL呢?
这个问题知乎上有更好的答案。但我想强调的是:兴趣是最好的老师。SQL经典教材,往往会让你查询经典的部门-职工数据库(或者学生-成绩数据库),做很多枯燥的练习,学了之后也容易忘记。但是!!!如果你本身是一个电竞爱好者,使用DOTA2数据库学习SQL,一定会学得开心又扎实!
本节课到这里就正式结束啦。有同学肯定一脸懵逼:这个课程和平常上的不太一样,没有概念讲解,也没有例题演练。没有就对了!这个系列的教程不是操作手册,更不是百科全书,只是试图给出一张明晰的鸟瞰图,帮助大家少走弯路。但路还是自己走过一遍,才会有所感悟。
如果想走的更快、有人同行(或者基础很差又决定了要做数据分析师),我还是推荐「优达学城」的数据分析零基础入门课程。(使用「DOTA2」优惠码可以减免学费,但会增加一个额外的毕业要求——写一份电竞数据分析报告,公开发表,接受大家的检验!)
给大家留几道SQL作业题(如果做不出来,下节课就不用上了...):
在刚刚结束的ESL One云顶Minor赛事中,冠军Newbee一共使用了多少名英雄?5名选手谁的英雄池最深(分别使用了多少英雄)?
线下赛没有出场过的英雄有多少个?都是谁?
线下赛的热门上场英雄是哪些?胜率如何?各英雄的最佳使用者是谁(自选评价指标)?
几点说明:
本系列课程每月更新1~2次(马上要当爹了,有没有时间写文章,娃娃说了算...)
我的私信已经是学校的客服渠道了(问路、感谢、投诉、打小报告)。所以,遇到问题尽量Google解决(作为一名初学者,你遇到的99%的问题,前人都遇到过了),或者在评论中互相讨论。私信实在回不过来,还请大家见谅。
from:微博.何求知
- ?
基础知识整理之Java基础知识点梳理(详细)
吕代亦
展开
基本数据类型Java内置8种基本类型 -> 6种数字类型 -> 4种整数类型: byte, short, int, long-> 2种浮点类型: float, double-> 1种布尔类型: boolean-> 1种字符类型: char(类型大小写注意,比如boolean是原始数据类型,Boolean是对应的封装对象)
数据类型特征表
类型位数最小值最大值默认值其他byte8-128(-2^7)127(2^7-1)0有符号、二进制补码表示short16-32768(-2^15)32767(2^15-1)0有符号、二进制补码表示int32-2^312^31-10有符号、二进制补码表示long64-2^632^63-10L(0l)有符号、二进制补码表示float322^(-149)2^128-10.0f单精度、IEEE754标准double642^(-1074)2^1024-10.0d双精度、IEEE754标准char16\u0000(0)\uffff(65535)\u0000(0)单一的、Unicode字符
浮点数内存结构
类型位数符号位指数位尾数位float321823double6411152
原始数据类型对应的封装对象(byte, Byte), (short, Short), (long, Long), (float,Float), (double, Double), (boolean, Boolean)(int, Integer), (char, Character)小题Integer i = null;int j = i.intValue();
编译通过,但运行时报错NullPointerException。因为调用了null.somemethod()。自动装箱和拆箱Integer i = 100; //自动装箱,编译器执行Integer.valueOf(100)int j = i; //自动拆箱,编译器执行i.intValue()
小题Integer i1 =200;Integer i2 =200;System.out.println("i1==i2: "+(i1==i2));Integer i3 =100;Integer i4 =100;System.out.println("i3==i4: "+(i3==i4));
运行结果为false,true.首先,==和equals()的区别:==比较的是两个对象的引用是否相同,或者是比较原始数据类型是否相等;equals()比较的是两个对象的内容是否相同。其次,-128~127的Integer值可以从缓存中取得。其他情况要重新创建。
小题String str1 ="abc";String str2 ="abc";System.out.println(str2==str1);System.out.println(str2.equals(str1));String str3 =new String("abc");String str4 =new String("abc");System.out.println(str3==str4);System.out.println(str3.equals(str4));
结果是true,true, false, true.前两个String对象从String池中获取,后两个对象是新创建的,内容相同但引用不同。小题String d ="2";String e ="23";e = e.substring(0, 1);System.out.println(e.equals(d));System.out.println(e==d);
结果是true,false.直接上源码:
关于基本数据类型的几点补充
short s1=1; s1=s1+1;
这一句编译错误,因为执行s1+1返回的结果是int类型(执行隐式类型转换)。修改的话要强制转换为short型才可以。short s1=1; s1+=4;这一句没有任何问题。
switch语句不能作用于long类型中,可以作用于char, byte, short, int, Character, Byte, Short, Integer, String or an enum.
小题public static void main(String[] args) throws Throwable {int j=0;for(int i=0;i<1000;i++) {j=j++;}System.out.println(j);}
运行结果为0。解释一(未十分确信):Java使用中间缓存变量机制,j=j++语句会执行为:temp=j;j=j+1;j=temp;
解释二(靠谱):使用javap反汇编命令进行反汇编,其中j=j++对应的结果是(j对应的变量编号是1):11: iload_1 //将局部变量j的值放到栈顶:012: iinc 1, 1 //将局部变量j的值加1,j=115: istore_1 //将栈顶的值放到局部变量j中,j=0所以从底层实现看,j=j++这一句中的自增操作只是对局部变量的操作,局部变量变化后没有存储到栈顶,反而被之前栈顶的值覆盖了,所以相当于不起作用。
关键字
final:修饰变量时,用以定义常量;修饰方法时,方法不能被重写(Override);修饰类时,类不能被继承。
数组
3种创建方式int[] arr1 = {1,2,3,4}; //正确int[] arr2 = new int[4]; //正确int[] arr3 = new int[]{1,2,3,4}; //正确int[] arr4 = new int[4]{1,2,3,4};s //错误,编译不通过
数组越界,抛出ArrayIndexOutOfBoundsException数组具有length属性如果不对数组指定初值,默认初始化为相应数据类型的默认值。多维数组,嵌套中括号即可。
String
不属于基本类型创建String s1="ss"; //先将"ss"存储在池中,然后返回引用String s2=new String("ss"); //创建新对象,使用的"ss"已经在池中String s3="Prog"+"gramming"; //创建3个对象,均存储在池中
字符串常量池和不可变(Immutable)字符串
小题String str1 = "str";String str2 = "ing";String str3 = "str" + "ing";String str4 = str1 + str2;System.out.println(str3 == str4);String str5 = "string";System.out.println(str3 == str5);
结果是false,true。后一个结果应该很好理解,因为第3行代码执行时已经将”string”存储在常量池中,第6行代码返回的是常量池中同一字符串”string”的引用,所以结果为true。前一个结果可能有点疑惑,后来把这段代码编译反汇编后发现执行第3行代码时是直接生成的String对象,内容为”string”;而执行第四行代码时是借助new StringBuilder().append(“str”).append(“ing”).toString(),关键在于StringBuilder中定义的toString()方法,返回的是一个重新创建的String对象,并没有存在池中,所以前一个结果为false。
基本数据类型封装类的parse方法可能会报NumberFormatException,比如Integer.parseInt("era");intern()方法:若由equals()判断池中包含相同的对象则返回池中该对象的引用,否则将新对象加入池中并返回引用。注意不管是怎么创建的,都先从池里找。对于字符串拼接,考虑性能,如果循环进行拼接操作,生成的字符串都会存在池里,并且每次拼接都要重新构造StringBuilder对象,影响性能。因此可以使用StringBuilder优化:StringBuilder builder...append(String.valueOf("fsdasf"));1StringBuilder/StringBufferStringBuilder线程不安全,但效率高;StringBuffer线程安全,但效率低。
集合
类型:List, Set, Map,都是接口而非具体实现。List特点是有序并且按线性方式存储,可以根据元素的下标进行精准的控制。ArrayList是顺序表的体现,底层用数组实现。
LinkedList是链表的体现,使用双向链表实现。(链表的三种形式:单向链表、双向链表、循环链表)
Stack是Vector的子类,而Vector实现了List
接口;是栈结构的代表。 Queue队列Queue直接继承自Collection接口,是队列结构的代表,使用链表结构实现。
(注:Queue继承自Collection接口,而LinkedList实现了Deque接口,Deque接口继承自Queue接口,即实现了Queue接口的所有方法)Queue接口的主要方法:add, offer(添加元素), poll(返回并删除队列头部元素)。根据offer()方法的官方注解,更加推荐使用offer()方法:
Set直接继承自Collection接口,HashSet内部使用HashMap实现;特点是无序但是不包含重复的元素;元素存放方式为散列存放,即通过计算hash值存放元素。MapMap单独为一个接口,HashMap是基于哈希表的对Map接口的实现,而哈希表的底层数据结构是数组和链表;特点是能够根据key快速查找value;键必须唯一,put一个键相同的值时该键会被更新,即同一个键只能映射到一个值。键值对以Entry类型的对象实例存在(注:Entry是Map接口中定义的内部接口)
面向对象
三大特征:封装、继承和多态构造函数:创建对象时调用。若未显式定义构造函数,系统自动生成无参构造函数。重载:发生在一个类中,函数名相同,参数列表不同(类型/个数)重写:发生在两个类中,函数名相同,参数列表相同。继承:初始化子类时先初始化父类,即调用构造函数时隐式执行父类构造函数。单继承性:Java允许一个类只能有一个父类。super关键字:既可以作为父类对象的引用调用父类方法,也可以作为父类构造函数名显式调用父类构造函数。垃圾回收:对象被回收时会调用finalize()方法。垃圾回收机制:当垃圾回收器(Garbage Collector)认定对象没有任何引用时会将其回收,在回收前调用finalize方法。但是《Java编程思想》中还提到了这样一句话:
看起来Java的垃圾清理机制并不是那么完美。调用System.gc()方法可以强制进行垃圾回收。附一篇讲Java垃圾回收机制比较好的文章多态:Employee e=new Manager();假定Employee类没有定义abc(),而Manager类定义abc(),如果调用e.abc()则编译不通过。封装:访问修饰权限:private, default, public, protected
修饰符当前类同一包内子孙类其他包其他包子孙类publicYYYYYprotectedYYYNY/N(说明)defaultYYNNNprivateYNNNNprotected关键字特别说明:
子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。
抽象类和接口
抽象类不能被实例化,实例化由子类完成;但是抽象类也是类,可以有构造方法!抽象类不一定要有抽象方法;抽象方法所在的类一定是抽象类;abstract和final不能同时修饰一个类,否则编译不通过。因为final声明的类不能被继承,如果同时修饰意味着这个类永远是抽象类。abstract不能与private, static(?), final, native(?)的同时修饰一个方法,否则编译不通过。模板方法模式
接口是更高级别的抽象,接口中的方法必须都是抽象方法;接口中声明的方法都是没有方法主体的;接口中的属性默认修饰符public static final,方法默认修饰符public abstract,这些都可以省略。一个类可以实现多个接口,但只能继承一个父类。接口和抽象类的主要区别抽象类是一种对事物的抽象,而接口是一种对行为的抽象;
抽象类是一种模板式设计,而接口是一种行为规范,是一种辐射式设计。模板式设计的含义是:如果B和C都使用了公共模板A,如果他们的公共部分需要改动,那么只改动A就可以了;辐射式设计的含义是:如果B和C都实现了公共接口A,如果现在要向A中添加新的方法,那么B和C都必须进行相应改动。
异常处理
Error和Exception, checked异常和unchecked异常Error(unchecked异常)
Exception(checked异常)
(注:以上内容引用他人文章,原作者声明:作者:胖先森链接:https://juejin.im/post/5a81941ff265da4e976e9004来源:掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。)try-catch-finally可以用多个catch子句处理不同异常,级别由低到高。在Java SE 7或者更高版本中,一个catch块可以同时处理多种异常类型,有助于减少重复代码。//...} catch (ClassNotFoundException | SQLException e) {e.printStackTrace();}
注意当catch语句要捕获多种异常类型时,参数(在这里是e)隐式地成为final变量。方法声明异常throws,抛出异常throw。try-with-resources子句(Java SE 7以后)援引官网的介绍吧:
线程
线程是操作系统调度的最小单元,也叫轻量级进程。同一进程可以创建多个线程,而他们都拥有各自的计算器、堆栈和局部变量等属性,并且能够访问共享的内存变量。线程的5个状态创建(New):使用new关键字创建一个线程就绪(Ready):调用start方法,等待CPU调度运行(Running):执行run方法阻塞(Blocked):由于一些原因放弃CPU使用权,暂时停止执行死亡(Dead):run方法执行完毕或者执行时产生异常几个重要的名词区分同步和异步同步方法调用后必须等待方法返回才能执行后续行为;异步方法调用后可以立刻执行后续行为。并发和并行并行是真正意义上的多个任务同时执行;并发是支持处理多个任务,不一定要同时,多个任务可能是串行的,但每个任务只能获取CPU很短的占用时间,多个任务在很短的时间内交替执行。
阻塞和非阻塞阻塞是指某一线程访问一公共资源时其他线程必须等待该线程释放资源才可以使用,否则就要挂起线程等待;非阻塞是指线程之间不会发生资源争夺。原子性原子性是指一个操作是不可被中断的,即使多个线程是同时执行的。可见性可见性是指当某个线程修改了共享变量的值,其他线程能否立刻知晓。有序性
Java中提供了关键字volatile和synchronized关键字来保证线程之间操作的有序性。volatile包含了禁止指令重排序的语义,并保证不同线程对同一变量操作时的可见性;synchronized关键字对同一时刻同一变量只允许一个线程对其进行lock操作。线程创建继承Thread类重写run()方法匿名内部类,即在new Thread()后跟具体的定义体,其中重写了run()方法实现Runnable接口,重写run()方法开启线程的run()和start()方法区别run()方法不能新建一个线程,而是在当前线程中调用run()方法;start()方法新建一个线程并调用其run()方法。终止线程不要使用stop()
wait() 和notify()这两个方法不是Thread类特有的,而是所有类的父类Object中的。
(注:以上内容援引他人文章,原作者声明:作者:kk_miles链接:https://juejin.im/post/5a30a7466fb9a0450f21ec5c来源:掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。)小题public class WaitNotifyDemo {final static Object object = new Object();public static class Thread1 extends Thread{@Overridepublic void run() {synchronized (object){System.out.println(System.currentTimeMillis()+" 线程1开启。。");try {object.wait(); //1.先获取object的锁,然后开始等待,并再次释放object的锁。} catch (InterruptedException e) {e.printStackTrace();}System.out.println(System.currentTi...
- ?
JDBC封装/Java处理excel/WEB基础知识
黠心明
展开
对JDBC的封装?
1.将变的内容以参数形式传入
2.将不变的固定下来
Java处理EXCEL?【JXL】
1.读
2.写
WEB基础知识
第一、两种架构
1.C/S:Client /Server 客户端 服务器 模式
QQ 360 大型网络游戏
2.B/S:Browser/Server 浏览器 服务器 模式
网站 应用系统 页游
第二、网络中的计算机,进行通信,所遵循的规范,称之为协议。
第三、在JAVAWEB中,客户端和服务器进行交互遵循的是HTTP协议。
第四、HTTP是一种建立在TCP协议基础之上,基于请求、响应模式的无状态的应用层协议。
第五、请求:从客户端发往服务器的信息【字符串】。
1.请求行 请求的方法 资源 协议版本HTTP/1.1
2.请求头 Host Accept Accept-language....
3.空格
4.消息体 key1=value1&key2=value2
第六、响应: 从服务器返回到客户端信息【字符串】
1.状态行 协议版本 状态码 状态字符串
2.响应头 Content-Type Conent-length cookie: .....
3.空格
4.响应正文
第七、浏览器:能够发出标准的HTTP请求,并可以解析标准的HTTP响应的软件(一堆别人写的代码(不一定使用JAVA))
第八、WEB服务器:是一种能够接受标准的HTTP请求,返回标准的HTTP响应的软件。
第九、Tomcat就是一款免费的开源的纯JAVA实现的WEB服务器。
第十、Servlet/JSP容器:提供了Servlet运行环境,管理Servlet的生命周期的一个组件(一堆类,零件)。一般容器存在于服务器中。比如:Tomcat中就有一个servlet容器catalina
第十一、Servlet=JAV代码+HTML标签(以JAVA代码为主) JSP=HTML标签+JAVA代码(以标签为主)
- ?
Java实现文件批量导入导出实例(兼容xls,xlsx)
连绿柏
展开
1、介绍
java实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写个小demo来理解其原理,没接触过的同学也可以看看参考下。
目前我所接触过的导入导出技术主要有POI和iReport,poi主要作为一些数据批量导入数据库,iReport做报表导出。另外还有jxl类似poi的方式,不过貌似很久没跟新了,2007之后的office好像也不支持,这里就不说了。
2、POI使用详解
2.1 什么是Apache POI?
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
2.2 POI的jar包导入
本次讲解使用maven工程,jar包版本使用poi-3.14和poi-ooxml-3.14。目前最新的版本是3.16。因为3.15以后相关api有更新,部分操作可能不一样,大家注意下。
2.3 POI的API讲解
2.3.1 结构
HSSF - 提供读写Microsoft Excel格式档案的功能。XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。HWPF - 提供读写Microsoft Word格式档案的功能。HSLF - 提供读写Microsoft PowerPoint格式档案的功能。HDGF - 提供读写Microsoft Visio格式档案的功能。
2.3.2 对象
本文主要介绍HSSF和XSSF两种组件,简单的讲HSSF用来操作Office 2007版本前excel.xls文件,XSSF用来操作Office 2007版本后的excel.xlsx文件,注意二者的后缀是不一样的。
HSSF在org.apache.poi.hssf.usermodel包中。它实现了Workbook 接口,用于Excel文件中的.xls格式
常用组件:HSSFWorkbook excel的文档对象HSSFSheet excel的表单HSSFRow excel的行HSSFCell excel的格子单元HSSFFont excel字体HSSFDataFormat 日期格式HSSFHeader sheet头HSSFFooter sheet尾(只有打印的时候才能看到效果)样式:HSSFCellStyle cell样式辅助操作包括:HSSFDateUtil 日期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表
XSSF在org.apache.xssf.usemodel包,并实现Workbook接口,用于Excel文件中的.xlsx格式
常用组件:XSSFWorkbook excel的文档对象XSSFSheet excel的表单XSSFRow excel的行XSSFCell excel的格子单元XSSFFont excel字体XSSFDataFormat 日期格式和HSSF类似;
2.3.3 两个组件共同的字段类型描述
其实两个组件就是针对excel的两种格式,大部分的操作都是相同的。
2.3.4 操作步骤
以HSSF为例,XSSF操作相同。
首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。
3、代码操作
3.1 效果图
惯例,贴代码前先看效果图
Excel文件两种格式各一个:
代码结构:
导入后:(我导入了两遍,没做校验)
导出效果:
3.2 代码详解
这里我以Spring+SpringMVC+Mybatis为基础
Controller:
Service
3.3 导出文件api补充
大家可以看到上面service的代码只是最基本的导出。
在实际应用中导出的Excel文件往往需要阅读和打印的,这就需要对输出的Excel文档进行排版和样式的设置,主要操作有合并单元格、设置单元格样式、设置字体样式等。
3.3.1 单元格合并
使用HSSFSheet的addMergedRegion()方法
参数CellRangeAddress 表示合并的区域,构造方法如下:依次表示起始行,截至行,起始列, 截至列
3.3.2 设置单元格的行高和列宽
3.3.3 设置单元格样式
1、创建HSSFCellStyle
2、设置样式
3、将样式应用于单元格
3.3.4设置字体样式
1、创建HSSFFont对象(调用HSSFWorkbook 的createFont方法)
2、设置字体各种样式
3、将字体设置到单元格样式
大家可以看出用poi导出文件还是比较麻烦的,等下次在为大家介绍下irport的方法。
导出的api基本上就是这些,最后也希望上文对大家能有所帮助。
学习Java的同学注意了!!!学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群495273252,我们一起学Java!
- ?
Java使用Apache POI导出Excel
苻沛白
展开
一.POI简单介绍
Apache POI 是用Java 编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对 Microsoft Office 格式档案读和写的功能
HSSF 提供读写Microsoft Excel XLS格式档案的功能。
XSSF 提供读写Microsoft Excel OOXML XLSX格式档案的功能。
HWPF 提供读写Microsoft Word DOC格式档案的功能。
HSLF 提供读写Microsoft PowerPoint格式档案的功能。
HDGF 提供读Microsoft Visio格式档案的功能。
HPBF 提供读Microsoft Publisher格式档案的功能。
HSMF 提供读Microsoft Outlook格式档案的功能。
二.操作步骤
1.环境配置:导入jar包
org.apache.poi poi 3.16
2.创建一个Excel工作簿
@Test public void test() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel工作蒲.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); }
3.创建一个sheet页
@Test public void sheet() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //创建sheet页面 wb.createSheet("第一个sheet页"); wb.createSheet("第二个sheet页"); //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel工作蒲带有sheet页.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); }
sheet页
4.创建行和列
@Test public void row() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //创建sheet页面 Sheet sheet = wb.createSheet("学生信息sheet页"); //创建一行 Row row = sheet.createRow(0); //创建一个单元格 Cell cell =null; for(int i = 0 ;i<5;i++){ row.createCell(i).setCellValue("写入信息:单元格内容"+i); } //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel学生信息.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); }
5.创建一个时间样式到Excel
@Test public void date() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //创建sheet页面 Sheet sheet = wb.createSheet("时间sheet页"); //创建一行 Row row = sheet.createRow(0); //创建一个单元格 Cell cell = row.createCell(0); cell.setCellValue(new Date()); CreationHelper creationHelper = wb.getCreationHelper(); //设置单元格样式 CellStyle cellStyle = wb.createCellStyle(); cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("YYYY-MM-DD hh:mm:ss")); cell = row.createCell(1); cell.setCellValue(new Date()); //设置日期样式 cell.setCellStyle(cellStyle); //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel日期格式.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); }
6.单元格对其方式及行高
@Test public void style() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //创建sheet页面 Sheet sheet = wb.createSheet("第一个sheet"); //创建一行 Row row = sheet.createRow(0); //设置行高 row.setHeightInPoints(30); //创建一个单元格 createCell(wb,row,(short)0,HSSFCellStyle.ALIGN_CENTER,HSSFCellStyle.VERTICAL_BOTTOM); createCell(wb,row,(short)1,HSSFCellStyle.ALIGN_JUSTIFY,HSSFCellStyle.VERTICAL_CENTER); createCell(wb,row,(short)2,HSSFCellStyle.ALIGN_CENTER_SELECTION,HSSFCellStyle.VERTICAL_JUSTIFY); //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel样式.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); } /** * 创建一个单元格设置对应的对其方式 * @param workbook 工作蒲 * @param row 行 * @param column 列 */ private static void createCell(Workbook workbook, Row row, short column,short halign,short valign){ Cell cell = row.createCell(column);//创建单元格 cell.setCellValue(new HSSFRichTextString("我是富文本"));//设置值 CellStyle cellStyle = workbook.createCellStyle();//创建样式 cellStyle.setAlignment(halign);//设置单元格水平方向对其方式 cellStyle.setVerticalAlignment(valign);//设置单元格垂直方向对其方式 cell.setCellStyle(cellStyle); }
合并单元格
@Test public void test1() throws IOException { //定义一个工作蒲 Workbook wb = new HSSFWorkbook(); //创建sheet页面 Sheet sheet = wb.createSheet("第一个sheet"); //创建一行 Row row = sheet.createRow(1); //设置行高 row.setHeightInPoints(30); //创建一个单元格 Cell cell = row.createCell(1); cell.setCellValue("合并单元格"); //合并单元格(起始行,结束行,起始列,结束列) sheet.addMergedRegion(new CellRangeAddress(1,2,1,2)); //定义一个输出流 FileOutputStream fileOutputStream = new FileOutputStream("/home/ubuntu/Desktop/Excel样式.xls"); //写入在输出流 wb.write(fileOutputStream); //关闭输出流 fileOutputStream.close(); }
- ?
JavaEE——Java导出Excel表
侯元柏
展开
声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。
Java导出Excel表
首先去maven里面下载 upload 1.3.3 版本 下载到你的maven工程里面
上传文件必须是post方法
上传文件同时有表单值的话 你用request.getParame是获得不到的
Java导出Excel表
去maven工厂下载 POI jar包
- ?
集算器协助java处理多样性数据源之Excel
丁涛
展开
Java程序员读取和计算excel的程序一般要使用poi或其它开源包,这些开源包对编程的支持较为底层,整体学习成本和操作复杂度都很高。使用集算器辅助java处理excel文件就可以避免这些事务。
下面通过一个例子看一下具体作法:从Excel文件orders.xls中读取订单信息,找出2010年1月1日(含)之后,SELLERID等于18的订单。orders.xls的内容如下:
实现的思路是:用Java程序调用集算器脚本,读取和计算excel文件中的数据,之后将结果以ResultSet的方式返回给Java程序。由于集算器支持动态表达式解析和求值,使得Java程序可以像使用sql那样,灵活的处理数据。
首先,程序员可以将条件“2010年1月1日(含)之后,并且SELLERID等于18的订单。”作为参数where传递给esProc程序,如下图:
where是个字串,其值为:ORDERDATE>=date(2010,1,1) && SELLERID==18。
esProc的程序代码如下:
A2:按照条件过滤。这里使用宏来实现动态解析表达式,其中的where就是传入参数。集算器将先计算${…}里的表达式,将计算结果作为宏字符串值替换${…}之后解释执行。这个例子中最终执行的是:=A1.select(ORDERDATE>=date(2010,1,1) && SELLERID==18)。A1:定义一个file对象,导入excel数据。esProc的集成开发环境可以直观的显示出导入的数据,如上图右边部分。importxls函数也可以读写xlsx文件,它会根据文件扩展名自动判断excel的版本。
A3:将符合条件的结果集返回给java。如果需要将结果写入另外一个excel文件,只要将A3单元格改为:=file("D:/file/orders_result.xls").exportxls@t(A2)。
过滤条件发生变化时不用改变程序,只需改变where参数即可。例如,条件变为:2010年1月1日(含)之后,并且SELLERID等于18的订单,或者CLIENT等于PWQ的订单。Where的参数值可以写为:CLIENT=="PWQ"||ORDERDATE>=date(2010,1,1) && SELLERID==18。执行之后,A2中的结果集如下图:
在Java程序中使用esProc JDBC调用这段程序获得结果的代码如下:(将上述esProc程序保存为test.dfx):
//建立esProc jdbc连接
Class.forName("com.esproc.jdbc.InternalDriver");
con= DriverManager.getConnection("jdbc:esproc:local://");
//调用esProc程序(存储过程),其中test是dfx的文件名
com.esproc.jdbc.InternalCStatementst =(com.esproc.jdbc.InternalCStatement)con.prepareCall("call test(?)");
//设置参数
st.setObject(1,"ORDERDATE>=date(2010,1,1) && SELLERID==18 || CLIENT==\"PWQ\"");//执行esProc存储过程
ResultSet set =st.executeQuery();
对于代码较简单的脚本,还可以把代码直接写在调用集算器JDBC的Java程序中,而不必专门编写脚本文件(test.dfx):
ResultSet set = st.executeQuery(
"=file(\"D:/file/orders.xls\").importxls@t().select(ORDERDATE>=date(2010,1,1) && SELLERID==18 || CLIENT==\"PWQ\")");
这段Java代码直接调用了集算器的一句脚本:从Excel文件中取得数据,并按照指定的条件过滤。
- ?
一行代码完成Java的Excel读写
古惑仔
展开
前段时间在 github 上发现了阿里的 EasyExcel 项目,觉得挺不错的,就写了一个简单的方法封装,做到只用一个函数就完成 Excel 的导入或者导。刚好前段时间更新修复了一些 BUG,就把我的这个封装分享出来,请多多指教。
附上源码:
https://github/HowieYuan/easyexcel-method-encapsulation
EasyExcel
EasyExcel 的 github 地址:
https://github/alibaba/easyexcel
EasyExcel 的官方介绍:
可以看到 EasyExcel 最大的特点就是使用内存少,当然现在它的功能还比较简单,能够面对的复杂场景比较少,不过基本的读写完全可以满足。
一. 依赖
首先是添加该项目的依赖,目前的版本是 1.0.2。
com.alibaba easyexcel 1.0.2 二. 需要的类
1. ExcelUtil
工具类,可以直接调用该工具类的方法完成 Excel 的读或者写。
2. ExcelListener
监听类,可以根据需要与自己的情况,自定义处理获取到的数据,我这里只是简单地把数据添加到一个 List 里面。
publicclassExcelListenerextendsAnalysisEventListener {//自定义用于暂时存储data。//可以通过实例获取该值private List
3. ExcelWriterFactroy
用于导出多个 sheet 的 Excel,通过多次调用 write 方法写入多个 sheet。
4. ExcelException
捕获相关 Exception。
三. 读取 Excel
读取 Excel 时只需要调用 ExcelUtil.readExcel() 方法:
@RequestMapping(value = "readExcel", method = RequestMethod.POST)public Object readExcel(MultipartFile excel) {return ExcelUtil.readExcel(excel, new ImportInfo());}
其中 excel 是 MultipartFile 类型的文件对象,而 new ImportInfo() 是该 Excel 所映射的实体对象,需要继承 BaseRowModel 类,如:
publicclass ImportInfo extends BaseRowModel {@ExcelProperty(index = 0)privateString name;@ExcelProperty(index = 1)privateString age;@ExcelProperty(index = 2)privateString email;publicString getName() {return name; }publicvoid setName(String name) {this.name = name; }publicString getAge() {return age; }publicvoid setAge(String age) {this.age = age; }publicString getEmail() {return email; }publicvoid setEmail(String email) {this.email = email; }}
作为映射实体类,通过 @ExcelProperty 注解与 index 变量可以标注成员变量所映射的列,同时不可缺少 setter 方法。
四. 导出 Excel
1. 导出的 Excel 只拥有一个 sheet
只需要调用 ExcelUtil.writeExcelWithSheets() 方法:
@RequestMapping(value = "writeExcel", method = RequestMethod.GET)publicvoidwriteExcel(HttpServletResponse response) throws IOException { List
list = getList(); String fileName = "一个 Excel 文件"; String sheetName = "第一个 sheet"; ExcelUtil.writeExcel(response, list, fileName, sheetName, new ExportInfo()); } fileName,sheetName 分别是导出文件的文件名和 sheet 名,new ExportInfo() 为导出数据的映射实体对象,list 为导出数据。
对于映射实体类,可以根据需要通过 @ExcelProperty 注解自定义表头,当然同样需要继承 BaseRowModel 类,如:
publicclass ExportInfo extends BaseRowModel {@ExcelProperty(value = "姓名" ,index = 0)privateString name;@ExcelProperty(value = "年龄",index = 1)privateString age;@ExcelProperty(value = "邮箱",index = 2)privateString email;@ExcelProperty(value = "地址",index = 3)privateString address;}
value 为列名,index 为列的序号。
如果需要复杂一点,可以实现如下图的效果:
对应的实体类写法如下:
publicclass MultiLineHeadExcelModel extends BaseRowModel {@ExcelProperty(value = {"表头1","表头1","表头31"},index = 0)privateString p1;@ExcelProperty(value = {"表头1","表头1","表头32"},index = 1)privateString p2;@ExcelProperty(value = {"表头3","表头3","表头3"},index = 2)private int p3;@ExcelProperty(value = {"表头4","表头4","表头4"},index = 3)private long p4;@ExcelProperty(value = {"表头5","表头51","表头52"},index = 4)privateString p5;@ExcelProperty(value = {"表头6","表头61","表头611"},index = 5)privateString p6;@ExcelProperty(value = {"表头6","表头61","表头612"},index = 6)privateString p7;@ExcelProperty(value = {"表头6","表头62","表头621"},index = 7)privateString p8;@ExcelProperty(value = {"表头6","表头62","表头622"},index = 8)privateString p9;}
2. 导出的 Excel 拥有多个 sheet
调用 ExcelUtil.writeExcelWithSheets() 处理第一个 sheet,之后调用 write() 方法依次处理之后的 sheet,最后使用 finish() 方法结束。
publicvoidwriteExcelWithSheets(HttpServletResponse response) throws IOException { List
list = getList(); String fileName = "一个 Excel 文件"; String sheetName1 = "第一个 sheet"; String sheetName2 = "第二个 sheet"; String sheetName3 = "第三个 sheet"; ExcelUtil.writeExcelWithSheets(response, list, fileName, sheetName1, new ExportInfo()) .write(list, sheetName2, new ExportInfo()) .write(list, sheetName3, new ExportInfo()) .finish();} write 方法的参数为当前 sheet 的 list 数据,当前 sheet 名以及对应的映射类。
扩展阅读
代码整洁之道|最佳实践小结
Javascript 将 HTML 页面生成 PDF 并下载
Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框
来源:https://juejin.im/post/5ba320546fb9a05d0b14304b
文章来源网络,版权归作者本人所有,如侵犯到原作者权益,请与我们联系删除
- ?
整理关于java读取excel内容的例子供大家参考
符梦凡
展开
1POI简介
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
2POI下载
poi下载地址:https://apache.org/dyn/closer.lua/poi/release/bin/poi-bin-3.17-20170915.tar.gz
下载之后把压缩包解压,然后在项目里面引用解压文件夹里面的jar
3新建java project,引入poi相关的jar
4创建一个java类,编写代码
package test;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class ReadExcel {
/**
* @param args
*/
@SuppressWarnings("resource")
public static void main(String[] args) {
try {
InputStream is = new FileInputStream(new File(
"D:/360bizhi/0_TITLE_CODE.xls"));
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
// 获取每一个工作薄
for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
}
// 获取当前工作薄的每一行
for (int rowNum = 0; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
if (hssfRow != null) {
String title_id = String.valueOf(hssfRow.getCell(0));
// 读取第一列数据
String title_name = String.valueOf(hssfRow.getCell(1));
// 读取第二列数据
String title_name_en = String.valueOf(hssfRow
.getCell(2));
System.out.println("===============title_id:"
+ title_id + ",title_name:" + title_name
+ ",title_name_en:" + title_name_en);
} catch (Exception e) {
e.printStackTrace();
5运行main进行测试,查看打印结果
打印结果和xls里面的值是一样的,说明读取excel成功
请大家多多关注我的头条号,谢谢大家
java获取excel数据
-
1、只需3秒快速实现求和
-
2、如何快速填充序号
-
3、如何自动填充序号(公式法)
-
4、数据条的神奇应用
-
5、多文本快速合并
-
6、查找与替换的不同玩法
-
7、快速定位到指定区域
-
8、数据排序、工资条制作
-
9、快速筛选(模糊、精确筛选)
-
10、快速插入空行
-
11、快速删除空行
-
12.快速跳转到天涯海角
-
13、.同时查看两个Excel文件
-
14、用条件格式扮靓报表
-
15、一键插入Excel图表
-
16、批量处理行高、列宽
-
17、利用拆分功能查看数据
-
18、批量录入相同内容
-
19、工作表快速跳转
-
20、批量录入表格模板(精品课程)
-
21、Excel函数与公式的应用、公式循环引用的查找
-
22、IF函数单条件判断同比增长
-
23、用sum函数 格式相同,连续多表数据汇总
-
24、excel快捷键
-
25、VLOOKUP函数——根据销售员匹配销售额
-
26、统计各部门销售总额
-
27、统计指定条件个数
-
28、怎样输入当前日期和时间、星期数
-
29、销售业绩排名
-
30、Sumproduct函数-万能函数(销售额汇总求和)
-
31、根据销售员,地区,商品名称汇总
-
32、批量替换PPT字体
-
33、给销售额数据批量添加万元单位
-
34、一秒快速核对两列数据
-
35、快速定位到指定单元格或区域
-
36、快速制作双行标题工资条
-
37、给你的表格做个瘦身
-
38、快速打开常用的Excel文件
-
39、快速打开多个Excel文件
-
40、利用创建组—快速隐藏/展开多列数据
-
41、快速制作下拉菜单
-
42、复制粘贴表格,如何保留数据源列宽格式一致?
-
43、两列数据位置互换
-
44、1秒钟扮靓报表——如何实现表格隔行换色
-
45、快速删除重复记录——保留唯一值
-
46、快速向下填充、向右填充,文本或公式
-
47、给Excel文件添加密码
-
48、插入带图片的批注
-
49、输入公式后不计算?
-
50、如何设置单元格缩进
-
51、快速解决Excel表格总显示货币格式
-
52、批量添加万元单位
-
53、你会四舍五入么?
-
54、用RAND函数机选彩票
-
55、冻结首行你会么?
-
56、超链接的高级应用
-
57、IFERROR函数-屏蔽错误值
-
58、批量填充颜色
-
59、录入数据
-
60、快速输入工号
-
61、快速行列转置
-
62、自定义缩放界面
-
63、多个单元格同时输入
-
64、如何计算立方米?
-
65、快速制作双行标题工资条
-
66、输入带方框的√和×
-
67、快速将姓名对齐
-
68、快速输入性别
-
69、按单位职务排序
-
70、自动计算合同到期日期
-
71、计算时间间隔
-
72、日期和时间的拆分
-
73、快速处理不规范的日期格式
-
74、快速填充合并单元格
-
75、效率加倍的快捷键
-
76、快速复制表格和对象
-
77、快速创建工作表副本
-
78、快速复制序列号
-
79、快速显示公式
-
80、多个单元格同时输入
-
81、快速调整显示比例
-
82、快速自动填充
-
83、快速填充(Ctrl+E)
-
84、Ctrl与数字键结合
-
85、快速将多列数据整理为1列
-
86、快速将1列数据拆分为多列
-
87、快速定位公式
-
88、快速录入数据
-
89、快速累计求和
-
90、身份证号码显示为0怎么办?
-
91、快速制作斜线表头
-
92、文本竖向显示
-
93、神奇的监视窗口
-
94、不一样的格式刷
-
95、快速美化图表
-
96、快速生成当前日期
-
97、快速找出循环引用
-
98、快速提取信息
-
99、二维表快速转换为一维表
-
100、快速多表合并