programing

Python openpyxl data_only=True 반환 없음

starjava 2023. 6. 21. 22:02
반응형

Python openpyxl data_only=True 반환 없음

간단한 엑셀 파일이 있습니다.

A1 = 200
A2 = 300
A3 = =SUM(A1:A2)

이 파일은 엑셀에서 작동하고 적절한 값을 보여줍니다.SUM그러나 파이썬에 대해 openpyxl 모듈을 사용하는 동안 값을 얻을 수 없습니다.data_only=True모드

셸의 파이썬 코드:

wb = openpyxl.load_workbook('writeFormula.xlsx', data_only = True)
sheet = wb.active
sheet['A3']
<Cell Sheet.A3> # python response
print(sheet['A3'].value)
None # python response

반면:

wb2 = openpyxl.load_workbook('writeFormula.xlsx')
sheet2 = wb2.active
sheet2['A3'].value
'=SUM(A1:A2)'  # python response

제가 뭘 잘못하고 있는지 알려주실 수 있나요?

그것은 파일의 출처에 따라 다릅니다. data_only=TrueExcel과 같은 응용 프로그램에서 캐시하는 수식의 값에 따라 달라집니다.그러나 파일이 openpyxl 또는 유사한 라이브러리에 의해 생성된 경우 공식이 평가되지 않았을 가능성이 있으므로 캐시된 값을 사용할 수 없으며 openpyxl이 보고합니다.None가치로서

Openpyxl과 Python으로 문제를 복제했습니다.

저는 현재 openpyxl 버전 2.6.3과 Python 3.7.4를 사용하고 있습니다.또한 저는 당신이 Al Sweegart에 의한 ATBSWP의 연습을 완료하려고 한다고 생각합니다.

저는 엑셀이 실제로 가치를 캐시할 수 있다는 것을 고려하여 찰리 클라크의 답변을 시도하고 테스트했습니다.Excel에서 스프레드시트를 열고 공식을 복사하여 동일한 셀에 붙여넣은 다음 워크북을 저장했습니다.data_only=True 옵션으로 Openpyxl을 사용하여 Python에서 워크북을 다시 열고 이 셀의 값을 읽었을 때 잘못된 값 대신 500인 None 유형이 표시되었습니다.

이것이 도움이 되길 바랍니다.

저도 같은 문제가 있었습니다.이것이 가장 우아한 해결책은 아닐 수도 있지만, 저에게 효과가 있었던 것은 다음과 같습니다.

import xlwings
from openpyxl import load_workbook

excel_app = xlwings.App(visible=False)
excel_book = excel_app.books.open('writeFormula.xlsx')
excel_book.save()
excel_book.close()
excel_app.quit()

workbook = load_workbook(filename='writeFormula.xlsx', data_only=True)

저는 이 문제에 대한 제안이 있습니다.xlsx 파일을 csv :)로 변환합니다.원본 xlsx 파일은 그대로 유지됩니다.변환은 libreoffice(subprocess.call() 라인)에 의해 수행됩니다.여러분은 이것을 위해 판다를 좀 더 비단결적인 방법으로 사용할 수도 있습니다.

from subprocess import call
from openpyxl import load_workbook
from csv import reader

filename="test"

wb = load_workbook(filename+".xlsx")
spread_range = wb['Sheet1']

#what ever function there is in A1 cell to be evaluated
print(spread_range.cell(row=1,column=1).value) 

wb.close()

#this line can be done with subprocess or os.system()
#libreoffice --headless --convert-to csv $filename --outdir $outdir
call("libreoffice --headless --convert-to csv "+filename+".xlsx", shell=True)

with open(filename+".csv", newline='') as f:
    reader = reader(f)
    data = list(reader)

print(data[0][0])

또는

# importing pandas as pd
import pandas as pd
  
# read an excel file and convert 
# into a dataframe object
df = pd.DataFrame(pd.read_excel("Test.xlsx"))
  
# show the dataframe
df

이것이 누군가에게 도움이 되길 바랍니다 :-)

네, @Beno가 맞습니다.파일을 만지지 않고 편집하려면 엑셀 파일을 편집하는 작은 "로봇"을 만들 수 있습니다.

경고:이것은 Excel 파일을 편집하는 반복적인 방법입니다.이러한 라이브러리는 컴퓨터에 따라 다릅니다. 설정해야 합니다.time.sleep코드의 나머지 부분을 계속하기 전에 적절하게.

예를 들어, 저는time.sleep,subprocess.Popen,그리고.pywinauto.keyboard.send_keys설정한 셀에 임의의 문자를 추가한 다음 저장합니다.그러면 그.data_only=True완벽하게 작동하고 있습니다.피위누토에 대한 더 많은 정보를 위해.키보드: 파이위노토.건반

# import these stuff
import subprocess
from pywinauto.keyboard import send_keys
import time
import pygetwindow as gw
import pywinauto

excel_path = r"C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE"
excel_file_path = r"D:\test.xlsx"

def focus_to_window(window_title=None): # function to focus to window. https://stackoverflow.com/a/65623513/8903813
    window = gw.getWindowsWithTitle(window_title)[0]
    if not window.isActive:
        pywinauto.application.Application().connect(handle=window._hWnd).top_window().set_focus()

subprocess.Popen([excel_path, excel_file_path])
time.sleep(1.5) # wait excel to open. Depends on your machine, set it propoerly
focus_to_window("Excel") # focus to that opened file
send_keys('%{F3}') # excel's name box | ALT+F3
send_keys('AA1{ENTER}') # whatever cell do you want to insert somthing | Type 'AA1' then press Enter
send_keys('Stackoverflow.com') # put whatever you want | Type 'Stackoverflow.com'
send_keys('^s') # save | CTRL+S
send_keys('%{F4}') # exit | ALT+F4
print("Done")

제가 영어를 잘 못해서 죄송합니다.

이미 언급한 다른 항목들과 마찬가지로 Openpyxl은 data_only 모드에서 캐시된 수식 값만 읽습니다.Openpyxl에서 수식 결과 값을 읽기 위해 처리하기 전에 PyWin32를 사용하여 각 XLSX 파일을 열고 저장했습니다.저는 큰 파일을 처리하지 않기 때문에 이것은 저에게 잘 맞습니다.이 솔루션은 PC에 MS Excel이 설치되어 있는 경우에만 작동합니다.

import os
import win32com.client
from openpyxl import load_workbook

# Opening and saving XLSX file, so results for each stored formula can be evaluated and cashed so OpenPyXL can read them.
excel_file = os.path.join(path, file)
excel = win32com.client.gencache.EnsureDispatch('Excel.Application')
excel.DisplayAlerts = False # disabling prompts to overwrite existing file
excel.Workbooks.Open(excel_file )
excel.ActiveWorkbook.SaveAs(excel_file, FileFormat=51, ConflictResolution=2)
excel.DisplayAlerts = True # enabling prompts
excel.ActiveWorkbook.Close()

wb = load_workbook(excel_file)
# read your formula values with openpyxl and do other stuff here

저도 같은 문제에 부딪혔습니다.이 스레드를 읽은 후 엑셀 파일을 열고 변경한 후 파일을 다시 저장하여 수정할 수 있었습니다.정말 이상한 문제군요.

언급URL : https://stackoverflow.com/questions/36116162/python-openpyxl-data-only-true-returning-none

반응형