programing

나머지 파일을 수정하지 않고도 하나의 Excel 파일 워크시트(탭)를 읽고 수정할 수 있습니까?

cafebook 2023. 4. 19. 00:21
반응형

나머지 파일을 수정하지 않고도 하나의 Excel 파일 워크시트(탭)를 읽고 수정할 수 있습니까?

많은 스프레드시트에는 Excel 파일을 읽고 쓰는 Python 도구가 충실하게 재현할 수 없는 수식과 형식이 있습니다.즉, 프로그래밍 방식으로 작성하는 모든 파일은 기본적으로 처음부터 새로 만든 것이어야 하며, 그 후 다른 Excel 파일(앞서 설명한 정교함)은 해당 파일을 참조해야 합니다(그 때문에 다른 다양한 종속성 문제가 발생합니다).

Excel 파일 '탭'은 실제로는 XML 파일 모음에 불과하다고 알고 있습니다.팬더(또는 xlsxwriter나 openpyxl과 같은 기본 읽기/쓰기 엔진 중 하나)를 사용하여 탭 중 하나만 수정하고 다른 탭(더 악의적인 탭 포함)은 그대로 둘 수 있습니까?

편집: 예를 들어 문제를 더 명확하게 설명하겠습니다.

  • Excel Sheet test.xlsx에는 4개의 탭(워크시트라고도 함)이 있습니다.시트1, 시트2, 시트3, 시트4
  • panda.read_excel()을 사용하여 Sheet3를 DataFrame(df라고 부릅시다)으로 읽었습니다.
  • Sheet1 및 Sheet2에는 openpyxl 및 xlrd 모두 구문 분석할 수 없는 수식, 그래프 및 다양한 형식이 포함되어 있으며 Sheet4에는 다른 데이터가 포함되어 있습니다.나는 그 탭들을 전혀 만지고 싶지 않다.
  • Sheet2에는 실제로 Sheet3의 셀에 대한 참조가 있습니다.
  • df를 몇 가지 편집하여 sheet3에 다시 쓰고 싶습니다.다른 시트는 그대로 둡니다(워크북의 다른 워크시트에서 참조).

만약 그렇다면, 어떻게 할 수 있을까요?

엑셀과 비단뱀(특히 팬더)의 상호작용에 대해서도 비슷한 질문을 했는데, 이 질문을 받았습니다.

stackoverflow 커뮤니티에 의한 포인터 덕분에 HaPsantran이 필요로 하는 많은 기능을 커버하는 xlwings라는 패키지를 찾았습니다.

OP의 예를 사용하려면:

기존 Excel 파일로 작업하면 팬더에게 Import할 데이터 블록(Sheet3)에 엑셀로 이름을 지정하여 앵커를 드롭하고 다음을 수행할 수 있습니다.

# opened an existing excel file

wb = Workbook(Existing_file)

# Find in the excel file a named cell and reach the boundary of the cell block (boundary defined by empty column / row) and read the cell 

df = Range(Anchor).table.value

# import pandas and manipulate the data block
df = pd.DataFrame(df) # into Pandas DataFrame
df['sum'] = df.sum(axis= 1)

# write back to Sheet3
Range(Anchor).value = df.values

이 구현이 Excel 파일의 기존 수식을 완화하지 않는 것을 테스트했습니다.

이것으로 문제가 해결되는지, 그리고 제가 도울 수 있는 일이 있으면 알려주세요.

xlwings의 개발자에게 큰 찬사를 보냈기 때문에 가능했습니다.


아래는 @jamzsabb로부터의 추가 질문 후 이전 답변에 대한 업데이트이며, xlwings가 >= 0.9.0으로 업데이트 된 후 변경된 API를 반영합니다.

import xlwings as xw
import pandas as pd
target_df = xw.Range('A7').options(pd.DataFrame, expand='table').value # only do this if the 'A7' cell (the cell within area of interest) is in active worksheet
#otherwise do:
#sht = xw.Book(r'path to your xlxs file\name_of_file.xlsx`).sheets['name of sheet']
#target_df = sht.Range('A7').options(pd.DataFrame, expand='table').value # you can also change 'A7' to any name that you've given to a cell like 'interest_table`

