(¿£Áö´Ï¾î¸¦
À§ÇÑ) ÆÄÀ̽㠽ÃÀÛÇϱâ[13]
³»¿ë : ¿¢¼¿ ÆÄÀ̽㠿¬µ¿
ÂüÁ¶ : https://wikidocs.net/135789 (»çÀå´Ô ¸ô·¡ ÇÏ´Â ÆÄÀ̽㠾÷¹«ÀÚµ¿È)
xlwings °ø½Ä ȨÆäÀÌÁö : https://www.xlwings.org/
0.½ÃÀÛÇϸç
Áö³
°Á¿¡¼ pandas¸¦ ´Ù·ç¾ú´Ù. dataframeÀº excel°ú À¯»çÇÏ¸é¼ databaseó·³ »ç¿ëÇÒ ¼ö ÀÖ´Â ÀåÁ¡ÀÌ ÀÖ¾ú´Ù. pandas´Â
Å×À̺í ÇüÅÂÀÇ Á¤ÇüÈµÈ µ¥ÀÌÅ͸¦ ó¸®ÇÒ ¶§ À¯¸®ÇÏ´Ù. ¿ì¸®´Â ¿©ÀüÈ÷ exce·Î Á¤ÇüȵÇÁö ¾ÊÀº °è»êµéÀ» ÇÑ´Ù. ±¸Á¶°è»ê¼¸¦ ¿¢¼¿·Î ¸¸µå´Â °æ¿ì°¡
¸¹Àºµ¥ ¿¢¼¿À» ¿öµå+MathCADó·³ ¾²°í ÀÖ´Â °ÍÀÌ ¿£Áö´Ï¾î¸µ ¾÷°èÀÇ Çö½ÇÀÌ´Ù. ±×·¡¼ ¾÷¹«ÀÚµ¿È¿¡¼ Excel »ç¿ëÀº »©³õÀ» ¼ö ¾ø´Ù. ±×·¡¼
À̹ø °Á¿¡¼´Â pythonÀ¸·Î excelÀ» Á÷Á¢ ´Ù·ç´Â ¹æ¹ý¿¡ ´ëÇØ¼ ¾Ë¾Æº¸°íÀÚ ÇÑ´Ù.
1. xlwings¼³Ä¡ È®ÀÎ
pythonÀ¸·Î
excelÀ» ÅëÁ¦ÇÒ ¼ö ÀÖ´Â ¿©·¯°¡Áö ¸ðµâÀÌ ÀÖ´Ù. xlwings, openpyxl, xlsxwriter (xlsx), xlrd,
xlwt(xls) µîÀÌ ±×°ÍÀÌ´Ù. ÀÌÁß¿¡¼ xlwings¸¦ ´Ù·çµµ·Ï ÇϰڴÙ. ´Ù¸¥ ¸ðµâµéÀº Àаųª ¾²±â¸¸ °¡´ÉÇÏ´Ù. ÇÏÁö¸¸ xlwings´Â ¿¢¼¿¿¡¼
pythonÀ¸·Î ¸¸µç »ç¿ëÀÚ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´ë½Å xlwings´Â excelÀÌ ¼³Ä¡µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù. ´Ù¸¥ ¸ðµâµéÀº excelÀÌ ¼³Ä¡µÇ¾î
ÀÖÁö ¾È¾Æµµ excelÆÄÀÏÀ» »ý¼ºÇϰí ÀÐÀ» ¼ö ÀÖ´Ù. ¿ëµµ¿¡ µû¶ó Àû´çÇÑ °ÍÀ» °í¸£¸é µÈ´Ù.
anaconda¸¦
¼³Ä¡Çß´Ù¸é xlwingsµµ °°ÀÌ ¼³Ä¡µÇ¾î ÀÖÀ» °ÍÀÌ´Ù. È®ÀÎÇØº¸±â À§Çؼ anaconda prompt¸¦ ¶ç¿ì°í pip show xlwings¶ó°í
ÀÔ·ÂÇØº¸ÀÚ.
(base) C:\Users\ysj>pip show xlwings
Name: xlwings
Version: 0.24.9
Summary: Make Excel fly: Interact with Excel from Python and vice versa.
Home-page:
https://www.xlwings.org
Author: Zoomer Analytics LLC
Author-email: felix.zumstein@zoomeranalytics.com
License: BSD 3-clause
Location: c:\programdata\anaconda3\lib\site-packages
Requires: pywin32
Required-by:
|
xlwings¿¡
°üÇÑ Á¤º¸µéÀ» º¼ ¼ö ÀÖ´Ù. ¹öÀüÀº 0.24.9À̰í ȨÆäÀÌÁö´Â https://www.xlwings.org
±×¸®°í ¼³Ä¡µÇ¾î ÀÖ´Â µð·ºÅ丮´Â c:\programdata\anaconda3\lib\site-package¶ó´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.
¸¸ÀÏ
anaconda¸¦ ¼³Ä¡ÇÏÁö ¾Ê¾Æ xlwings°¡ ¼³Ä¡µÇ¾î ÀÖÁö ¾Ê´Ù¸é ¸í·Éâ¿¡¼ pip install xlwings¶ó°í ÀÔ·ÂÇØ¼ xlwings¸¦
¼³Ä¡ÇÏ¸é µÈ´Ù.
2. ¿¢¼¿ÆÄÀÏ ¿±â
ÀÏ´Ü
±âÁ¸¿¡ ÀÖ´Â ¿¢¼¿ÆÄÀÏÀ» ¿©´Â °ÍºÎÅÍ ÇØº¸ÀÚ. Áö³¹ø °Á¿¡¼ ½è´ø Áß°£°í»çÁ¡¼ö.xlsx¸¦ ¿¾îº¸°Ú´Ù. xlwings ¸ðµâÀ» xw¶ó´Â À̸§À¸·Î
importÇÑ´Ù. ±×¸®°í xw.Book(¿¢¼¿ÆÄÀϸí)À» ½áÁÖ¸é ¿¢¼¿ÆÄÀÏÀ» ¿¬´Ù. ±×¸®°í wb¿¡ ÇÒ´çÇß´Ù. wb´Â workbookÀ» ÀǹÌÇÑ´Ù. ¾ÕÀ¸·Î
ÀÌ ¿öÅ©ºÏ¿¡ Á¢±ÙÇÒ ¶§´Â wb¸¦ »ç¿ëÇϸéµÈ´Ù. ½Ç½ÀÀº ÁÖÇÇÅÍ³ëÆ®ºÏÀ» ÀÌ¿ëÇØ¼ ÇϰڴÙ. d:\dev\xlwings µð·ºÅ丮¿¡¼ ÁÖÇÇÅÍ ³ëÆ®ºÏÀ» ½ÇÇàÇϰí
xw¶ó´Â À̸§À¸·Î ³ëÆ®ºÏ À̸§À» º¯°æÇؼ ÀúÀåÇß´Ù. Áß°£°í»çÁ¡¼ö.xlsxÆÄÀϵµ °°Àº µð·ºÅ丮¿¡ ÀÖ´Ù.
import xlwings as xw
wb = xw.Book('Áß°£°í»çÁ¡¼ö.xlsx')
|
ÀÌ
¼¿À» ½ÇÇàÇÏ¸é ½ÇÇà½ÃŰ¸é ¾Æ¹« Àϵµ ÀϾÁö ¾Ê´Â´Ù. ¸¸ÀÏ Áß°£°í»çÁ¡¼ö.xlsxÆÄÀÏÀÌ ÀÌ¹Ì ¿·Á ÀÖ¾ú´Ù¸é ¿¬°áÀÌ µÇ°í, ¿¢¼¿ÆÄÀÏÀÌ ¿·ÁÀÖÁö ¾Ê¾Ò´Ù¸é
ÇØ´ç ÆÄÀÏÀÌ ¿¸°´Ù. ÇØ´ç ÆÄÀÏÀÇ ³»¿ëÀº ¾Æ·¡¿Í °°´Ù.

