- ?
EXCEL中数组的应用专题之一:数组公式是如何输入的
贾映安
展开
转载自百家号作者:VBA与GO语言
在EXCEL的应用中,数组是经常用到的一个知识点,在实际工作中,巧妙的利用数组可以在实际的工作中可以得心应手,配合必要的函数和公式,可以让你的工作变得简单高效。
数组公式就是可以同时进行多重计算并返回一种或多种结果的公式。比一般的公式要复杂些,理解上要和普通的公式加以区别。必要时要借助VBA的思想来来考虑问题,因为数组公式的应用在很多的时候和VBA是一样的。
在数组公式中使用两组或多组数据称为数组参数,数组参数可以是一个数据区域,也可以是数组常量。数组公式中的每个数组参数必须有相同数量的行和列。
今日先讲数组公式的输入,数组公式的输入步骤如下:
1选定单元格或单元格区域。如果数组公式将返回一个结果,单击需要输入数组公式的单元格;如果数组公式将返回多个结果,则要选定需要输入数组公式的单元格区域。
2输入数组公式。
3同时按“Crtl+Shift+Enter”组合键,则Excel 自动在公式的两边加上大括号{ } 。
注意点:
a) 第(3)步相当重要,只有输入公式后同时按“Crtl+Shift+Enter”组合键,系统才会把公式视为一个数组公式。否则,如果只按Enter键,则输入的只是一个简单的公式,也只在选中的单元格区域的第1个单元格显示出一个计算结果。
b) 在数组公式中,通常都使用单元格区域引用,但也可以直接键入数值数组,这样键入的数值数组被称为数组常量。
c) 当不想在工作表中按单元格逐个输入数值时,可以使用这种方法。如果要生成数组常量,必须按如下操作:
(1)直接在公式中输入数值,并用大括号“{ }”括起来。
(2)不同列的数值用逗号“,”分开。
(3)不同行的数值用分号“;”分开。
输入数组常量的方法:
实例一:要在单元格A1:E1中分别输入10,20,30,50和40这5个数值,则可采用下述的步骤:
(1)选取单元格区域A1:E1
(2)在公式编辑栏中输入数组公式“={10,20,30,50,40}”
(3)同时按Ctrl+Shift+Enter组合键,即可在单元格A1、B1、C1、D1、E1中分别输入了10、20、30、50、40
实例二:输入数组常量的方法:
要在单元格A1:E2中分别输入10,20,30,50,40;1,2,3,4,5这10个数值,则可采用下述的步骤:
(1)选取单元格区域A1:E2
(2)在公式编辑栏中输入数组公式“={10,20,30,50,40;1,2,3,4,5}”
(3)同时按Ctrl+Shift+Enter组合键,即可在单元格A1、B1、C1、D1、E1、A2、B2、C2、D2、E2中分别输入了10、20、30、50、40;1,2,3,4,5
今日内容回向:
1 什么是数组公式?
2 数组常量如何录入?
- ?
JavaSE——数组集合
凡梅
展开
声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。
Arrays:介绍:数组的工具类,这个类主要是对我们的数组进行操作 数组排序
sort排序,数组从小到大排序,toString是打印的意思,binarySearch搜索,搜索78的下标在第几个,打印出来
如何做到从大到小排序,如下图,做个比较器,-1和1颠倒一下就变成从大到小来排序了
如下图:fill 覆盖,把里面的数据都覆盖成100
如下图:是比较跟截取,equals比较,比较内容是否一样,copyOf截取,截取前面5个打印出来
集合框架:集合算法:数组集合链表集合哈希集合
介绍:集合在java中代表着无限存储容器,它比数组厉害,数组是有限长度,申请为3个就是3个,你少用几个它也不会缩回来,不够了也是不能扩容,而集合就是在数组的基础上做了一个可伸缩的容器、无限扩展的容器,集合平时也是帮你们存数据的,就是比数组方便一些
数组集合:
原理:
假设下面图中的是集合容器,依次类推的往里面加数据,第一次存储A1进来,第二次不够存了就申请一个比上一个大1的数组出来,然后就把老数据导入到新数组之中,之后的数据就放到后面来,A1、A2加入的只是一个引用而已,就这样子以此类推的不停的进行存储
例题:自己研发的数组集合,作为一个容器,要能添加,要能删除,要能得到你里面的对象,还要问你的大小,如下图就是添加
写好添加类,然后可以写个测试类用debug测试一下,就这样就能做到无限增长了,但是效率会低一些
如下图:又是另外一种写法,先申请个数组长度为5的,扩容的时候在原来的基础上*2就是扩展两倍,然后把老数据拷贝到新数组里
remove删除,get按下标得值,size反馈长度
删除的原理:
从第几个开始拷贝,那就得看你从第几个下标开始删除,如果是1下标开始删除,就拷贝+1 拷贝给自己数组从第i个开始放
如下图,假如要删除C第二个,2+1等3 从第三个开始拷贝,拷贝给自己数组第二个,然后算8-2-1等5 长度是5个,然后选中覆盖到前面来
- ?
Java开发人员必知必会的20种常用类库和API
伊甸园
展开
一个有经验的Java开发人员特征之一就是善于使用已有的轮子来造车。《Effective Java》的作者Joshua Bloch曾经说过:“建议使用现有的API来开发,而不是重复造轮子”。在本文中,我将分享一些Java开发人员应该熟悉的最有用的和必要的库和API。顺便说一句,这里不包括框架,如Spring和Hibernate因为他们非常有名,都有特定的功能。
本文总结了日志、JSON解析、单测、XML解析、字节码处理、数据库连接池、集合类、邮件、加密、嵌入式SQL数据库、JDBC故障诊断以及序列化等20个方面的常用类库。都是你日常开发经常可能要用到的,现在不用不要紧,但是你要知道有这么一篇文章可以供你参考。
不知道不可怕,可怕的是你不知道你不知道。
一、日志相关类库
日志库是很常见的,因为你在每一个项目中都需要他们。打印日志是服务器端应用中最重要的事情,因为日志是你了解你的程序发生了什么的唯一途径。尽管JDK附带自己的日志库,但是还是有很多更好的选择可用,例如Log4j、SLF4j和LogBack。
Java开发人员应该熟悉日志记录的利弊,并且了解为什么SLF4J要比Log4J要好。
二、JSON解析库
在当今世界的web服务和物联网中(IoT),JSON已经取代了XML,成为从客户端到服务器传送信息的首选协议。有一个好消息和一个坏消息。坏消息是JDK没有提供JSON库。好消息是有许多优秀的第三方库可以用来解析和创建JSON消息,如Jackson 和 Gson
一个Java web开发人员应该熟悉Jackson 和 Gson这两种中的至少一种库。
三、单元测试库
单元测试技术的使用,是区分一个一般的开发者和好的开发者的重要指标。程序员经常有各种借口不写单元测试,但最常见的借口就是缺乏经验和知识。常见的单测框架有JUnit,Mockito和PowerMock。
四、通用类库
有几个很好的第三方通用库可供Java开发人员使用,例如Apache Commons和Google Guava。我会经常在我的代码中使用这些通用类库,因为这些类库都是经过无数开发者实践过的,无论是实用性还是在性能等方面都是最佳的。
五、Http 库
我不是很喜欢JDK的一个重要原因就包括他们缺乏对HTTP的支持。虽然可以使用java包类,但是这和直接使用像Apache HttpClient和HttpCore等开源类库比起来麻烦太多了。
尽管JDK 9将开始HTTP 2.0,也对HTTP的支持做了优化,但是我还是强烈建议所有的Java开发人员熟悉流行的HTTP处理类库,例如HttpClient和HttpCore HTTP等库。
六、XML解析库
市面上有很多XML解析的类库,如Xerces, JAXB, JAXP, Dom4j, Xstream等。Xerces2是下一代高性能,完全兼容的XML解析工具。Xerces2定义了 Xerces Native Interface (XNI)规范,并提供了一个完整、兼容标准的 XNI 规范实现。该解析器是完全重新设计和实现的,更简单以及模块化。
七、Excel读写库
许多应用程序需要提供把数据导出到Excel的功能,如果你要做相同的Java应用程序,那么你需要Apache POI API。
这是一个非常丰富的类库,你可以从Java程序读写XLS文件。
八、字节码库
如果你正在编写一个框架或者类库。有一些受欢迎的字节码库如javassist和Cglib Nodep可以供你选择,他们可以让你阅读和修改应用程序生成的字节码。
Javassist使得JAVA字节码操作非常简单。它是一个为编辑Java字节码而生的类库。ASM是另一个有用的字节码编辑库。
九、数据库连接池库
如果你的Java应用程序与数据库交互不是使用数据库连接池库的话,那么你就大错特错了。因为在运行时创建数据库连接非常耗时并且会拖慢你的程序。所以墙裂建议使用,有些好用的连接池可供选择,如Commons Pool 和 DBCP。
在web应用程序中,web服务器通常提供了这些功能。但是在java项目中需要把数据库连接池的类库导入到应用中。
十、消息传递库
像日志和数据库连接池一样,消息传递也是很多实际的Java项目中必备的。Java提供了JMS Java消息服务,但这不是JDK的一部分,你需要单独的引入jms.jar。类似地,如果您准备使用第三方消息传递协议,Tibco RV是个不错的选择。
十一、PDF处理库
除了Excel和Word,PDF也是一种常用的文件格式。如果你的应用程序要支持PDF格式的文件处理,你可以使用iText和Apache FOP类库。两者都提供了非常有用的PDF处理功能。
十二、日期和时间库
在Java之前,JDK的日期和时间库一直被人们所诟病,比如其非线程安全的、不可变的、容易出错等。很多开发人员会选择更好用的JodaTime类库。
但是在Java8推出之后,我们就可以彻底放弃JodaTime了,因为Java 8提供了其所有功能。但是,如果你的代码运行在一个低版本的JDK中,那么JodaTime还是值得使用的。
十三、集合类库
虽然JDK有丰富的集合类,但还是有很多第三方类库可以提供更多更好的功能。如Apache Commons Collections、 Goldman Sachs collections、 Google Collections和Trove。Trove尤其有用,因为它提供所有标准Collections 类的更快的版本以及能够直接在原语(primitive)(例如包含int 键或值的Map 等)上操作的Collections 类的功能。
FastUtil是另一个类似的API,它继承了Java Collection Framework,提供了数种特定类型的容器,包括映射map、集合set、列表list、优先级队列(prority queue),实现了java.util包的标准接口(还提供了标准类所没有的双向迭代器),还提供了很大的(64位)的array、set、list,以及快速、实用的二进制或文本文件的I/O操作类。
十四、邮件API
javax.mail 和 Apache Commons Email 提供了发送邮件的api。它们建立在JavaMail API的基础上,提供简化的用法。
十五、HTML解析库
和XML与JSON类似,HTML是另外一种我们可能要打交道的传输格式。值得庆幸的是,我们有jsoup可以大大简化Java应用程序使用HTML。你不仅可以使用JSoup解析HTML还可以创建HTML文档。
十六、加密库
Apache Commons家族中的Commons Codec就提供了一些公共的编解码实现,比如Base64, Hex, MD5,Phonetic and URLs等等。
十七、嵌入式SQL数据库库
我真的是非常喜欢像H2这种内存数据库,他可以嵌入到你的Java应用中。在你跑单测的时候如果你需要一个数据库,用来验证你的SQL的话,他是个很好的选择。顺便说一句,H2不是唯一嵌入式DB,你还有Apache Derby和HSQL可供选择。
十八、JDBC故障诊断库
有不错的JDBC扩展库的存在使得调试变得很容易,例如P6spy,这是一个针对数据库访问操作的动态监测框架,它使得数据库数据可无缝截取和操纵,而不必对现有应用程序的代码作任何修改。P6Spy 分发包包括P6Log,它是一个可记录任何 Java 应用程序的所有JDBC事务的应用程序。其配置完成使用时,可以进行数据访问性能的监测。
十九、序列化库
Google Protocol Buffer 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。
二十、网络库
一些有用的网络库主要有Netty的和Apache MINA。如果您正在编写一个应用程序,你需要做的底层网络任务,可以考虑使用这些库。
这都是每位Java开发人员应该熟悉的,并且十分有用的库。Java生态系统非常庞大的,你会发现有很多不同的类库可以做不同的事情。每个你想到的东西,都可能有一个库可以做到。
要相信,你遇到的问题,肯定不止你一个遇到过。
要相信,也许有很多人比你更勤奋。
要相信,你用或不用,轮子就在那里。
要相信,使用这些类库,你和你的代码都会变得更好。
作者:Hollis
- ?
比Excel强大还好上手?这个工具,能让你摆脱重复劳动!
天不老
展开
文 | keyen源 | 投稿“数据分析不是个事儿”
我要讲一个自己的故事。
前几年,大学毕业,刚成为社会人。每一天,我都要对着不同的Excel表格,不断地录入、整理、计算、核对。
那段时间,我每天都在怀疑人生:读了十几年书,985毕业,为什么一直在做重复的表格工作?
为了解放自己,我学了许多Excel的“高级操作”,还拿出压箱底的VB书。但依然架不住疯狂的业务需求,报表改了又改,而且这种情况到年底越发明显。整个人陷入被动。
那时我每天趁着中午有口喘气的时间,在网上大量搜索的能节省做报表时间的工具,连令我头疼的开源代码都不放过。
花了几天,还真被我搜到了,一个能替代Excel的效率神器。
与office的界面风格很像,不知道是不是就是基于office进行的开发,但是做出的效果确实很酷。能直接整合数据库的数据做报表开发,开发的模板能通过设置简单的查询参数,做筛选过滤。原本要做12家门店的销售报表,我用一张模板花1个多小时就搞定了,分分钟批量导出。一个字“快”。数据库整合的效率和开发的效率不可同日而语。
很庆幸以前和IT同事混饭的时候,学了一点SQL,对数据表有所认识,所以上手很容易。请了人家两顿饭,说明缘由,就给我开数据库权限了。
以前已给好几个人安利过,要么借着幌子让我帮忙教做报表,要么借口SQL太难学(这明明是最好学的语言了,好么)。
如今,我写下这份心得,和大家分享。
01 FineReport 是什么?
Finereport是一个比较强大的web报表工具,大多为信息部开发报表所用,所以一般人可能不太了解。
他可以作报表,也可以做数据可视化,和Excel有点像,只不过VBA开发的成分人家用java编程语言开发成了功能。小到可以存储统计数据、制作各式各样的图表、dashboard,大到制作财务报表、开发进销存系统。
为什么会有报表工具这么个玩意儿?Excel不是万能的么?
Excel在做报表方面,只要你眼疾手快,技能熟练,对十万条以内的数据处理起来一点不虚。但是资深的数据分析师、BI工程师还是笑摸狗头,Too Young Too Simple。
在企业应用中,企业/组织/团体一旦成规模时,数据量是数以万计的,无论数据还是报表都需要协同管理不断更新。面对各种OA\ERP\CRM系统的数据,部门提交的各种需求,这时候懂技术的朋友们可能知道,Excel是hold不住的。爷搞得都是百万数据,要百万数据,就得上数据库还有BI工具,Excel做得再快也跟不上变化的需求。
其次,从效率上来讲,专业的报表工具是可以替代很多重复性的excel处理工作,比如FineReport,信息部门部署安装后,可以连接各业务系统数据,将常规的各业务报表,还有周报月报这些,开发成可自动抽取数据并展示的模板,做好一次,每次只要查询即可。
02 FineReport 如何做报表?
先来说说他的做表原理,和Excel还是大有不同的。
FineReport的做表原理
做报表首先得有数据,数据哪里来?一个是直接连接业务系统或者数据库的数据,还有可以导入excel文件数据,连好数据后,开始制作模板,类似于做excel表格一样,设计展现的样式,计算的公式,最后在web端展示。
但是和excel不用,excel处理的是一个个数据,finereport制作模板时处理的对象是数据字段,模板中一个单元格放一个数据字段,web端展示时字段扩展。FineReport报表中单元格的扩展是有方向的,可纵向扩展,也可横向扩展,也可以不扩展。
单元格的扩展是针对某一个单元格,当报表主体中绑定了多个单元格时,单元格与单元格之间依靠父子格关系跟随扩展。子格的数据会根据父格的数据进行过滤分组显示,并且还会跟随父格的扩展方向而扩展。
三种报表模式
1、普通报表模式
就是常规的表格报表,像财务报表,复杂的中国式报表。
① 能很轻松的进行分页、分栏、分组设置
分页:指定分页;冻结表头,重复标题行结尾行;页内合计;不分页预览;横向不分页纵向分页。分组:自定义公式分组;条件分组;普通分组;相邻连续分组;组织递归树。分栏:行分栏;列分栏;卡片式分栏;重复标题行;自动补足空白行。 ② 支持主子报表、树报表等多种个性化报表
主子报表:适用于同一报表包含多块区域用于展示不同内容;树报表:适用于展现具有层级关系的数据,比如跟组织结构相关的数据展现。比如树数据集来实现此类报表。
2、聚合报表模式:针对不规则的大报表
它可以报表分成每一块,在画布上自由拼接聚合块,省去频繁合并拆分单元格的麻烦
各模块互相独立,任意拖拽,自由拼接各模块之间单元格扩展分离,互不影响
3、决策报表:可视化dashboard
这个是用来做数据可视化一类的报表。
通过拖拽表格、图表、查询控件等来设计,绑定不同的数据源。可视化大屏就只这么做的。
03 参数实现数据查询和过滤,省得重复做报表
查询报表是怎么做呢?在FineReport中,通过设置参数绑定数据字段和过滤的控件(单选框、复选框等等),通过界面输入查询条件来控制报表显示的内容及形式,而后导出打印。
很多人工作上会做周报月报季报等,有些全国性的公司有分公司、门店、办事处。经常性地要做这些重复性很大的报表。那用FineReport就可以集中将每一条数据明细上传到数据库中(填报功能,下面会讲)。在做报表时,做将一些常用的维度“地区”、“时间”、“城市”等等作为一个查询的参数控件,类似Excel中的筛选,导出。基本上一个周报模板,就解决了一些人一年52张手工excel报表的工作量。
04 数据可视化
可视化方面,自带了50多种可视化图表,基本够用。
支持柱形图,折线图,饼图,雷达图,散点图、圆环图,条形图,地图、堆积图、面积图、组合图、气泡图、地图、GIS地图、仪表盘、全距图、甘特图、树图等多种图表类型和图表样式;
可以用集成开源的可视化图表,如Echarts、Hicharts、D3...
还有一些酷炫的可视化动效插件,用来做可视化大屏不错。
基于webgl等技术开发,作为基础图表的补充,为大屏用户提供更酷炫的图表效果;支持三维柱形地球、三维点地球、三维流向地球、KPI指标卡、粒子翻页计数器、时间齿轮、目录齿轮、轮播gis点地图等多种扩展图表。
强大的数据地图
好了,差不多就是这样,看到这里的同学都是好学的,
最后
篇幅有限,以上只展现了FineReport的一部分功能,很多细节无法展开。
要说效率,最大的好处就是从数据库中读出数据自动产生报表,且一类报表做成一个固定样式的模板,每次只要同步一下,自动同步周期性的报表,如日报、周报、月报、季报等。 还能批量导出/打印,少了人力去一个一个用Excel统计汇总。
且操作上,原本Excel需要VBA开发的成本,在FineReport里大多数都封装成模块了,包括写SQL取数,汇总筛选过滤等,基本上都有对应的功能键。像著名的资产负债表,如果按照以往写代码或者写复杂的SQL语句,就有点摧残生命了,而且那天书般的SQL语句要是出点错谁来查,如果数据来自多个源,那就彻底无法解脱了。
其次,在数据处理速度上,由于性能一部分依靠数据库,一部分依靠FineReport的形式报表引擎,相比于Excel的单机效率,几十万行的数据秒出。
最后,感兴趣的可以官网下载体验
之前发的《学习计划|带你10周入门数据分析》,今晚开始第一周学习,老司机们快上车啦!
- ?
POI导致内存溢出的一个不能忽视的问题
惜霜
展开
最近,由于项目需要,用到poi来操作Excel完成数据的导入。
一开始,以为是JVM内存不足,故意将内存调整到4G,足够大了,然后在运行时仍然曝出内存溢出。
然后又想到会不是循环行时创建的对象太多,又将对象的定义移到循环的外面,问题仍然没有解决。
接下来,又给FileInputStream的读取增加BufferedInputStream缓冲区读取,问题依然存在。
百无聊赖,仍然找不到问题的突破口。这时候,随便点了一下Excel表格的内容,发现了问题的所在,Excel中使用了公式,这里一定要注意:
使用POI读取Excel时,Excel里面一定不要使用公式,这样一方面会造成程序崩溃,一方面造成内存溢出,也就是会发生上面我们提到的后果(java.lang.OutOfMemoryError)java heap space.好了,很简单的一个问题,折磨了一下午,头疼。
最后,再次重申:当遇到采用POI读取Excel发生内存溢出时,一定要先检查Excel中各列是否有采用公式,如果有公式,一定要去掉改用手写。
如果你感觉本文对你有用,请分享给更多有需要的人。
- ?
SpreadJS ExcelIO实现服务器端Excel导入导出
郁觅夏
展开
SpreadJS在V10版本后推出了纯前端的Excel导入导出,这个功能可以很方便的实现客户端的Excel导入导出,但是如果用户需要导入导出到浏览器端又该怎么办呢?其实纯前端的Excel导入导出同样可以实现服务器端的Excel导入导出。下面让我们来看一下是如何实现的:
本示例的后端使用JAVA语言,通过SpreadJS的前端导出导出与JAVA后端结合,实现分从服务器端导入Excel与导出Excel保存至服务器端这两个功能:
从服务器端导入Excel:
这部分使用纯前端实现,纯前端实现有一个弊端就是,浏览器没有权限访问服务器上工程目录以外的路径,所以需要将服务器端的Excel放入工程目录下。然后下载到前端直接打开,核心代码如下:
导出Excel保存至服务器端:
这部分使用前端导出功能与后端java结合的方式来实现,首先通过前端Excel导出,生成导出文件,然后通过formdata来承载导出文件,之后通过ajax将formdata传至后端java。后端java使用文件操作将文件保存至服务器端。
这里有以下需要注意的地方:
formdata没有办法改变enctype,而我们需要的用entype为multipart/form-data类型的form来承载导出文件。这里需要在jsp页面上创建一个空的form,并将其entype设置为multipart/form-data:
之后js中只需要初始化一个该form的formdata实例即可:
var fd = new FormData(document.forms.namedItem("myform"));
以上就是核心的部分代码以及原理。
了解更多
SpreadJS是 Spread 表格开发系列产品之一。该产品是葡萄城公司出品的一系列功能和 Excel 类似的表格工具,支持桌面、Web 和移动平台开发,用于在应用系统中实现 Excel 导入导出、表格数据录入和编辑等交互功能,并提供灵活的定制能力和丰富的数据可视化效果。
Spread 是目前市面上最接近 Excel 的表格开发工具,无论是界面、函数还是布局,都与 Excel 高度接近,正被华为、东软、中国平安、河海大学、中通快递、普华永道、魔方网表、思源软件等企业应用于项目开发中。
除了纯前端的SpreadJS,该系列产品还包括 .NET 平台可用的Spread Studio,和服务器端批量操作Excel的Spread表格组件,敬请登陆官网了解更多:http://gcpowertools/
关于葡萄城
葡萄城成立于1980年,是全球最大的控件提供商,世界领先的企业应用定制工具、企业报表和商业智能解决方案提供商,为超过75%的全球财富500强企业提供服务。葡萄城于1988年在中国设立研发中心,在全球化产品的研发过程中,不断适应中国市场的本地需求,并为软件企业和各行业的信息化提供优秀的软件工具和咨询服务。
- ?
Java实现文件批量导入导出实例(兼容xls,xlsx)
La
展开
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(); }
- ?
一行代码完成Java的Excel读写
CoolApple
展开
前段时间在 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、快速多表合并