问题背景
有时候我们在进行一些表的计算之后,会生成一些指标,需要导出来给其它同事用,虽说可以将DataFrame直接写成表,然后通过工具(比如Hue)导出为Excel,但是步骤就多了,而且如果要导出的表比较多的话,就更浪费时间了,那么这时候调用第三方插件就可以直接导出为Excel。
实现
1. Maven依赖
需添加的第三方依赖:
<dependency>
<groupId>com.crealytics</groupId>
<artifactId>spark-excel_2.11</artifactId>
<version>0.12.5</version>
</dependency>
2. 代码实现
df.write
.format("com.crealytics.spark.excel")
.option("dataAddress", "'My Sheet'!B3:C35") // 指定sheet名称和要开始写入的cell位置或cell范围
.option("useHeader", "false") //是否输出表头
.option("dateFormat", "yyyy-mm-dd hh:mm:ss") // Optional, default: yy-m-d h:mm
.option("timestampFormat", "yyyy-mm-dd hh:mm:ss") // Optional, default: yyyy-mm-dd hh:mm:ss.000
.mode("append") // Optional, default: overwrite. "append"模式下可以在一个Excel文件中追加多个sheet
.save("/file.xlsx") // 要输出的HDFS文件路径.
3. 参数详解
下面就拿两种最常用的参数举例:
1. ‘sheet_name’!B3:C35。
- sheet_name:表示要指定的sheet名称,如果不指定sheet,系统会给一个默认名称。另外,在追加模式下(mode=“append”),一个Excel文件可以写入多个sheet;
- B3:C35:B3为起始位置,表示数据从B3这个cell位置开始写;C35为终止位置,表示数据写到C35这个位置为止。当然,可以只指定起始位置,那会从起始位置写入尽可能多的数据;也可以只指定终止位置,那会默认从表格的第一个cell也就是A1开始写数据,到指定的终止位置。
2. sheet_name[#All]
- [#All]:表示从表格的第一个cell也就是A1开始写尽可能多的数据。