Java 处理 Excel:从 POI 到 SPL_java excel 表 spel,2024年最新大数据开发大厂面试题来袭

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

解析格式很不规则的xls,SPL提供了xlscell函数,可以读写指定sheet里指定片区的数据,比如读取第1个sheet里的A2格:

=file(“d:/Orders.xlsx”).xlsopen().xlscell(“C2”)

配合SPL灵活的语法,就可以解析自由格式的xls,比如将下面的文件读为规范的二维表(序表):

4png

这个文件格式很不规则,直接基于POI写Java代码是个浩大的工程,而SPL代码就简短得多:

ABC
1=create(ID,Name,Sex,Position,Birthday,Phone,Address,PostCode)
2=file(“e:/excel/employe.xlsx”).xlsopen()
3[C,C,F,C,C,D,C,C][1,2,2,3,4,5,7,8]
4for=A3.(/B3(#)).(A2.xlscell())
5if len(B4(1))==0break
6>A1.record(B4)
7>B3=B3.(~+9)

生成规则的行式xls,SPL提供了xlsexport函数,用法也很简单。比如,上面例子的解析结果是个序表,存在SPL的A1格中,下面将A1写入新xls的第一个sheet,首行为列名,只要一句代码:=file(“e:/result.xlsx”).xlsexport@t(A1)

xlsexport函数的功能丰富多样,可以将序表写入指定sheet,或只写入序表的部分行,或只写入指定的列:=file(“e:/scores.xlsx”).xlsexport@t(A1,No,Name,Class,Maths)

xlsexport函数还可以方便地追加数据,比如对于已经存在且有数据的xls,将序表A1追加到该文件末尾,外观风格与原文件末行保持一致:=file(“e:/scores.xlsx”).xlsexport@a(A1)

不规则片区写入数据,可以使用前面的xlscell函数。比如,xls中蓝色单元格是不规则的表头,需要在相应的白色单元格中填入数据,如下图:

5png

直接用POI要大段冗长的代码,而SPL代码就简短许多:

ABCDEF
1Mengniu Funds2017358.2364300
28.550200100400200
3182.676.343.728.516.4
41201.07300.27900.8
515464
6=file(“e:/result.xlsx”)=A6.xlsopen()
7=C6.xlscell(“B2”,1;A1)=C6.xlscell(“J2”,1;B1)=C6.xlscell(“L2”,1;C1)
8=C6.xlscell(“B3”,1;D1)=C6.xlscell(“G3”,1;E1)=C6.xlscell(“K3”,1;F1)
9=C6.xlscell(“B6”,1;[A2:F2].concat(“\t”))=C6.xlscell(“H6”,1;[A3:E3].concat(“\t”))
10=C6.xlscell(“B9”,1;[A4:F4].concat(“\t”))=C6.xlscell(“B11”,1;[A5:C5].concat(“\t”))
11=A6.xlswrite(B6)

注意,第6、9、11行有连续单元格,SPL可以简化代码一起填入,POI只能依次填入。

SPL提供足够的查询计算能力

查询计算是Excel处理任务的重点,SPL提供了丰富的计算函数、字符串函数、日期函数,以及标准SQL语法,不仅支持日常的xls计算,也能计算内容不规则的xls和逻辑复杂的xls。

SPL提供了丰富的计算函数,可直接完成基础计算。比如前面的分组汇总,只要一句:

A1.groups(SellerId;sum(Amount))

更多计算:

条件查询:A1.select(Amount>1000 && Amount<=3000 && like(Client,“S”))

排序:A1.sort(Client,-Amount)"

去重:A1.id(Client)"

关联两个xlsx:join(T(“D:/Orders.xlsx”)😮,SellerId; T(“D:/Employees.xls”):E,EId).new(O.OrderID,O.Client,O.SellerId,O.Amount,O.OrderDate, E.Name,E.Gender,E.Dept)"

TopN:T(“D:/Orders.xls”).top(-3;Amount)

组内TopN (开窗函数):T(“D:/Orders.xls”).groups(Client;top(3,Amount))

SPL支持大量日期函数和字符串函数,代码量更短,开发效率更高。比如:

时间类函数,日期增减:elapse(“2020-02-27”,5) //返回2020-03-03

星期几:day@w(“2020-02-27”) //返回5,即星期4

N个工作日之后的日期:workday(date(“2022-01-01”),25) //返回2022-02-04

字符串类函数,判断是否全为数字:isdigit(“12345”) //返回true

取子串前面的字符串:substr@l(“abCDcdef”,“cd”) //返回abCD

按竖线拆成字符串数组:“aa|bb|cc”.split(“|”) //返回[“aa”,“bb”,“cc”]

SPL还支持年份增减、求年中第几天、求季度、按正则表达式拆分字符串、拆出SQL的where或select部分、拆出单词、按标记拆HTML等功能。

SPL提供了标准SQL语法,可以像对数据库表一样直接对xls文件进行查询,极大地降低了数据库程序员的学习门槛:

filter:

s

e

l

e

c

t

f

r

o

m

d

:

/

s

O

r

d

e

r

.

x

l

s

x

w

h

e

r

e

C

l

i

e

n

t

l

i

k

e

select * from d:/sOrder.xlsx where Client like ‘%S%’ or (Amount>1000 and Amount<=2000)sort:

select∗fromd:/sOrder.xlsxwhereClientlike′select * from sales.xls order by Client,Amont descdistinct:$ select distinct(sellerid) from sales.xls group by…having:KaTeX parse error: Expected ‘EOF’, got ‘&’ at position 98: …ing sum(amount)&̲gt;=2000000join…select e.name, s.orderdate, s.amount from sales.xls s left join employee.xlsx e on s.sellerid= e.eid

SPL支持SQL-92标准中大部分语法,包括集合计算、case when、with、嵌套子查询等,详见《没有 RDB 也敢揽 SQL 活的开源金刚钻 SPL》

内容不规则的xls,一般的类库都无能为力,SPL语法灵活函数丰富,可轻松解决处理。比如Excel单元格里有很多”key=value”形式的字符串,需要整理成规范的二维表,以进行后续计算:

A
1=file(“D:/data/keyvalue.xlsx”).xlsimport@w()
2=A1.conj().(~.split(“=”))
3=A2.new((1),(2))

逻辑复杂的计算,SQL和存储过程都难以实现,SPL的计算能力更强,可轻松解决此类问题。比如,计算某支股票最长的连续上涨天数:

A
1=T(“d:/AAPL.xlsx”)
2=a=0,A1.max(a=if(price>price[-1],a+1,0))

SPL支持更优的应用架构

SPL是解释型语言,提供JDBC接口,可以用SQL或存储过程的形式被JAVA集成,不仅降低了架构的耦合性,还能支持热切换。SPL还支持多种数据源,并支持跨数据源计算。

SPL提供了JDBC接口,可被JAVA轻松调用。简单的SPL代码可以像SQL一样,直接嵌入JAVA,比如条件查询:

Class.forName("com.esproc.jdbc.InternalDriver");
Connection connection =DriverManager.getConnection("jdbc:esproc:local://");
Statement statement = connection.createStatement();
String str="=T(\"D:/Orders.xls\").select(Amount>1000 && Amount<=3000 && like(Client,\"*S*\"))";
ResultSet result = statement.executeQuery(str);

SPL支持计算外置,可降低计算代码和前端应用的耦合性。复杂的SPL代码可以先存为脚本文件,再以存储过程的形式被JAVA调用:

Class.forName("com.esproc.jdbc.InternalDriver");
Connection conn =DriverManager.getConnection("jdbc:esproc:local://");
CallableStatement statement = conn.prepareCall("{call scriptFileName(?, ?)}");
statement.setObject(1, "2020-01-01");
statement.setObject(2, "2020-01-31");
statement.execute();

SPL是解释型语言,通过外置代码可实现热切换。解释型语言无须编译,修改后可立即执行,无须重启JAVA应用,可降低维护工作量,提高系统稳定性。

SPL支持多种文件数据源,除了xls外,SPL还能读写csv\txt\XML\Json等文件,比如对txt进行条件查询:

T(“sOrders.txt”).groups(SellerId;sum(Amount))

$select * from d:/sOrders.txt where Client like ‘%S%’ or (Amount>1000 and Amount<=2000)

SPL支持跨数据源计算,比如xls和txt的关联计算:

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

sOrders.txt where Client like ‘%S%’ or (Amount>1000 and Amount<=2000)

SPL支持跨数据源计算,比如xls和txt的关联计算:

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
[外链图片转存中…(img-m9vpKyXi-1713299607541)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值