3. xlwings ¿©·¯°¡Áö ±â´Éµé
-
sheet Á¢±ÙÇϱâ
ÀÌÁ¦ ¿öÅ©ºÏ¿¡ Á¢±ÙÇßÀ¸´Ï ½ÃÆ®¿¡ Á¢±ÙÇÒ Â÷·Ê´Ù. sheets(½ÃÆ®À̸§)À¸·Î
¿øÇÏ´Â ½ÃÆ®¿¡ Á¢±ÙÇß´Ù.
sheet=wb.sheets('sheet1')
|
ÀÌÁ¦
sheet.nameÀ̶ó°í Çϸé sheetÀÇ À̸§À» ¾òÀ» ¼ö ÀÖ´Ù.
-
cell¿¡ Á¢±ÙÇϱâ(value,
formula)
¼¿ÀÇ
³»¿ë¿¡ Á¢±ÙÇϱâ À§Çؼ sheet[ ] ¾È¿¡ ÁÖ¼Ò¸¦ ¹®ÀÚ¿·Î ½áÁÖ°í value¼Ó¼ºÀ» ½áÁÖ¸é µÈ´Ù.
sheet['B4'].value
'È«±æµ¿'
|
¼¿ÀÇ
value ¿Ü¿¡ formula¼Ó¼ºµµ ÀÖ´Ù. °ªÀÌ ¾Æ´Ñ ¼ö½ÄÀ» Àаųª ¾²´Â °ÍÀÌ´Ù. F4¼¿ ÁÖ¼Ò¿¡ =sum(C4:E4)¶ó´Â ¼ö½ÄÀ» ÀÔ·ÂÇØº¸ÀÚ. ¿¢¼¿¿¡¼
ÀÔ·ÂÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó python ÄÚµå·Î ÀÔ·ÂÇÏ´Â °ÍÀÌ´Ù. ¿¢¼¿ÀÇ F4 ¼¿¿¡ ¿ì¸®°¡ ¿øÇÏ´Â ¼ö½ÄÀÌ ÀÔ·ÂµÈ °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
sheet['F4'].formula='=sum(C4:E4)'
|

