2016-06-10 4 views
4

방금 ​​XlsxWriter로 작업하기 시작했습니다. 필자는 XlsxWriter를 사용하기 시작했는데, 필자가 가지고있는 데이터가 항상 동일한 형식을 유지하기 때문에 Excel 작성을 단순화하는 자체 메서드를 작성하려고했습니다.XlsxWriter 및 Python 상속

XlsxWriter을 상속하는 모듈을 작성하고 내 모듈을 사용하는 방법이 필요하지 않은 사람에게 직접 XlsxWriter을 사용하는 것과 똑같이 쓰고 싶었지만 특정 시점에 내 방법 중 하나가 필요하다면 코드를 변경하거나 동일한 파일/오브젝트에서 작동하는 더 많은 오브젝트를 추가하지 않고도 사용할 수 있습니다.

import xlsxwriter 

class XlsxMaster(xlsxwriter.Workbook): 

    def __init__(self, filename): 
     super(XlsxMaster, self).__init__(filename) 

    def write_results(self): 
     print "write results" 

가 그럼 난 사용할 수 있습니다 :

그래서 나는 모듈을 쓰기 시작

문제는이 워크 시트 개체가 xlsxwriter.worksheet에서 파생되지에서대로 작동하지 않는다는 것입니다
from xlsx_Master import XlsxMaster 

workbook = XlsxMaster('./Expenses01.xlsx') 
worksheet = workbook.add_worksheet() 
worksheet.write_results() 

내 모듈, 올바르게 workbook.write_results() 통해 호출 할 수 있지만 이것은 내가 원하는 않습니다. 이 방법으로 xlsxwriter.worksheet에 메소드를 추가하려면 어떻게해야합니까? 나는 그것을 우아하게 해결하는 방법을 모른다. 어쩌면 방법이있을 수도 있고 어쩌면 내가 처음부터 잘못된 길을 택한 것일 수도 있습니다.

답변

2

write_results워크 시트의 메서드이므로 Worksheet에서도 상속 된 클래스를 만들어야합니다. 여기에서 write_results을 작성할 수 있습니다. 워크 시트이 작성된 메소드를 다시 구현해야합니다. 코드를 살펴보면 _add_sheet

나는 우아하지 만, 그것이 당신이 원하는 것입니다.

+0

나는 이것이 해결책이라고 생각하지만 이것이 차트, 형식 등을 사용할 때 많은 다른 것들을 발견 할 것이라고 확신하는 첫 번째 장애물이므로 많은 노력이 필요합니다. 나는 여전히 다른 클래스를 만들고 기존 메소드를 오버라이드하는 대신에 새로운 메소드를 추가하는 대신에 다른 솔루션이 있기를 바란다. 어쩌면 나는 다른 방법이 없다는 가혹한 진리에 직면해야한다. –

3

나는 약간 다른 접근 방식을 취했으며 웹 응용 프로그램에서 xls 출력을 생성 할만큼 충분히 잘 작동하고있었습니다.

xlswriter 항목을 재정의하는 대신 Facelade 개체를 개발했습니다.이 개체는 내가하려는 작업과 일치했으며 기본 xlswriter 자산을 호출하여 작업을 수행했습니다.

import xlsxwriter 

