openpyxl操作Excel
安装插件
pip install openpyxl
本次使用的openpyxl指令
- openpyxl.load_workbook() 打开excel工作簿
- 工作簿.worksheets 返回工作簿中所有工作表的列表。
- 工作表.sheet_state 查询工作表状态,visible, hidden, veryHidden
- 工作表.max_row 含内容的单元格的最大行序号。【从1开始】
- 工作表.max_column 含内容的单元格的最大列序号。【从1开始】
- 以行为单位获取单元格或单元格的值: 工作表.iter_rows(min_row=None, max_row=None, min_col=None, max_col=None, values_only=False)
参数
min_col=None : int or None。指定获取的最小列号。默认为1。(1为基数的索引序号)
max_col=None : int or None。指定获取的最大列号。默认为含数据的最大单元格列号。(1为基数的索引序号)
min_row=None : int or None。指定获取的最小行号。默认为1。(1为基数的索引序号)
max_row=None: int or None。指定获取的最大行号。默认为含数据的最大单元格行号。(1为基数的索引序号)
values_only=False : bool。是否只返回单元格的值。若为True,将只给出单元格的值。
返回
generator
补充
使用list(……)转为 元组数组
- 以行为单位获取单元格或单元格的值: 工作表.iter_cols(min_col=None, max_col=None, min_row=None, max_row=None, values_only=False)
参数
min_col=None : int or None。指定获取的最小列号。默认为1。(1为基数的索引序号)
max_col=None : int or None。指定获取的最大列号。默认为含数据的最大单元格列号。(1为基数的索引序号)
min_row=None : int or None。指定获取的最小行号。默认为1。(1为基数的索引序号)
max_row=None : int or None。指定获取的最大行号。默认为含数据的最大单元格行号。(1为基数的索引序号)
values_only=False : bool。是否只返回单元格的值。若为True,将只给出单元格的值。
返回
generator
补充
使用list(……)转为元组数组
import openpyxl
# import math
# import numpy as np
import json
import io
import re # re模块,通过正则表达式匹配处理字符串的
# excel表格转json文件
def excel_to_json(excel_file, json_file_name):
hotCampus = [] # 数据存放
ws = openpyxl.load_workbook(excel_file) # 打开excel文档
# booksheet = book.sheetnames
# letterNum = np.arange(97, 123)
# letterUpper = [chr(i).upper() for i in letterNum] # 生成大写字母列表
# 遍历所有工作表
for i in ws.worksheets:
# 仅操作显示的的工作表
if i.sheet_state == 'visible':
CampusList = {}
CampusList['name'] = i.title # 表名作为职位城市name
CampusList['joblist'] = [] # 每一城市包含的职位列表
minRow = 2 # 最小行
maxRow = i.max_row # 最大行
minCol = 1 # 最小列
maxCol = 21 # 最大列
coList = list(i.iter_rows(min_row = minRow, max_row = maxRow, min_col = minCol, max_col = maxCol, values_only=True)) # 获取每个工作表的元组数据
# print(i.title, coList)
# 遍历元组
for co in coList:
ComList = {}
if co[0] != None:
ComList['name'] = co[0]
ComListTab = []
if co[1] != None:
ComListTab.extend(re.split(r'[、]', co[1])) # 按照行('\r', '\r\n', '\n')分隔,返回一个包含各行作为元素的列表
if co[2] != None:
ComListTab.append(co[2])
if len(ComListTab) != 0:
ComList['tag'] = ComListTab
# 职位及职位链接
ComListJob = []
n = 3
while n < len(co) -2:
jobChild = {}
if n%2 != 0:
if co[n] != None:
jobChild['title'] = co[n].rstrip('\n') # rstrip() 删除 string 字符串末尾的指定字符,默认空白符
if co[n+1] != None:
jobChild['link'] = co[n+1].rstrip('\n')
if len(jobChild) != 0:
ComListJob.append(jobChild)
n += 1
if len(ComListJob) != 0:
ComList['job'] = ComListJob
if co[len(co) -2] != None:
ComList['more'] = co[len(co) -2].rstrip('\n')
if len(ComList) != 0:
CampusList['joblist'].append(ComList)
if len(CampusList) != 0:
hotCampus.append(CampusList)
ws.close()
save_json_file(hotCampus, json_file_name)
# 将json保存为文件
def save_json_file(data, json_file_name):
file = io.open(json_file_name, 'w', encoding='utf-8')
# 把对象转化为json对象
# indent: 参数根据数据格式缩进显示,读起来更加清晰
# ensure_ascii = True:默认输出ASCII码,如果把这个该成False, 就可以输出中文。
txt = json.dumps(data, indent=2, ensure_ascii=False)
file.write(txt)
file.close()
if '__main__' == __name__:
excel_to_json(u'qz.xlsx', 'qz.json')