前言
工作項目中,合作方提供了一張Excel的數(shù)據(jù)表厅目,需要將其轉(zhuǎn)成 Json 文件贴捡,正好最近學習了python忽肛,就決定用 python 來試試水,實現(xiàn)這個功能烂斋。
工作環(huán)境
- python 3.6
- python 對 Excel 的操作屹逛,需要依賴 xlrd, xlwt 這兩個模塊,xlrd 是讀 Excel 的模塊源祈,xlwt 是寫 Excel 的模塊
- pip install xlrd
- pip install xlwt
拿到 Excel 表仔細掃了一眼煎源,我發(fā)現(xiàn)表格中有一列數(shù)據(jù)基本就沒有,但是這一列又是比較重要的一項香缺,內(nèi)容被包含在了另一列的數(shù)據(jù)中手销,所以我決定先將 Excel 表重新用 python 寫一遍,所以將 xlwt 包也加了進來图张,如果只是讀 Excel 文件锋拖,只需要 xlrd 就夠了。
xlrd
打開Excel文件讀取數(shù)據(jù)
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 中的有效行數(shù)
nrows = table.nrows
獲取該行中所有的單元格對象組成的集合list
table.row(rowx) #返回的帶有數(shù)據(jù)的類型
獲取該行中所有單元格數(shù)據(jù)組成的集合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實例适袜,如果需要對一個單元格重復(fù)操作柄错,需要將 cell_overwrite_ok=True
向 x 行 y 列 寫入數(shù)據(jù) value
table.write(x, y, value)
保存文件
file.save(file_name)
對Excel表添加數(shù)據(jù)
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("請輸入表單對應(yīng)的編號>>>")
table = data.sheet_by_index(int(choose))
# 創(chuàng)建Excel表
workbook = xlwt.Workbook(encoding="utf-8")
# 創(chuàng)建 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文件轉(zhuǎn)成Json
def excel2json():
file_path = input("輸入需要轉(zhuǎn)成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("請輸入表單對應(yīng)的編號>>>")
table = data.sheet_by_index(int(choose))
# 獲取到數(shù)據(jù)的表頭
titles = table.row_values(0)
result = {}
result["middle_school"] = []
# excel文件表有 10196 行,所以做10196次循環(huán)
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)