¼ö½ÄÀÌ
ÀÔ·ÂµÈ F4 ¼¿ÀÇ °ªÀ» ¾Ë°í ½ÍÀ¸¸é value¼Ó¼ºÀ» ÀÌ¿ëÇÏ¸é µÈ´Ù.
-
¼¿¿¡ ¸®½ºÆ® ³Ö±â
ÆÄÀ̽ãÀÇ
listÇü½ÄÀÇ µ¥ÀÌÅ͸¦ ¿¢¼¿ÀÇ ¼¿¿¡ ³ÖÀ» ¼ö ÀÖ´Ù. ù¹øÂ° ¸®½ºÆ®´Â °ú¸ñ¸íµé·Î ÀÌ·ç¾îÁ® ÀÖ°í µÎ¹øÂ° ¸®½ºÆ®´Â Á¡¼ö·Î ÀÌ·ç¾îÁø ¸®½ºÆ®¸¦ ¹¾î¼ Å«
¸®½ºÆ®·Î ¸¸µé¾î¼ ¼¿ÀÇ value·Î ÇÒ´çÇÏ¸é µÈ´Ù. Å« ¸®½ºÆ® ¾ÈÀÇ ¸®½ºÆ®´Â ÇàÀ¸·Î º¸¸é µÈ´Ù.
sheet['B10'].value = [['ö±ÙÄÜÅ©¸®Æ®', '»óÇϼöµµ', '¼ö¹®ÇÐ'], [10.0, 20.0, 30.0]]
|

