如何使用openpyxl从Excel提取JSON数据适配NiFi?
问题描述
需要从Excel单元格提取指定行列数据导入NiFi,因NiFi不支持Jython无法使用pandas,只能借助openpyxl处理。目标是生成单个JSON对象字符串(如{"data1": 0, "data2": 0, "data3": 0}),但当前代码生成的是字典列表,且json.dump无法正常工作。同时询问其他Excel导入NiFi的方法,以及是否可先转XML再导入。
当前使用代码:
sheet = ws1 data = [] for i in range(3, 13): filial = sheet.cell(row=i, column=1).value kvartal1 = sheet.cell(row=i, column=2).value kvartal2 = sheet.cell(row=i, column=3).value kvartal3 = sheet.cell(row=i, column=4).value kvartal4 = sheet.cell(row=i, column=5).value row1 = {filial:kvartal1} data.append(row1)
当前输出结果:
[{'data1': 0}, {'data2': 0}, {'data3': 0}, {'data4': 0}, {'data5': 0}, {'data6': 0}, {'data7': None}, {'data8': None}, {'data9': None}]
解决方案
1. 调整代码生成目标JSON格式
你当前代码生成的是字典列表,要改成单个字典存储数据,再用json.dumps(而非json.dump,dump用于写入文件,dumps才是生成字符串)转换。调整后代码如下:
import json from openpyxl import load_workbook # 加载Excel文件并获取工作表 wb = load_workbook('你的Excel文件路径.xlsx') ws1 = wb.active data = {} # 改用单个字典存储键值对 for i in range(3, 13): filial = ws1.cell(row=i, column=1).value kvartal1 = ws1.cell(row=i, column=2).value # 处理None值(JSON不支持Python的None,可按需替换为0或空字符串) if kvartal1 is None: kvartal1 = 0 data[filial] = kvartal1 # 生成JSON字符串 json_str = json.dumps(data) print(json_str)
执行后就能得到你需要的{"data1":0,"data2":0,...}格式字符串。
2. 其他NiFi导入Excel的方法
不用自行写脚本的话,NiFi有现成处理器可直接处理Excel:
- ConvertExcelToCSV + ConvertCSVToJSON:先把Excel转成CSV格式,再转成JSON,全程无需编码
- QueryRecord:配合ExcelReader服务,用SQL语句直接查询Excel指定行列数据,输出结构化JSON
- ExecuteScript:用Groovy/Java编写脚本处理Excel(NiFi原生支持Groovy,适配性更好),借助Apache POI库操作Excel并生成JSON字符串
3. Excel转XML再导入NiFi的可行性
完全可行:
- 可通过Excel自带的「另存为」功能转成XML,或用openpyxl生成XML格式数据
- 后续用NiFi的ConvertXMLToJSON处理器将XML转成JSON,或用EvaluateXPath提取所需数据后再转换为目标格式
- 这种方式适合保留Excel复杂结构的场景,但步骤比直接转CSV/JSON更多
内容的提问来源于stack exchange,提问作者Pauline Rumyantseva
相关产品推荐
相关产品推荐

