2012-08-12 2 views
4

나는 어려움을 겪고있는 df.to_excel()의 간단한 사용 사례가 있습니다. 수식 및 다른 탭의 피벗으로 참조 할 수있는 기존 XLSX 통합 문서의 특정 워크 시트 탭 ("데이터"라고 부름)에 쓰고 싶습니다.팬더 : to_excel을 사용하여 기존 엑셀 파일 (xlsx)에 쓰기

두 가지 방법으로 ExcelWriter를 수정하려고했지만 두 가지 모두 openpyxl에서 오류가 발생합니다.

  1. 는 기존 시트를 사용하여 get_sheet_by_name 읽기 (이 오류 :. "NotImplementedError : 사용 '을 iter_rows()'대신 ')
  2. 이 create_sheet을 사용하여 새 시트를 작성합니다. (이 오류 : "ReadOnlyWorkbookException : 읽기 전용 통합 문서에 새 시트를 만들 수 없습니다")

    df=DataFrame() 
    from openpyxl.reader.excel import load_workbook 
    book = load_workbook('my_excel_file.xlsx', use_iterators=True) # Assume my_excel_file.xlsx contains a sheet called 'Data' 
    class temp_excel_writer(ExcelWriter): # I need this to inherit the other methods of ExcelWriter in io/parsers.py 
    def __init__(self, path, book): 
        self.book=book 
        test_sheet=self.book.create_sheet(title='Test') # This errors: ReadOnlyWorkbookException 
        self.use_xlsx = True 
        self.sheet_names=self.book.get_sheet_names() 
        self.actual_sheets=self.book.worksheets 
        self.sheets={} 
        for i,j in enumerate(self.sheet_names): 
         self.sheets[j] = (self.actual_sheets[i],1) 
        self.cur_sheet = None 
        self.path = save 
    my_temp_writer=temp_excel_writer('my_excel_file.xlsx', book) 
    df.to_excel(my_temp_writer, sheet_name='Data') 
    

어떤 생각이? 나는 명백한 것을 놓치고 있는가? 여전히 팬더입니다. 012

답변

2

use_iterators=True으로 통합 문서를로드하면 Workbook 개체에 _set_optimized_read()이로드되어 읽기 전용으로로드됩니다.

from openpyxl.reader.excel import load_workbook 

book = load_workbook('t.xlsx', use_iterators=False) # Assume t.xlsx contains ['Data', 'Feuil2', 'Feuil3'] 
print book.get_sheet_names() 


class temp_excel_writer(): 
    def __init__(self, path, book): 
     self.book=book 
     test_sheet=self.book.create_sheet(title='Test') # No exception here now 
     self.book.save(path) 
     self.use_xlsx = True 
     self.sheet_names=self.book.get_sheet_names() 
     print self.sheet_names 
     self.actual_sheets=self.book.worksheets 
     self.sheets={} 
     for i,j in enumerate(self.sheet_names): 
      self.sheets[j] = (self.actual_sheets[i],1) 
     self.cur_sheet = None 
     self.path = path # I had to modify this line also 

my_temp_writer = temp_excel_writer('my_excel_file.xlsx', book) 

그것은 my_excel_file.xlsx라는 파일에 다음과 같은 출력을 생성 : 다음 코드로 따라서

,

['Data', 'Feuil2', 'Feuil3'] 
['Data', 'Feuil2', 'Feuil3', 'Test'] 

이 희망 그것은

을하는 데 도움이