class ExcelWriter(object): 

    def getColFormatInfo(self, fieldname): 
     #some app-specific stuff... 
     f = FieldFormat.factory(self.rdb, fieldname) 
     # width = 30 
     label = f.SHORTNAME 
     width = max(f.LENGTH, len(label)) 
     return width, label 

    def __init__(self, rdb, title): 
     self.rdb = rdb 
     self.fnp = "/tmp/%s.xlsx" % (title) 
     wb = self.workbook = xlsxwriter.Workbook(self.fnp) 

     #http://xlsxwriter.readthedocs.org/en/latest/format.html#set_bg_color 
     self.fmt_title = wb.add_format(dict(bold=True)) 
     self.fmt_title.set_bg_color("#F5F5F5") 
     self.fmt_title.set_border(1) 

     self.fmt_colheader = wb.add_format(dict(bold=True)) 
     self.fmt_colheader.set_bottom(2) 


     self.fmt_link = wb.add_format({'color': 'blue', 'underline': 1}) 

    def add_worksheet(self, wsname): 
     return self.workbook.add_worksheet(wsname) 

    def write_title(self, ws, row, col, s): 
     ws.write(row, col, s, self.fmt_title) 

    def write_colheader(self, ws, row, col, s): 
     ws.write(row, col, s, self.fmt_colheader) 

    def write(self, ws, row, col, s): 
     ws.write(row, col, s) 

    def write_url(self, ws, row, col, url, s): 
     ws.write_url(row, col, url, self.fmt_link, s) 

당신이 볼 수 있듯이, 내가 무엇을하고 있었던 것은 일부 XLS 포맷을 미리 계산하고 write_colheader 같은 것들을 그들 사용하는 것이다.

그러나 복잡한 xlswriter 작업을 수행하기 위해 사용자 친화적 인 간단한 함수를 만들 수있는 방법을 일반화 할 수 있습니다.

내가 사용하고있는 코드를 찾을 수 없지만 충분히 잘 작동합니다. 유일한 것은 많은 수작업 이었다는 것입니다. xyz을 쓰고 있던 코드의 1,13에 입력하십시오. 내 웹 응용 프로그램의 정상, html, 측면은 django-tables2을 사용하여 html을 생성했으며 훨씬 적은 코드였습니다.

그래서 내 계획은보고를 다시 작성하여보고 기반 프런트 엔드를 작성하여 ExcelWriter에 전달할 모든 핵심적인 명령을 처리 할 것입니다. 여전히 ExcelWriter가 필요합니다. API의 종류는 대략 비슷합니다.

아, 그리고 선언적 변경 사항을 제외하고는 즉시 새 구현에서 변경해야 할 사항 중 하나는 Json 파일에 배경색 # F5F5F5와 같은 서식 상수를 저장하고이를 초기화시 ExcelWriter에 전달하는 것입니다. : 추천

뭔가 다음 OPS에 관해서

self.fmt_title.set_bg_color(
    self.j_config.get("fmt_title",{}).get("bg_color", "F5F5F5") 
    ) 

변수에 전달하는 것에 대한 언급 여기 가능한 해결 일부 업데이트 기능 인증 된 정의이다.

def add_worksheet(self, wsname): 
    ws = self.current_ws = self.workbook.add_worksheet(wsname) 
    return ws 

#you'd also need to have a set_current_ws function 

def write_url(self, row, col, url, s, ws=None, fmt=None): 
    ws = ws or self.current_ws 
    fmt = fmt or self.fmt_link 

    ws.write_url(row, col, url, fmt, s) 
+0

확실히 그것을 구현하는 또 다른 성공적인 방법이다. 그러나 내가 원했던 것에서 조금 멀리 간다. 모든 방법에 관해서는 작업지를 전달해야합니다. 나를 위해 대단한 것은 없지만 단순한 사람이라 할지라도 누군가가 내 스크립트를 사용하기 때문에 "더 많은 것을"볼 수 있습니다. 현재 @pacholik보다 더 구현하기가 더 복잡한 경우에도이 아이디어를 고려할 것입니다. –

+0

주목할만한. 가능한 변경 사항을 추가했습니다. 하루가 끝나면 우선적 인 문제입니다. 대부분의 OOP 문제에 대한 해결책으로 상속에 대해 다소 편견을 느낍니다. 이 경우 내 생각으로는 Facade를 사용하면 도메인 문제, 즉 특정 유형의 Excel 컨텐츠를 작성하는 데 집중할 수 있습니다. XlsWriter의 클래스 내부에 대해 걱정할 필요없이 상속을 사용하는 경우 추적해야합니다. 언제나 그렇듯이 귀하의 마일리지는 다를 수 있습니다. –