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

Android Developer ผู้เป็นเจ้าของบล็อก MikkiPastel ที่ชอบทำหลายๆอย่างนอกจากเขียนแอพแอนดรอยด์ เช่น เขียนบล็อก เขียนแชทบอท เรียนออนไลน์ อ่านหนังสือ วาดรูปเล่น ดู netfilx สั่งอาหารอร่อยๆกัน เป็นต้น

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.