φυβλαςのβλογ
บล็อกของ phyblas



การอ่านเขียนไฟล์ microsoft excel ด้วย openpyxl ใน python
เขียนเมื่อ 2020/06/05 11:50
แก้ไขล่าสุด 2021/09/28 16:42



ไมโครซอฟต์ เอ็กซ์เซล (microsoft excel) หรือมักเรียกกันโดยทั่วไปว่า "เอ็กซ์เซล" (excel) เป็นโปรแกรมจัดการข้อมูลในรูปแบบตารางซึ่งได้รับความนิยมมากที่สุดอันหนึ่ง

ปกติไฟล์เอ็กซ์เซลจะบันทึกข้อมูลเป็นสกุล .xls (สำหรับ excel 2003 หรือเก่ากว่านั้น) หรือ .xlsx (สำหรับ excel 2007 เป็นต้นมา)
การจะเปิดไฟล์ .xls หรือ .xlsx ขึ้นมาเพื่อใช้หรือจัดการข้อมูลภายในนั้นโดยปกติแล้วจะต้องใช้โปรแกรมไมโครซอฟต์เอ็กซ์เซลโดยตรง

อย่างไรก็ตาม หากแค่ต้องการอ่านดูหรือแก้ไขข้อมูลบางส่วนในไฟล์ในส่วนที่ไม่ซับซ้อนมาก ถ้าเขียนโค้ดภาษาโปรแกรมต่างๆก็มีวิธีการที่จะอ่านหรือเขียนไฟล์เอ็กซ์เซลได้โดยไม่ต้องโปรแกรมไมโครซอฟต์เอ็กซ์เซลโดยตรงก็ได้ อีกทั้งบางเครื่องก็ไม่สามารถโปรแกรมใช้ได้ และยังโปรแกรมที่มีลิขสิทธิ์ต้องจ่ายตังค์ซื้อด้วย

แต่ละภาษาก็มีมอดูลสำหรับใช้เพื่อการนี้อยู่ สำหรับในไพธอนเองก็มีมอดูลที่ใช้สำหรับเขียนอ่านไฟล์ excel อยู่หลายตัว มีทั้งตัวที่ใช้แค่เพื่ออ่านไฟล์ หรือใช้แค่เพื่อเขียน หรือทั้งอ่านทั้งเขียนไฟล์

ในบทความนี้จะแนะนำวิธีการใช้มอดูล openpyxl เป็นมอดูลที่ใช้ได้ทั้งอ่านและเขียนไฟล์เอ็กซ์เซล นิยมใช้อย่างกว้างขวาง

เพียงแต่มีข้อด้อยคือ openpyxl จะใช้อ่านเขียนไฟล์ .xlsx เท่านั้น ส่วน .xls ซึ่งใช้กับไฟล์เอ็กซ์เซลรุ่นเก่าจะใช้ไม่ได้ สำหรับ .xls ให้ใช้ xlrd กับ xlwt แทน

สำหรับวิธีการใช้ xlrd อ่านได้ใน https://phyblas.hinaboshi.com/20200606




การติดตั้ง

openpyxl ไม่ใช่มอดูลมาตรฐานในไพธอนที่มีอยู่ตั้งแต่แรก จึงต้องทำการติดตั้ง ซึ่งก็ทำได้ง่ายโดยใช้ pip หรือ conda
pip install openpyxl
conda install openpyxl




การเปิดไฟล์เอ็กซ์เซลหรือสร้างขึ้นใหม่

การใช้ openpyxl จะเริ่มต้นขึ้นจากการที่เราสร้างออบเจ็กต์สมุดงาน (workbook) ขึ้นมาเพื่อเป็นตัวแทนของไฟล์เอ็กซ์เซลที่ต้องการอ่านหรือเขียน

ถ้าหากต้องการเริ่มสร้างไฟล์เอ็กซ์เซลขึ้นมาใหม่ให้เริ่มจากการสร้างออบเจ็กต์สมุดงาน ขึ้นมา
import openpyxl