-
¿¢¼¿ ¹üÀ§ °ª ÆÄÀ̽ãÀ¸·Î °¡Á®¿À±â
À̹ø¿¡´Â
À§¿¡¼ ÀÔ·ÂÇÑ ¿¢¼¿ÀÇ ¹üÀ§°ªÀ» ÆÄÀ̽ãÀÇ µ¥ÀÌÅÍ·Î °¡Á®¿Íº¸ÀÚ. ¿øÇÏ´Â ±¸¿ªÀ» ¼³Á¤Çϱâ À§Çؼ´Â range¼Ó¼ºÀ» ÀÌ¿ëÇØ¾ß ÇÑ´Ù.
sheet.range('B10','D11').value
[['ö±ÙÄÜÅ©¸®Æ®', '»óÇϼöµµ', '¼ö¹®ÇÐ'], [10.0, 20.0, 30.0]]
|
¸¸ÀÏ ¼¿ B10ºÎÅÍ D11ÀÌ ¿¬¼ÓµÇ¾î ÀÖ´Ù¸é expand()¸¦ ÀÌ¿ëÇÒ ¼ö
ÀÖ´Ù. B10À¸·ÎºÎÅÍ È®ÀåÇ϶ó´Â ¶æÀÌ´Ù. À§ÀÇ °á°ú¿Í µ¿ÀÏÇÏ´Ù.
sheet['B10'].expand().value
[['ö±ÙÄÜÅ©¸®Æ®', '»óÇϼöµµ', '¼ö¹®ÇÐ'], [10.0, 20.0, 30.0]]
|
expand ¿¡´Â ¿É¼ÇÀÌ ÀÖ´Ù. ¡®down¡¯, ¡®right¡¯,
¡®table¡¯ÀÌ´Ù. ()¸¸ ¾²¸é ¡®table¡¯ÀÌ Àû¿ëµÈ´Ù. tableÀ» ¡®down¡¯°ú ¡®right¡¯°¡ °°ÀÌ Àû¿ëµÈ °ÍÀ¸·Î º¸¸é µÈ´Ù. ¿¢¼¿¿¡¼
shift-Control۸¦ ´©¸£°í ¾Æ·¡ ¹æÇâ Ű³ª ¿À¸¥ÂÊ ¹æÇâ ۸¦ ´©¸£¸é ¼±Åÿµ¿ªÀÌ È®ÀåµÇ´Â °³³ä°ú °°´Ù.
sheet['B10'].expand('right').value
['ö±ÙÄÜÅ©¸®Æ®', '»óÇϼöµµ', '¼ö¹®ÇÐ']
|
B10À¸·ÎºÎÅÍ ¿À¸¥ÂÊÀ¸·Î È®ÀåµÇ¾î ¼±ÅÃµÈ °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.
È®ÀåµÈ ÁÖ¼Ò¸¦ ¾Ë°í ½Í´Ù¸é address¼Ó¼ºÀ» ÀÌ¿ëÇÏ¸é µÈ´Ù. ¡®:¡¯·Î ±¸ºÐµÈ
ÁÖ¼Ò¸¦ ¾òÀ» ¼ö ÀÖ´Ù.
sheet['B10'].expand().address
'$B$10:$D$11'
|
-
¿¢¼¿°ú dataframe
Àü °Á¿¡¼ pandas dataframeÀ» ´Ù·é ¹Ù ÀÖ´Ù.
dataframeÀÇ °ªÀ» ¿¢¼¿·Î ³Ö°Å³ª ¿¢¼¿ÀÇ °ªµéÀ» dataframeÀ¸·Î °¡Á®¿Í¼ ÀÛ¾÷ÇÏ¸é ÆíÇÒ °ÍÀÌ´Ù.
pandas¸¦ pd¶ó´Â À̸§À¸·Î importÇϰí Åä¸ñ½Ã°øÇаú ±³·®°øÇÐ °ú¸ñ¸í°ú
Á¡¼ö·Î dataframeÀ» ¸¸µé¾î df¶ó´Â À̸§ÀÇ º¯¼ö¿¡ ÇÒ´çÇÑ´Ù. index¿Í columns¸¦ ÁöÁ¤ÇÏÁö ¾Ê¾Ò±â ¶§¹®¿¡ 0°ú 1ÀÇ index°¡
¸¸µé¾îÁ³´Ù.
import pandas as pd
df=pd.DataFrame([['Åä¸ñ½Ã°øÇÐ','±³·®°øÇÐ'],[80,90]])
df
|

ÀÌ µ¥ÀÌÅÍ ÇÁ·¹ÀÓÀ» ¿¢¼¿¿¡´Ù ³Ö¾îº¸ÀÚ. ÁÖ¼Ò B14¿¡ ³ÖÀ¸·Á¸é ¾Æ·¡¿Í °°ÀÌ
ÇÏ¸é µÈ´Ù. ´Ü¼øÇÏ°Ô df¸¦ rangeÀÇ value¿¡ ÇÒ´çÇß´Ù.
index¿Í columns±îÁö Æ÷ÇÔµÇ¾î ¿¢¼¿¿¡ ¹Ý¿µµÇ¾ú´Ù. index¿Í
columns¸¦ »©°í ¼ø¼öÇÑ °ª¸¸ ¿¢¼¿¿¡ ¹Ý¿µÇϱâ À§Çؼ´Â options¸¦ ÀÌ¿ëÇÑ´Ù. options(index=False)¸¦ Ãß°¡Çϸé
index ¾øÀÌ ¿¢¼¿¿¡ ¹Ý¿µµÈ´Ù.
sheet['B18'].options(index=False).value=df
|

¸¶Âù°¡Áö·Î header¸¦ ¾ø¾Ö±â À§Çؼ´Â header=False¸¦ Ãß°¡Çϸé
µÈ´Ù. index¿Í header ¾øÀÌ µ¥ÀÌÅ͸¸ ¿¢¼¿¿¡ ¹Ý¿µµÈ °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
sheet['B23'].options(index=False,header=False).value=df
|

À̹ø¿¡´Â ¿¢¼¿ÀÇ ³»¿ëÀ» µ¥ÀÌÅÍÇÁ·¹ÀÓÀ» °¡Á®¿Í º¸ÀÚ. ¸Ç óÀ½ µ¥ÀÌÅÍÀÎ
B3:E6ÀÇ µ¥ÀÌÅ͸¦ dataframeÀ¸·Î °¡Á®¿Â´Ù°í ÇØº¸ÀÚ. index¿Í columns(header)°¡ ÀÖ´Ù´Â °ÍÀ» ±â¾ïÇÏÀÚ.

df1=sheet['B3'].options(pd.DataFrame, expand='table').value
df1
|

