寫(xiě)在前面
有個(gè)妹子有一項(xiàng)簡(jiǎn)單又重復(fù)的工作涣狗,將客戶(hù)提供的問(wèn)卷調(diào)查資料谍婉,整理成其他部門(mén)要求的模板,都是xlsx格式镀钓。
這完全可以交給電腦處理的啊穗熬,所以幫她用openpyxl造個(gè)"輪子",減少重復(fù)勞動(dòng)吧丁溅。
openpyxl基礎(chǔ)
- 三個(gè)概念
在學(xué)習(xí)這個(gè)庫(kù)的時(shí)候唤蔗,主要參考了博客園的"_小蘋(píng)果",他寫(xiě)得非常清晰窟赏,容易理解妓柜,非常感謝"_小蘋(píng)果,(=^ ^=)涯穷,原文鏈接:http://www.cnblogs.com/anpengapple/p/6399304.htm
在openpyxl中棍掐,主要用到三個(gè)概念:Workbooks,Sheets拷况,Cells作煌。
Workbook就是一個(gè)excel工作表;Sheet是工作表中的一張表頁(yè)蝠嘉;Cell就是簡(jiǎn)單的一個(gè)格最疆。
openpyxl就是圍繞著這三個(gè)概念進(jìn)行的,不管讀寫(xiě)都是“三板斧”:打開(kāi)Workbook蚤告,定位Sheet努酸,操作Cell。
xlsx寫(xiě)入
from openpyxl import Workbook
#引入類(lèi)
wb = Workbook()
ws = wb.active
ws.title = 'Sheet1'
# 設(shè)置表名
ws['A1'] = 'Hello World
# 向A1單元格賦值
wb.save('test.xlsx')
# 保存文件-
xlsx讀取
from openpyxl import load_workbook
#引入類(lèi)
fname = "test.xlsx"
wb = load_workbook(fname)
# 加載xlsx文件
first_sheet = sheetnames[0]
print first_sheet
# 打印第一個(gè)表的名稱(chēng)
sheet = wb.get_sheet_by_name(first_sheet)
# 讀取第一個(gè)表
print sheet["A1"].value
# 打印A1的值
print sheet.cell(row=1, column=1).value
# 另一種寫(xiě)法杜恰,循環(huán)row获诈、column可遍歷表格內(nèi)容運(yùn)行結(jié)果:
Sheet1
Hello World
Hello World
源碼
#!/usr/bin/env python
# -*- coding: utf-8 -*-
@file: excel2excel.py
@time: 2017/10/7 1:50
@desc:
from openpyxl import load_workbook # 讀取
from openpyxl import Workbook # 寫(xiě)入
import sys
import traceback # 捕獲異常模塊
import os
reload(sys)
sys.setdefaultencoding('utf-8')
# 解決控制臺(tái)中文亂碼,mystr.decode('utf-8').encode(turn_type),直接引用
turn_type = sys.getfilesystemencoding()
def ExcelToExcel(fname):
# ....讀取.... #
print u'讀取文件...',
# fname = "問(wèn)卷調(diào)查.xlsx"
wb = load_workbook(fname)
# 讀取第一張表
sheetnames = wb.get_sheet_names()
ws = wb.get_sheet_by_name(sheetnames[0])
# 獲取行數(shù)和列數(shù)
rows = ws.max_row # 行數(shù)
cols = ws.max_column # 列數(shù)
con_list = []
print u'[完成]'
# ........ #
# ....寫(xiě)入.... #
wb2 = Workbook()
ws2 = wb2.active
ws2.title = 'Sheet1'
# ........ #
# 先寫(xiě)入表頭
con2_list = [u'郵箱地址', u'手機(jī)號(hào)', u'日期', u'公司名', u'公司地址', u'公司電話(huà)']
ws2.append(con2_list) # 以列表的方式整行寫(xiě)入
con2_list = [] # 清空列表
print u'轉(zhuǎn)換數(shù)據(jù)...',
for i in range(2, rows + 1): # 從第二行開(kāi)始讀取
for j in range(1, cols + 1):
row = ws.cell(row=i, column=j).value
con_list.append(row) # 讀取整行心褐,以列表的方式儲(chǔ)存
# 抽取需要的數(shù)據(jù)
con2_list.extend([con_list[6], con_list[8], con_list[9], con_list[10], con_list[11], con_list[32]])
ws2.append(con2_list) # 寫(xiě)入新的xlsx
con2_list = [] # 清空列表
con_list = [] # 清空列表
filename = str(fname).split('.')[0] + '_new' + '.xlsx'
print u'[完成]'
print u'保存文件...',
wb2.save(filename)
print u'[完成]'
print u'請(qǐng)查看新文件:%s' % filename.decode('gbk')
def main():
print u'注意僅支持xslx格式.'
mystr = u'請(qǐng)輸入需轉(zhuǎn)換的文件名:'.decode('utf-8').encode(turn_type)
fname = raw_input(mystr)
try:
ExcelToExcel(fname)
except Exception:
f = open("log.txt", 'a')
traceback.print_exc(file=f)
f.close()
if __name__ == '__main__':
main()
os.system("echo.")
os.system('pause')