수 있다 90%'는% pandas thisdo 입니다.를 올리는 가 항상 놓치고 있는 예가 .왜냐하면 항상 제가 놓치고 있는 영리한 것이 있을 수 있기 때문입니다만, 여기 예가 있습니다.

가능한 은 " " " " " 입니다.xlrd/xlwt/xlutils,openpyxl , , , , 입니다.xlsxwriter도 당신의xlrd/wt 하지 않습니다xlsxwriter의 것을 수 .xlsx 및 「」, 「」의openpyxl이미지 및 차트가 손실됩니다.

이 작업을 자주 해야 하기 때문에 간단한 출력만 별도의 파일에 쓰고 win32api를 직접 호출하여 워크북 간에 데이터를 복사하면서 동료의 빛나는 수치를 모두 보존했습니다.번거롭습니다.*nix가 아닌 Windows에서 해야 하는데 동작합니다.

Windows(윈도우)에서 작업하는 경우 이와 유사한 작업을 수행할 수 있습니다.(이러한 상황에 있는 사람들을 돕기 위해 네이티브 인서트 옵션을 추가하는 것이 타당한지, 아니면 단순히 레시피를 게시하는 것이 좋은지 궁금합니다.


추신: 이 문제는 때때로 저를 충분히 짜증나게 했고, 저는 최신 Excel 포맷을 충분히 익혀서 라이브러리 중 하나에 이 기능을 추가하려고 생각했습니다.

P.P.S.: 하지만 당신이 다루지 않는 것들을 무시하고 수정하지 않고 돌려보내는 것은 충분히 쉬워 보이기 때문에, 아무도 그것을 지지하지 않는 것 같아서, 저는 레드몬드가 관여하고 있는 부분에 대해 기꺼이 믿고 싶습니다.@john-machin이라면 자세한 것은 알 수 있을 것이다.

openpyxl을 사용한 답변을 추가합니다.버전 2.5부터는 기존 파일에 차트를 보존할 수 있습니다(이 문제에 대한 자세한 내용은 여기를 참조하십시오).

데모를 위해 OP 가이드라인에 따라 팬더를 사용하여 xlsx 파일을 만듭니다.'Sheet2'라는 이름의 탭에는 'Sheet3'을 참조하는 수식이 있으며 차트가 포함되어 있습니다.

import pandas as pd

df = pd.DataFrame({'col_a': [1,2,3],
                  'col_b': [4,5,6]})

writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1', index=False)
workbook=writer.book
worksheet = writer.sheets['Sheet1']
df.head(0).to_excel(writer, sheet_name='Sheet2', index=False)
workbook=writer.book
worksheet = writer.sheets['Sheet2']
for i in range(2, len(df) + 2):
    worksheet.write_formula('A%d' % (i), "=Sheet3!A%d" % (i))
    worksheet.write_formula('B%d' % (i), "=Sheet3!B%d" % (i))
chart = workbook.add_chart({'type': 'column'})

chart.add_series({'values': '=Sheet2!$A$2:$A$4'})
chart.add_series({'values': '=Sheet2!$B$2:$B$4'})

worksheet.insert_chart('A7', chart)

df.to_excel(writer, sheet_name='Sheet3', index=False)
df.to_excel(writer, sheet_name='Sheet4', index=False)

writer.save()

위의 코드를 실행한 후 test.xlsx가 필요합니다.

코드 첫 번째 블록 뒤에 test.xlsx가 표시됩니다.

그런 다음 openpyxl을 사용하여 아래 코드를 실행하면 'Sheet2'의 공식과 차트를 유지하면서 'Sheet3'의 데이터를 수정할 수 있으며 업데이트된 데이터는 이 파일에 있습니다.

from openpyxl import load_workbook

wb = load_workbook('test.xlsx')
ws = wb['Sheet3']
ws['B2'] = 7
ws['B3'] = 8
ws['B4'] = 9
wb.save('test.xlsx')

두 번째 코드 블록을 실행한 후 test.xlsx가 필요합니다.

두 번째 코드 블록 뒤에 test.xlsx가 표시됩니다.

내가 아는 한 판다는 혼자서 그렇게 하지 않는다.

엑셀 템플릿과 판다 데이터 프레임 간의 상호작용을 촉진하기 위해 소규모 유틸리티 라이브러리 pandersxltable(openpyxl 기반)을 작성했습니다.라이브러리를 사용하면 데이터 프레임으로 가져와 데이터 프레임에서 Excel 데이터 테이블(탭은 아니지만 일부)을 업데이트할 수 있습니다.

'time'을 'time'으로 하는 경우 탭 중 하나를 수정하는 것이 가능합니다.parse(sheet_name)기능.

를 들어, 팬더를 사용하여 파이썬으로 된 엑셀 파일을 읽습니다.

(시트를 제어하면서) Excel에 회신하다to_excel함수, 여기: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_excel.html

필수: 존재하는 콜 경로가 파일을 초과합니다.

입력: 문자열을 나열합니다.

출력: 행 추가.

from datetime import datetime,timedelta
from openpyxl import load_workbook,Workbook
       
   def write_log_excels(status):
       """
       Function to write log in excel  
       """
               try:
                   # Point
                   log_list = ["1","2","3","4","5","6","7","8", "9"]
                   date_n = datetime.now()
                   date_n = date_n.strftime("%Y-%m-%d %H:%M:%S")
                   sdate = date_n
   
                   wk = load_workbook('filename.xlsx')
                   wh = wk.active
                   lenth = wh.max_row
                   # wk.close()
                   pl = log_list
                   if lenth == 0:
                       # ws = Workbook()
                       # wb = ws.active
                       wh['A1'] = 'TITLE1'
                       wh['B1'] = 'TITLE2'
                       wh['C1'] = 'TITLE3'
                       wh['D1'] = 'TITLE4'
                       wh['E1'] = 'TITLE5'
                       wh['F1'] = 'TITLE6'
                       wh['G1'] = 'TITLE7'
                       wh['H1'] = 'TITLE8'
                       wh['I1'] = 'TITLE9'
                       lenth = 1
                   if pl is not None:
                       w = lenth + 1
                       wh['A{}'.format(w)] =  pl[0]
                       wh['B{}'.format(w)] =  pl[1]
                       wh['C{}'.format(w)] =  pl[2]
                       wh['D{}'.format(w)] =  pl[3]
                       wh['E{}'.format(w)] =  pl[4]
                       wh['F{}'.format(w)] =  pl[5]
                       wh['G{}'.format(w)] =  pl[3]
                       wh['H{}'.format(w)] =  pl[4]
                       wh['I{}'.format(w)] =  pl[5]
                   wk.save('filename.xlsx')
       
                   log_list.clear()
               except Exception as e:
                   print('write_log_excels :' + str(e))
       write_log_excels('')

아니면 이걸 콜, 로우 자동 생성에 사용할 수도 있어요

def work_sheet(wsheet):
    data_sheet = []
    col = [] #column in sheet
    for c in range(wsheet.max_column):
        #got alphabels with max_(len)_column found in worksheet
        col.append(string.ascii_uppercase[c])

    for r in range(2,wsheet.max_row + 1):
        data_row = []
        for c in range(len(col)):
            #got values exactly with "sheet[colum-row]"
            data = wsheet['{}{}'.format(col[c],r)].value
            data_row.append(data)
        data_sheet.append(data_row)
    return data_sheet

이것은 꽤 오래된 질문이지만, 나는 네가 이렇게 할 수 있다고 믿는다(판다와 함께 테스트).1.4.3):

df = pd.read_excel(pd.ExcelFile('file.xlsx'), sheet_name='Sheet1')
# make modifications to your dataframe
df.to_excel('file.xlsx', sheet_name=sheet_name)

그 이유는to_excel와 함께sheet_nameparam은 그 1장의 시트에만 쓰고 나머지 시트에는 그대로 남습니다.

언급URL : https://stackoverflow.com/questions/28142420/can-pandas-read-and-modify-a-single-excel-file-worksheet-tab-without-modifying

반응형