wabu = openpyxl.Workbook()

จากนั้นถ้าสั่งเมธอด .save() ก็จะเป็นการบันทึกออกมาเป็นไฟล์เอ็กซ์เซลจริงๆ
wabu.save('kara.xlsx')

เนื่องจากสร้างขึ้นมาถึงแล้วบันทึกทันที ดังนั้นไฟล์ที่ได้นี้ก็จะเป็นไฟล์เอ็กซ์เซลเปล่าๆ

หากต้องการเปิดไฟล์เอ็กซ์เซลที่มีอยู่แล้วขึ้นมาอ่านก็ใช้ฟังก์ชัน load_workbook()
openpyxl.load_workbook('kara.xlsx')

ไม่ว่าจะเริ่มจากสร้างใหม่ด้วย Workbook() หรือเปิดอ่านจากไฟล์เอ็กซ์เซลที่มีอยู่แล้วด้วย load_workbook() ก็จะได้ออบเจ็กต์สมุดงานขึ้นมา จากนั้นจะเติมอะไรใส่หรือจะดูข้อมูลข้างในก็ทำกับออบเจ็กต์นี้




แผ่นงานในสมุดงาน

ในไฟล์เอ็กซ์เซลหนึ่งอาจประกอบไปด้วยหลายๆหน้า เรียกว่า "แผ่นงาน" (worksheet)

ไฟล์เอ็กซ์เซลจะต้องมีแผ่นงานอยู่อย่างน้อยหนึ่งแผ่นเสมอ สมุดงานที่สร้างขึ้นมาใหม่จะเริ่มจากมีแผ่นงานมาให้อันหนึ่ง ถ้าสร้างสมุดงานขึ้นมาด้วย openpyxl.Workbook() ก็จะมีแผ่นงานอยู่อันหนึ่งชื่อ Sheet ให้อยู่แล้ว

หากต้องการดูแผ่นงานที่มีอยู่ทั้งหมดก็ดูที่แอตทริบิวต์ .worksheets ได้ จะได้ออบเจ็กต์ตัวแผ่นงานนั้นมา หรือถ้าจะดูแค่ชื่อของแผ่นงานที่มีอยู่ก็ดูที่แอตทริบิวต์ .sheetnames
wabu = openpyxl.Workbook()
print(wabu.worksheets) # ได้ [<Worksheet "Sheet">]
print(wabu.sheetnames) # ได้ ['Sheet']
washi1 = wabu.worksheets[0]
print(type(washi1)) # ได้ <class 'openpyxl.worksheet.worksheet.Worksheet'>

