前言
工作项目中,合作方提供了一张Excel的数据表,需要将其转成 Json 文件,正好最近学习了python,就决定用 python 来试试水,实现这个功能。
工作环境
- python 3.6
- python 对 Excel 的操作,需要依赖 xlrd, xlwt 这两个模块,xlrd 是读 Excel 的模块,xlwt 是写 Excel 的模块
- pip install xlrd
- pip install xlwt
拿到 Excel 表仔细扫了一眼,我发现表格中有一列数据基本就没有,但是这一列又是比较重要的一项,内容被包含在了另一列的数据中,所以我决定先将 Excel 表重新用 python 写一遍,所以将 xlwt 包也加了进来,如果只是读 Excel 文件,只需要 xlrd 就够了。
xlrd
打开Excel文件读取数据
data = xlrd.open_workbook(file_path) # 返回一个xlrd.book.Book实例
获取 book 中一个工作表
table = data.sheets()[0] #通过索引顺序获取,返回xlrd.sheet.Sheet实例
table = data.sheet_by_index(sheet_indx)) #通过索引顺序获取,返回xlrd.sheet.Sheet实例
table = data.sheet_by_name(sheet_name) #通过名称获取,返回xlrd.sheet.Sheet实例
获取 book 中所有工作表的名称
names = data.sheet_names() #返回book中所有工作表名字的集合list
获取该 sheet 中的有效行数
nrows = table.nrows
获取该行中所有的单元格对象组成的集合list
table.row(rowx) #返回的带有数据的类型
获取该行中所有单元格数据组成的集合list
table.row_values(rowx, start_colx=0, end_colx=None)
xlwt
新建 excel 文件
file = xlwt.Workbook(encoding="utf-8") #默认是 ascii
新建 sheet 表
table = file.add_sheet(sheet_name, cell_overwrite_ok=False) #返回xlwt.Worksheet.Worksheet实例,如果需要对一个单元格重复操作,需要将 cell_overwrite_ok=True
向 x 行 y 列 写入数据 value
table.write(x, y, value)
保存文件
file.save(file_name)
对Excel表添加数据
def completion_excel():
file_path = input("输入需要操作的Excel文件的绝对路径>>>")
data = achieve_data(file_path)
if data is not None:
worksheets = data.sheet_names()
print("包含的表单:")
for index, sheet in enumerate(worksheets):
print(index, sheet)
choose = input("请输入表单对应的编号>>>")
table = data.sheet_by_index(int(choose))
# 创建Excel表
workbook = xlwt.Workbook(encoding="utf-8")
# 创建 sheet
worksheet = workbook.add_sheet("sheet1")
# 先写表头
titles = table.row_values(0)
for k, v in enumerate(titles):
worksheet.write(0, k, v)
for i in range(1, table.nrows):
row = table.row_values(i)
# 补全年级的表
if row[4] == "":
course = row[6]
if "年级" in course:
n = course.index("年级")
row[4] = course[n-1:n+3]
else:
row[4] = "初中"
for x, y in enumerate(row):
worksheet.write(i, x, y)
workbook.save("Excel_test.xls")
将新的Excel文件转成Json
def excel2json():
file_path = input("输入需要转成Json的Excel文件的路径>>>")
data = achieve_data(file_path)
if data is not None:
# 抓取所有sheet页的名称
worksheets = data.sheet_names()
print("包含的表单:")
for index, sheet in enumerate(worksheets):
print(index, sheet)
choose = input("请输入表单对应的编号>>>")
table = data.sheet_by_index(int(choose))
# 获取到数据的表头
titles = table.row_values(0)
result = {}
result["middle_school"] = []
# excel文件表有 10196 行,所以做10196次循环
for i in range(1, table.nrows):
row = table.row_values(i)
tmp = {}
for index, title in enumerate(titles):
if title == "id":
tmp[title] = int(row[index])
else:
tmp[title] = row[index]
result["middle_school"].append(tmp)
with open("middle_school.txt", 'w', encoding='utf-8') as f:
json.dump(result, f)