在Databricks(PySpark)中用com.crealytics.spark.excel提取Excel工作表名
获取Azure Data Lake中Excel文件的工作表名
crealytics的spark-excel库本身没有提供直接返回工作表名的API,但可以通过以下两种方法实现需求:
方法一:利用spark-excel的元数据读取特性
当指定sheetName="__all__"时,读取后的DataFrame会自动添加_sheet_name列标识数据所属工作表。通过设置maxRows=0可以只读取元数据(不加载实际内容),高效提取表名:
# 仅加载元数据,不读取实际数据 sheet_metadata_df = spark.read.format("com.crealytics.spark.excel") \ .option("header", "true")\ .option("sheetName", "__all__")\ .option("maxRows", 0) # 限制仅读取表头和表名信息 .load("abfss://dev@stopsdev.dfs.core.windows.net/file.xlsx") # 提取并去重工作表名 sheet_names = sheet_metadata_df.select("_sheet_name").distinct().rdd.flatMap(lambda x: x).collect() print(sheet_names)
方法二:直接用Apache POI解析Excel元数据
spark-excel底层依赖Apache POI库,可直接通过Spark的Hadoop文件系统API读取文件流,用POI解析工作表名:
from org.apache.poi.ss.usermodel import WorkbookFactory from pyspark.sql import SparkSession spark = SparkSession.builder.getOrCreate() # 获取Hadoop文件系统实例 fs = spark._jvm.org.apache.hadoop.fs.FileSystem.get(spark._jsc.hadoopConfiguration()) file_path = spark._jvm.org.apache.hadoop.fs.Path("abfss://dev@stopsdev.dfs.core.windows.net/file.xlsx") # 打开文件流并解析Excel input_stream = fs.open(file_path) workbook = WorkbookFactory.create(input_stream) # 遍历获取所有工作表名 sheet_names = [workbook.getSheetName(i) for i in range(workbook.getNumberOfSheets())] print(sheet_names) # 关闭资源 input_stream.close() workbook.close()
方法对比
- 方法一:代码简洁,贴合Spark生态,无需额外依赖(已使用
spark-excel),但依赖库的_sheet_name列特性。 - 方法二:更直接,不依赖数据读取逻辑,但需要处理Java API调用,适合需要精细控制元数据读取的场景。
内容的提问来源于stack exchange,提问作者AzSurya Teja
相关产品推荐
相关产品推荐

