如何用openpyxl提取Excel指定行并插入结果指定位置,过滤指定列?
使用openpyxl提取Excel特定内容并生成JSON字符串
以下是基于openpyxl修改的脚本,完全符合你的需求——跳过指定行列、保留目标列、将第3行内容插入结果指定位置,最终输出JSON字符串:
import openpyxl import json def excel_to_custom_json(file_path): # 打开Excel工作簿,只读模式处理大文件更高效 wb = openpyxl.load_workbook(file_path, read_only=True) ws = wb.active # 假设处理第一个工作表,可根据需求修改为ws = wb["工作表名称"] # 筛选需要保留的列索引(从0开始计数) target_cols = [] header_row = next(ws.iter_rows(min_row=1, max_row=1, values_only=True))[0] for col_idx, cell_value in enumerate(header_row): # 保留第一列,以及表头为"1 part"、"3 part"、"4 part"的列 # 排除包含"2 part"或"Year"的列 if col_idx == 0: target_cols.append(col_idx) elif cell_value in ["1 part", "3 part", "4 part"]: target_cols.append(col_idx) elif "2 part" in str(cell_value) or "Year" in str(cell_value): continue # 提取第3行的内容,后续插入每个结果的指定位置 third_row_data = {} third_row = next(ws.iter_rows(min_row=3, max_row=3, values_only=True))[0] for col_idx in target_cols: header = header_row[col_idx] third_row_data[header] = third_row[col_idx] # 遍历行,收集有效数据 result = [] # 从第5行开始遍历(跳过第4行),同时跳过第一列值为"Place"、"All"、"Year"的行 for row in ws.iter_rows(min_row=5, values_only=True): first_col_value = row[0] if first_col_value in ["Place", "All"] or "Year" in str(first_col_value): continue # 收集当前行的目标列数据 row_data = {} for col_idx in target_cols: header = header_row[col_idx] row_data[header] = row[col_idx] # 将第3行内容插入到指定位置(这里用"third_row_summary"作为键,可自定义) row_data["third_row_summary"] = third_row_data result.append(row_data) # 关闭工作簿 wb.close() # 转为JSON字符串,ensure_ascii=False支持中文 return json.dumps(result, indent=4, ensure_ascii=False) # 调用示例 if __name__ == "__main__": json_str = excel_to_custom_json("your_excel_file.xlsx") print(json_str) # 也可以写入文件 with open("output.json", "w", encoding="utf-8") as f: f.write(json_str)
关键逻辑说明:
- 大文件优化:使用
read_only=True模式打开工作簿,避免加载整个文件到内存,适合处理大Excel文件。 - 列筛选:遍历表头行,只保留第一列和标注为"1 part"、"3 part"、"4 part"的列,自动跳过"2 part"和"Year"相关列。
- 行过滤:直接从第5行开始遍历(跳过第4行),同时排除第一列值为"Place"、"All"或包含"Year"的行。
- 第3行内容插入:提前提取第3行的目标列数据,将其作为单独的键值对插入到每个结果条目中,位置可通过修改键名(
third_row_summary)自定义。
内容的提问来源于stack exchange,提问作者Pauline Rumyantseva
相关产品推荐
相关产品推荐

