파이썬 openpyxl 셀 병합에 테두리 입히기

조회수 2364회
#cellmerge.py
from itertools import product
import types
import openpyxl
from openpyxl import worksheet
from openpyxl.utils import range_boundaries

def patch_worksheet():
    def merge_cells(self, range_string=None, start_row=None, start_column=None, end_row=None, end_column=None):
        """ Set merge on a cell range.  Range is a cell range (e.g. A1:E1)
        """
        if not range_string and not all((start_row, start_column, end_row, end_column)):
            msg =  "You have to provide a value either for 'coordinate' or for\
            'start_row', 'start_column', 'end_row' *and* 'end_column'"
            raise ValueError(msg)
        elif not range_string:
            range_string = '%s%s:%s%s' % (get_column_letter(start_column),
                                          start_row,
                                          get_column_letter(end_column),
                                          end_row)
        elif ":" not in range_string:
            if COORD_RE.match(range_string):
                return  # Single cell, do nothing
            raise ValueError("Range must be a cell range (e.g. A1:E1)")
        else:
            range_string = range_string.replace('$', '')

        if range_string not in self.merged_cells:
            self.merged_cells.add(range_string)


        # The following is removed by this monkeypatch:

        # min_col, min_row, max_col, max_row = range_boundaries(range_string)
        # rows = range(min_row, max_row+1)
        # cols = range(min_col, max_col+1)
        # cells = product(rows, cols)

        # all but the top-left cell are removed
        #for c in islice(cells, 1, None):
            #if c in self._cells:
                #del self._cells[c]

    # Apply monkey patch
    m = types.MethodType(merge_cells,worksheet.Worksheet)
    worksheet.Worksheet.merge_cells = m

    setattr(worksheet.Worksheet,'merge_cells',merge_cells)


patch_worksheet()

위 코드는 스택오버플로우에서 다수의 해외 이용자들 간 논의가 됐던 병합된 셀에 테두리를 적용하는 오픈소스 중 하나입니다. python 2 와 3의 버전 차이로,

'#Apply monkey patch 밑이 바뀌어서

3번째 항을 제가 만든 example.xlsx 파일의 A1:D1 (이미 병합되있는)에 적용시키기 위해

setattr(worksheet.Worksheet,'merge_cells','A1:D1')

으로 바꾸고, abc.py 파일에 patch_worksheet을 import 하고, load_workbook으로 example.xlsx를 불러와 patch_worksheet() 함수를 호출했습니다. 그러나

Traceback (most recent call last):
  File "C:\Users\any\Desktop\python\abc.py", line 121, in <module>
    wb = load_workbook('example.xlsx')
  File "C:\Users\any\AppData\Local\Programs\Python\Python36\lib\site-packages\openpyxl\reader\excel.py", line 248, in load_workbook
    ws_parser.parse()
  File "C:\Users\any\AppData\Local\Programs\Python\Python36\lib\site-packages\openpyxl\reader\worksheet.py", line 128, in parse
    dispatcher[tag_name](element)
  File "C:\Users\any\AppData\Local\Programs\Python\Python36\lib\site-packages\openpyxl\reader\worksheet.py", line 252, in parse_merge
    self.ws.merge_cells(c.ref)
TypeError: 'str' object is not callable 

이러한 오류가 뜹니다.. 제가 함수 사용법을 잘못 알고 있는건가요? 도움 부탁드립니다ㅠㅠ

  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)