ep3 python : python กับ excel กลับไปใช้ openpyxl อย่างเดิมดีกว่า
ตอนก่อน เราลองใช้ xlrd กับ xlwt ปรากฏว่า อันนี้อ่านอย่างเดียวเลย อีกอันก็สร้างและเขียนอย่างเดียวเลย เอามา balance ไม่ได้ จึงกลับไปลองใช้ openpyxl อย่างเดิม มาสรุปข้อดีและข้อเสียของทั้งคู่ดีกว่า
xlrd, xlwt
(+) อ่านเขียนไฟล์ได้ดี, รองรับหลาย file platform, รวดเร็ว
(-) ทำหน้าที่อ่านอย่างเดียวหรือเขียนอย่างเดียว ทำร่วมกันไม่ได้, ไม่สามารถก็อป style ของ cell ต่างๆได้ (หาไม่เจอว่าใช้คำสั่งไหน)
openpyxl
(+) อ่านและเขียนได้อย่างดูดี, สามารถก็อป style ของ cell ต่างๆได้
(-) ทำงานช้ามากๆจนอืดในบางคำสั่ง, แอบถมดำบาง cell ให้เราโดยไม่ได้สั่งมัน
ดังนั้น จึงกลับไปใช้ openpyxl ทำ assignment นี้ต่อไป ......
ได้ศึกษาโดยการถามกู๋ และเข้าไปดูตามเว็บต่างๆ มีตัวอย่างที่น่าสนใจ เช่น
http://stackoverflow.com/questions/14684312/issue-with-creating-xlsx-in-python-by-copying-data-from-csv
copy data cell จาก .csv file โดยสรุป code เป็นดังนี้
from openpyxl import load_workbook
import csv
wb = load_workbook("empty_book.xlsx") #สร้าง excel ใหม่เองข้างนอก แล้วค่อยเรียกใช้นะคะ
ws = wb.create_sheet(index = 1, title="auto_check") #สร้าง sheet ใหม่
#เปิดไฟล์ csv ออกมาอ่าน ใช้คำสั่งนี้จะปลอดภัยเพราะหมดคำสั่งช่วงนี้จะปิดไฟล์ให้เราเอง
with open("checklist.csv",'rb') as fin:
reader = csv.reader(fin)
for rowx,row in enumerate(reader):
for colx, value in enumerate(row):
#ให้ row = ?, column = ?? มีค่าเท่าไหร่
ws.cell(row=rowx,column=colx).value = unicode(value, "mbcs")
wb.save("empty_book.xlsx")
วิธีการนี้ แก้อาการอืดได้ดี ทำงานไวด้วยหล่ะ แต่... csv file จะไม่รับ format นะจ๊ะ ก็อปสี แบบอักษร บลาๆไม่ได้
กลับไปลองใช้ openpyxl ตามเดิมดู โดยให้ ws_old เป็นต้นฉบับที่เราจะก็อป และ ws_new เป็นอันใหม่ที่จะเขียนลงไป ขอตัด code มาตรงนี้เลยนะคะ
RowCnt = 0
for row in ws_old.range('A1:S253'):
Cr = row[2].value
print Cr
ColCnt = 0
for cell in row:
ws_new.cell(row=RowCnt, column=ColCnt).value = cell.value
ws_new.cell(row=RowCnt, column=ColCnt).style.font = cell.style.font
ws_new.cell(row=RowCnt, column=ColCnt).style.fill = cell.style.fill
ws_new.cell(row=RowCnt, column=ColCnt).style.borders = cell.style.borders
ws_new.cell(row=RowCnt, column=ColCnt).style.alignment = cell.style.alignment
ws_new.cell(row=RowCnt, column=ColCnt).style.number_format = cell.style.number_format #custom
ws_new.cell(row=RowCnt, column=ColCnt).style.protection = cell.style.protection
ColCnt += 1
RowCnt += 1
wb.save("C:/Python27/empty_book.xlsx")
สามารถทำงานได้ดี อยู่ที่ไฟล์ excel เราว่าใหญ่ขนาดไหน ถ้าไฟล์เล็กๆ จะทำงานได้เร็ว และไม่ค้างอีกด้วย
ซึ่ง code ตัวอย่างนี้ มี concept คร่าวๆ ดังนี้
ตัวอย่างอื่นๆเพิ่มเติม
เขียน excel file ด้วย xlwt
python-excel-mini-cookbook
csv File reading and writing
การใส่สีให้แต่ละ cell
วันนี้ก็ได้ความรู้เพิ่มเติมกันไปแล้วนะคะ สำหรับ excel กับ python นะคะ คราวหน้ามีอะไรติดตามชมได้คะ :)
ป้ายกำกับ: programming, python