ep3 python : python กับ excel กลับไปใช้ openpyxl อย่างเดิมดีกว่า

Programming Sep 28, 2013

ตอนก่อน เราลองใช้ 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 นะคะ คราวหน้ามีอะไรติดตามชมได้คะ 🙂

Tags

Minseo Chayabanjonglerd

I am a full-time Android Developer and part-time contributor with developer community and web3 world, who believe people have hard skills and soft skills to up-skill to da moon.