optionsÀÇ pd.DataFrameÀº dataframeÇüÅ·Πº¯È¯Ç϶ó´Â
¶æÀ̰í expand=¡¯table¡¯Àº B3¼¿·ÎºÎÅÍ ¿À¸¥ÂÊ, ¾Æ·¡ÂÊÀ¸·Î È®ÀåÇØ¼ ¼±ÅÃÇ϶ó´Â ¶æÀÌ´Ù. index¿Í columns(header)°¡ Á¦´ë·Î
ÀνĵǾî dataframeÀÌ ¸¸µé¾îÁø °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù. dataframe ¿É¼Ç ¾øÀÌ °°Àº ¸í·ÉÀ» ½ÇÇàÇÏ¸é ¸®½ºÆ®·Î ¸¸µé¾îÁö´Â °ÍÀ» È®ÀÎÇÒ
¼ö ÀÖ´Ù.
df2=sheet['B3'].options(expand='table').value
df2
[['À̸§', '±¸Á¶¿ªÇÐ', 'ÅäÁú¿ªÇÐ', '¼ö¸®ÇÐ'],
['È«±æµ¿', 84.0, 80.0, 86.0],
['Á¤¾à¿ë', 99.0, 95.0, 90.0],
['À̸ù·æ', 80.0, 85.0, 89.0]]
|
-
¼¿¿¡ À½¿µ ³Ö±â
¼¿¿¡ À½¿µÀ» ³Ö±â À§Çؼ color¸¦ ¼Ó¼ºÀ» ÀÌ¿ëÇÑ´Ù. B3¼¿¿¡¼ºÎÅÍ ¿À¸¥ÂÊÀ¸·Î
È®ÀåÇØ¼ ¼±ÅÃÇϰí color¸¦ (255,100,100)À¸·Î ¼³Á¤Çß´Ù.
sheet['B3'].expand('right').color=(255,100,100)
|

-
¼¿ Å׵θ® ¼³Á¤
¼¿¿¡ Å׵θ®¸¦ ±×¸®°í ½ÍÀ» ¶§´Â Borders¼Ó¼º°ú Weight¼Ó¼ºÀ» ÀÌ¿ëÇÒ
¼ö ÀÖ´Ù.
sheet.range('B10:D11').api.Borders.Weight
= 2
|
-

4. ¸ËÀ½¸»
xlwings¸¦ ÀÌ¿ëÇØ¼ ÆÄÀ̽ãÀÇ °ªÀ» ¿¢¼¿¿¡ ¾²°í, ¿¢¼¿ÀÇ °ªÀ» ÆÄÀ̽ãÀ¸·Î
°¡Á®¿À°í, À½¿µÀ» ¼³Á¤Çϰųª Å׵θ®¸¦ ¼³Á¤ÇÏ´Â °ÍÀ» ÇØºÃ´Ù. ÀÌ ¿Ü¿¡µµ ¿ÀÇ ÆøÀ» ¼³Á¤ÇѴٵ簡 ÇàÀÇ ³ôÀ̸¦ ¼³Á¤ÇÏ´Â µîÀÇ ¼³Á¤µµ °¡´ÉÇÏ°í ±×·¡ÇÁ¸¦
±×¸®°Å³ª ¼±À» ±×¸®´Â µîÀÇ ÀÛ¾÷µµ ÆÄÀ̽ãÀ¸·Î °¡´ÉÇÏ´Ù. ¿¢¼¿¿¡¼ ÇÏ´Â ¸ðµç ÀÛ¾÷µéÀ» ÆÄÀ̽ãÀ¸·Î ÇÒ ¼ö ÀÖ´Ù°í º¸¸é µÈ´Ù. À̹ø ½Ã°£¿¡´Â ±âº»ÀûÀÎ
°Í¸¸ ¼Ò°³Çß´Ù. ÇÊ¿äÇÑ ±â´ÉÀº ±¸±Û¸µÀ¸·Î ã¾Æº¸´Â °ÍÀ» ÃßõÇÑ´Ù. ¸ðµç °ÍÀ» ´Ù ¾Ë°í ÀÖÀ» ÇÊ¿ä´Â ¾ø´Ù. Áß¿äÇÑ °³³ä¸¸ ¾Ë°í ÀÖÀ¸¸é µÈ´Ù. ¿¢¼¿¿¡¼´Â
range°³³äÀÌ Áß¿äÇÏ´Ù. ´ÙÀ½ ½Ã°£¿¡´Â ¿¢¼¿ »ç¿ëÀÚÇÔ¼ö¸¦ ÆÄÀ̽ãÀ¸·Î ¸¸µå´Â °ÍÀ» ¾Ë¾Æº¸°Ú´Ù.
-³¡-