ชื่อของแผ่นงานอยู่ที่แอตทริบิวต์ .title สามารถแก้ได้ พอบันทึกลงไฟล์แล้วเปิดดูก็จะเห็นว่าชื่อแผ่นงานกลายเป็นตามที่ตั้ง
print(washi1.title) # ได้ Sheet
washi1.title = 'แผ่นงาน'
wabu.save('phaenngan'.xlsx')

สามารถเพิ่มแผ่นงานใหม่เข้าไปได้ด้วยเมธอด .create_sheet()
wabu = openpyxl.Workbook()
print(wabu.sheetnames) # ได้ ['Sheet']
wabu.create_sheet('Shita')
print(wabu.worksheets) # ได้ [<Worksheet "Sheet">, <Worksheet "Shita">]
print(wabu.sheetnames) # ได้ ['Sheet', 'Shita']

ตัวออบเจ็กต์สมุดงานสามารถใช้เหมือนเป็นดิกชันนารีซึ่งเมื่อป้อนชื่อเข้าไปก็จะได้แผ่นงานตัวนั้นมา
print(wabu['Shita']) # ได้ <Worksheet "Shita">

ปกติเราจะดูหรือจัดการอะไรได้ทีละหน้าแผ่นงาน ตัวออบเจ็กต์ของแผ่นงานที่กำลังทำงานอยู่จะดูได้ที่พรอเพอร์ตี .active ของสมุดงาน

ตอนเริ่มต้นแผ่นงานที่ทำอยู่จะเป็นตัว Sheet หากต้องการเปลี่ยนก็ป้อนตัวออบเจ็กต์แผ่นงานตัวอื่นลงไปใน .active แทนที่ได้เลย

หากต้องการสร้างแผ่นงานใหม่แล้วให้เป็นแผ่นที่ทำงานเลยก็ใช้ .create_sheet() แล้วจะได้ตัวออบเจ็กต์แผ่นงานใหม่นั้นมาก็เอาไปแทนลงใน .active ได้เลย เช่น
wabu = openpyxl.Workbook()
print(wabu.active) # ได้ <Worksheet "Sheet">
wabu.active = wabu.create_sheet('Steck')
print(wabu.active) # ได้ <Worksheet "Steck">




ช่องข้อมูลในแผ่นงาน

ในแต่ละแผ่นงานจะประกอบไปด้วยช่อง (cell) ต่างๆของตาราง ซึ่งเมื่อใช้ openpyxl จัดการพวกช่องนี้ก็อยู่ในรูปของออบเจ็กต์ด้วย การเข้าถึงออบเจ็กต์ที่แทนตัวช่องที่ต้องการนั้นอาจใช้เมธอด .cell() โดยใส่เลขแถวและหลัก

นอกจากนี้ยังสามารถเข้าถึงได้ในลักษณะเหมือนดิกชันนารี โดยใส่ชื่อของช่องนั้นลงไป ชื่อของช่องนั้นจะเรียกเรียกแนวตั้งเป็นตัวเลขตั้งแต่ 1,2,3 ไป ส่วนแนวนอนเป็นตัวอักษรตั้งแต่ A,B,C ไล่ไป

ลองใช้ทั้ง ๒ วิธีเข้าถึงออบเจ็กต์ช่องดู
wb = openpyxl.Workbook()
wsh = wb.active
print(washi.cell(3,7)) # ได้ <Cell 'Sheet'.G3>
print(washi['A4']) # ได้ <Cell 'Sheet'.A4>

ค่าของแต่ละช่องอยู่ในแอตทริบิวต์ .value ของออบเจ็กต์ช่อง เมื่อเข้าถึงค่าในช่องแล้วหากต้องการเขียนอะไรใส่ช่องไหนก็ใส่ค่าแก้ลงไปที่ .value ได้เลย แต่กรณีที่เรียกในรูปดิกชันนารีจะไม่เติม .value ก็ได้ ทำให้เป็นวิธีเขียนที่สั้นที่สุด
wabu = openpyxl.Workbook()
washi = wabu.active
washi.cell(3,5).value = 'โดนัท'
washi['B2'].value = 'ซาลาเปา'
washi['C4'] = 'แป้งทอด' # ไม่เติม .value ก็ได้
wabu.save('tarang.xlsx')

เปิดไฟล์ออกมาก็จะได้แบบนี้



จะใส่เป็นสูตรคำนวนก็ได้ แต่ต้องเปิดไมโครซอฟต์เอ็กซ์เซลมาจึงจะเห็นผลการคำนวณนั้น
wabu = openpyxl.Workbook()
washi = wabu.active
washi['A1'] = 11
washi.cell(2,1).value = 22
washi['A3'] = 33
washi['A4'] = '=SUM(A1:A3)'
washi.cell(5,1).value = '=SUM(A3:A4)'
wabu.save('tarang.xlsx')

เปิดไฟล์ดูได้



ช่องสามารถเลือกพร้อมกันหลายช่องได้โดยใช้ : คั่นชื่อช่องที่จะให้เป็นขอบเขต แล้วจะได้ทูเพิลของทูเพิลของช่องเหล่านั้นมา
wabu = openpyxl.Workbook()
washi = wabu.active
print(washi['B2:E2']) # ได้ ((<Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>, <Cell 'Sheet'.D2>, <Cell 'Sheet'.E2>),)
print(washi['B3:B5']) # ได้ ((<Cell 'Sheet'.B3>,), (<Cell 'Sheet'.B4>,), (<Cell 'Sheet'.B5>,))
print(washi['B2:C3']) # ได้ ((<Cell 'Sheet'.B2>, <Cell 'Sheet'.C2>), (<Cell 'Sheet'.B3>, <Cell 'Sheet'.C3>))

สามารถนำมาใช้วนใน for เพื่อใส่ค่าลงไปได้ เช่น
wabu = openpyxl.Workbook()
washi = wabu.active
n = 3
for row in washi['B2:E4']:
    for c in row:
        c.value = n
        n += 2

wabu.save('tarang.xlsx')

เปิดไฟล์ออกมาดูจะได้แบบนี้






การแทรกแถวหรือสดมภ์

สามารถแทรกแถวเปล่าๆหรือสดมภ์เปล่าๆลงไปในตารางได้ด้วยเมธอด .insert_rows() และ .insert_cols() โดยใส่เลขลำดับของแถวหรือสดมภ์ที่ต้องการแทรก แล้วตามด้วยจำนวนที่ต้องการแทรก (ถ้าไม่ใส่จำนวนจะเป็นการแทรก 1 ตัว)

ตัวอย่างการแทรกแถว ขอเปิดไฟล์จากในตัวอย่างที่แล้วมาเพิ่มแถวแทรกลงไป
wabu = openpyxl.load_workbook('tarang.xlsx')
washi = wabu.active
washi.insert_rows(3,2)
wabu.save('tarang.xlsx')

เปิดไฟล์มาดูใหม่ได้



ต่อไปตัวอย่างการแทรกสดมภ์ แก้ต่อจากไฟล์ในตัวอย่างที่แล้ว
wabu = openpyxl.load_workbook('tarang.xlsx')
washi = wabu.active
washi.insert_cols(3)
wabu.save('tarang.xlsx')

เปิดไฟล์มาดูใหม่ได้






การลบข้อมูลทั้งแถวหรือทั้งสดมภ์

หากต้องการลบทั้งแถวหรือทั้งสดมภ์ออกแล้วเลื่อนตัวที่ตำแหน่งถัดไปลงมา ใช้ .delete_rows() หรือ .delete_cols() โดยใส่เลขตำแหน่งแถวหรือสดมภ์ที่ต้องการลบออก และตามด้วยจำนวนแถวที่ต้องการลบ ถ้าไม่ใส่จำนวนจะเป็นการลดแถวเดียว

ตัวอย่าง ลองลบแถวจากไฟล์เดิมก่อนหน้านี้
wabu = openpyxl.load_workbook('tarang.xlsx')
washi = wabu.active
washi.delete_rows(5)
wabu.save('tarang.xlsx')

เปิดไฟล์มาดูใหม่ได้



ลองลบสดมภ์จากไฟล์เดิม
wabu = openpyxl.load_workbook('tarang.xlsx')
washi = wabu.active
washi.delete_cols(3,3)
wabu.save('tarang.xlsx')

เปิดไฟล์มาดูใหม่ได้






การย้ายข้อมูลในช่องพร้อมกันทั้งช่วง

หากต้องการย้ายข้อมูลจากหลายช่องที่อยู่ติดกันไปยังตำแหน่งอื่นที่เดียวสามารถใช้ .move_range() โดยระบุว่าจะเลื่อนไปกี่แถวและกี่สดมภ์

ตัวอย่าง ลองย้ายข้อมูลในช่องจากไฟล์ในตัวอย่างที่แล้ว
wabu = openpyxl.load_workbook('tarang.xlsx')
washi = wabu.active
washi.move_range('B5:C5',-2,1)
wabu.save('tarang.xlsx')

เปิดไฟล์มาดูได้






การผสานรวมช่อง

หากต้องการรวมหลายช่องที่ิติดกันเป็นช่องเดียวให้ใช้ .merge_cells()
wabu = openpyxl.Workbook()
washi = wabu.active
washi.merge_cells('A1:B3')
washi.merge_cells('D2:D7')
washi.merge_cells('A4:C4')
wabu.save('tarang.xlsx')

เปิดไฟล์มาดูได้



จะดูข้อมูลว่ามีการรวมกลุ่มช่องไหนไปบ้างก็ดูได้ที่ .merged_cells
print(washi.merged_cells) # ได้ A1:B3 D2:D7 A4:C4

หากต้องการข้อมูลการรวมช่อง ไล่ไปทีละตัว ใช้ .merged_cells.ranges
print(washi.merged_cells.ranges) # [<CellRange A1:B3>, <CellRange D2:D7>, <CellRange A4:C4>]

เอาไล่ดูข้อมูลการรวมแต่ละช่องได้ โดยที่ตัวออบเจ็กต์การรวมจะมีแอตทริบิวต์ต่างๆซึ่งบอกข้อมูล เช่น
for m in washi.merged_cells.ranges:
    print(m,'\nช่องซ้าย-ขวา:',m.left,'-',m.right,
          '\nช่องบน-ล่าง:',m.top,'-',m.bottom,
          '\nขอบเขต: แถว',m.min_row,'-',m.max_row,
          'สดมภ์',m.min_col,'-',m.max_col,
          '\nขนาด:',m.size)

ได้
A1:B3 
ช่องซ้าย-ขวา: [(1, 1), (2, 1), (3, 1)] - [(1, 2), (2, 2), (3, 2)] 
ช่องบน-ล่าง: [(1, 1), (1, 2)] - [(3, 1), (3, 2)] 
ขอบเขต: แถว 1 - 3 สดมภ์ 1 - 2 
ขนาด: {'columns': 2, 'rows': 3}
D2:D7 
ช่องซ้าย-ขวา: [(2, 4), (3, 4), (4, 4), (5, 4), (6, 4), (7, 4)] - [(2, 4), (3, 4), (4, 4), (5, 4), (6, 4), (7, 4)] 
ช่องบน-ล่าง: [(2, 4)] - [(7, 4)] 
ขอบเขต: แถว 2 - 7 สดมภ์ 4 - 4 
ขนาด: {'columns': 1, 'rows': 6}
A4:C4 
ช่องซ้าย-ขวา: [(4, 1)] - [(4, 3)] 
ช่องบน-ล่าง: [(4, 1), (4, 2), (4, 3)] - [(4, 1), (4, 2), (4, 3)] 
ขอบเขต: แถว 4 - 4 สดมภ์ 1 - 3 
ขนาด: {'columns': 3, 'rows': 1}

เมื่อจะแยกช่องที่ถูกรวมกันอยู่ ให้ใช้เมธอด .remove ที่ตัวออบเจ็กต์ที่ได้จาก .merged_cells โดยใส่ชื่อแถวที่ต้องการยกเลิกการรวม
washi.merged_cells.remove('A1:B3')

หรืออาจใช้เมธอด .unmerge_cells() ก็ได้
washi.unmerge_cells('D2:D7')




การกำหนดความกว้างความสูงของช่อง

การปรับคุณสมบัติของแถวตั้งได้ที่ .row_dimensions[] โดยระบุตัวเลขแถว (เป็น 1,2,3) และความสูงของแต่ละแถวปรับได้ที่พรอเพอร์ตี height

ส่วนคุณสมบัติของสดมภ์ตั้งได้ที่ .column_dimensions[] โดยระบุชื่อสดมภ์ (เป็น A,B,C) และความกว้างของแต่ละสดมภ์ปรับได้ที่พรอเพอร์ตี width

ตัวอย่าง ลองปรับความกว้างความสูงของช่องแล้วบันทึก
wabu = openpyxl.Workbook()
washi = wabu.active
washi.row_dimensions[2].height = 30
washi.row_dimensions[3].height = 40
washi.column_dimensions['B'].width = 30
wabu.save('tarang.xlsx')

เปิดไฟล์ที่บันทึกมาดู






การระบายสีพื้นช่อง

การกำหนดสีพื้นตัวช่องทำได้โดยใส่รูปแบบลงไปในพรอเพอร์ตี .fill ของออบเจ็กต์ช่อง

สิ่งที่จะใส่ก็คือออบเจ็กต์ openpyxl.styles.PatternFill โดยมีค่า ๒ อย่างที่ต้องใส่คือ patternType=รูปแบบการระบาย และ fgColor=รหัสสี

ตัวอย่าง
from openpyxl.styles import PatternFill

wabu = openpyxl.Workbook()
washi = wabu.active
washi.column_dimensions['A'].width = 30 # ปรับให้กว้างให้เห็นชัด
washi['A1'].fill = PatternFill(patternType='lightGray',fgColor='FF22AA')
washi['A2'].fill = PatternFill(patternType='lightDown',fgColor='226611')
washi['A3'].fill = PatternFill(patternType='darkUp',fgColor='3895A1')
washi['A4'].fill = PatternFill(patternType='mediumGray',fgColor='6632FF')
washi['A5'].fill = PatternFill(patternType='darkGray',fgColor='994433')
washi['A6'].fill = PatternFill(patternType='lightGrid',fgColor='55AA11')
washi['A7'].fill = PatternFill(patternType='darkHorizontal',fgColor='11AAEE')
washi['A8'].fill = PatternFill(patternType='darkTrellis',fgColor='FFAA33')
washi['A9'].fill = PatternFill(patternType='solid',fgColor='AA6600')
wabu.save('tarang.xlsx')

ได้






การปรับตัวหนังสือในช่อง

คุณสมบัติต่างๆของตัวหนังสือที่แต่ละช่องสามารถกำหนดได้ที่พรอเพอร์ตี .font ของออบเจ็กต์ช่อง โดยค่าที่ต้องใส่เข้าไปคือออบเจ็กต์ openpyxl.styles.Font โดยป้อนค่าที่ต้องการปรับแต่ง เช่นชนิดฟอนต์ (name), สี (color), ขนาด (size)

ตัวอย่าง
from openpyxl.styles import Font

wabu = openpyxl.Workbook()
washi = wabu.active
washi['A2'] = 'เลือด'
washi['A2'].font = Font(color='EE1111',
                        size=30,
                        name='Angsana New')
wabu.save('tarang.xlsx')

ได้






การปรับการจัดเรียงข้อความในช่อง

พรอเพอร์ตี .alignment ที่ตัวออบเจ็กต์ช่องเป็นตัวกำหนดรูปแบบการเรียง ค่าที่ต้องใส่เข้าไปคือออบเจ็กต์ openpyxl.styles.Alignment

ค่าที่ปรับได้ เช่น การเรียงแนวตั้ง (vertical) การเรียนแนวนอน (horizontal) นอกจากนี้หากต้องการให้ตัวหนังสือในช่องมีการขึ้นบรรทัดใหม่ได้ให้ใส่ wrapText=True

ตัวอย่าง
from openpyxl.styles import Alignment

wabu = openpyxl.Workbook()
washi = wabu.active
washi.row_dimensions[1].height = 50
washi['A1'] = 'ก'
washi['A1'].alignment = Alignment(horizontal='center')
washi['B1'] = 'ข'
washi['B1'].alignment = Alignment(horizontal='right')
washi['C1'] = 'ค'
washi['C1'].alignment = Alignment(vertical='top')
washi['D1'] = 'ง'
washi['D1'].alignment = Alignment(vertical='center')
washi['E1'] = 'a\nb\nc'
washi['E1'].alignment = Alignment(wrapText=True)
wabu.save('tarang.xlsx')

ได้






การทำขอบ

สามารถแต่งของของแต่ละช่องได้โดยใส่ที่พรอเพอร์ตี .border ของตัวออบเจ็กต์ช่อง สิ่งที่ต้องเติมคือออบเจ็กต์ openpyxl.styles.Border โดยใส่ออบเจ็กต์ openpyxl.styles.Side ๔ ตัวที่แทนตัวขอบ ๔ ด้าน ซ้าย, ขวา, บน, ล่าง ตามลำดับ

คุณสมบัติของขอบกำหนดที่ออบเจ็กต์ openpyxl.styles.Side โดยกำหนดรูปแบบของขอบ (style) และสีของขอบ (color)

ตัวอย่าง
from openpyxl.styles import Border,Side

wabu = openpyxl.Workbook()
washi = wabu.active
border = Border(Side(style='slantDashDot',color='AA0000'),
                Side(style='dotted',color='00AA00'),
                Side(style='thick',color='0000AA'),
                Side(style='medium',color='666600'))
washi['B2'].border = border
wabu.save('tarang.xlsx')

ได้






การใส่ลิงก์

การใส่ลิงก์ให้ช่องนั้นเมื่อคลิกแล้วจะไปหน้าเว็บที่ต้องการทำได้โดยใส่ที่พรอเพอร์ตี .hyperlink ของออบเจ็กต์ช่อง

ตัวอย่าง
wabu = openpyxl.Workbook()
washi = wabu.active
washi['A2'] = 'phyblas'
washi['A2'].hyperlink = 'https://phyblas.hinaboshi.com'
wabu.save('tarang.xlsx')




การใส่รูปลงไป

การใส่รูปลงไปทำได้โดยเมธอด .add_image() ที่ตัวออบเจ็กต์แผ่นงาน โดยใส่ออบเจ็กต์ภาพ ซึ่งอยู่ที่ openpyxl.drawing.image.Image ลงไปเป็นอาร์กิวเมนต์ตัวแรก ส่วนตำแหน่งของภาพใส่เป็นอาร์กิวเมนต์ตัวที่ โดยใส่ชื่อช่องที่จะวางลงไป

คุณสมบัติบางอย่างของภาพ เช่นความกว้างความยาวก็กำหนดใส่ลงได้ที่พรอเพอร์ตี width, height ข่องออบเจ็กต์ภาพนี้

ตัวอย่าง
from openpyxl.drawing.image import Image

wabu = openpyxl.Workbook()
washi = wabu.active
img = Image('openpyxl.jpg')
img.width = 200
img.height = 150
washi.add_image(img,'B2')
wabu.save('tarang.xlsx')

ได้






อ้างอิง


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
maya
javascript
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
เรียนภาษาจีน
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
หลักการเขียนทับศัพท์ภาษาจีนกวางตุ้ง
การใช้ unix shell เบื้องต้น ใน linux และ mac
หลักการเขียนทับศัพท์ภาษาจีนกลาง
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
บันทึกการเที่ยวสวีเดน 1-12 พ.ค. 2014
แนะนำองค์การวิจัยและพัฒนาการสำรวจอวกาศญี่ปุ่น (JAXA)
เล่าประสบการณ์ค่ายอบรมวิชาการทางดาราศาสตร์โดยโซวเคนได 10 - 16 พ.ย. 2013
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
บันทึกการเที่ยวญี่ปุ่นครั้งแรกในชีวิต - ทุกอย่างเริ่มต้นที่สนามบินนานาชาติคันไซ
หลักการเขียนทับศัพท์ภาษาญี่ปุ่น
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ
ทำไมถึงอยากมาเรียนต่อนอก
เหตุผลอะไรที่ต้องใช้ภาษาวิบัติ?

ไทย

日本語

中文