com.crealytics.spark.excel
<dependency>
<groupId>com.crealytics</groupId>
<artifactId>spark-excel_2.12</artifactId>
<version>3.2.1_0.17.1</version>
</dependency>
// 较新的版本使用了poi5,easyexcel为4.1.2 使用 dependencyManagement 指定poi版本
// https://github.com/crealytics/spark-excel/blob/main/CHANGELOG.md
// CHANGELOG 标明了0.12.1 升级到poi4.1
spark.read().format("com.crealytics.spark.excel")
// 使用表头
.option("header", "true")
.option("treatEmptyValuesAsNulls", "true")
// 自动推断schema
.option("inferSchema", "true")
//.option("addColorColumns", "true")
// 时间格式
.option("timestampFormat", "yyyy/MM/dd HH:mm:ss")
.load(url);
7.27.2022 add
<!-- pom 文件中使用dependencyManagement 指定poi版本为spark-excel 所依赖的版本 -->
<dependencyManagement>
<!-- poi -->
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
</dependencies>
</dependencyManagement>
从3.0.5 升级到3.1.1 结构发生了变化,手动引入 poi 依赖
org.zuinnote.spark.office.excel
<dependency>
<groupId>com.github.zuinnote</groupId>
<artifactId>spark-hadoopoffice-ds_2.12</artifactId>
<version>1.6.4</version>
</dependency>
// pom中的spark版本为2.4.8 解析时间的方法在实际使用的3.2.1被移除 使用时会报nosuchmethod
spark.read().format("org.zuinnote.spark.office.excel")
.option("read.spark.simpleMode",true)
.option("hadoopoffice.read.header.read", true)
.load(url);
poi 读取
List<Map<String, String>> list = new ArrayList<>;
// 假定数据为 [{"age":"1","sex":"0"}]
// List<Map<String, String>> 转 List<Row>
List<Row> rows = list.stream().map(map -> RowFactory.create(map.values().toArray())).collect(Collectors.toList());
// createSchema (以第一条数据的key作为字段名)
StructType schema = DataTypes.createStructType(
Arrays.stream(list.get(0).values().stream().map(String::toString).toArray(String[]::new)).map(fieldName -> new StructField(fieldName, DataTypes.StringType, true, Metadata.empty())).collect(Collectors.toList())
);
// easyExcel读取时 获取ReadListener的表头
// 根据 headMap 创建 schema
StructType schema = DataTypes.createStructType(
headMap.values().stream().map(fieldName -> new StructField(fieldName, DataTypes.StringType, true, Metadata.empty()))
.collect(Collectors.toList()));
// List<Row> 转为 Dataset<Row>
spark.createDataFrame(rows, schema);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。