계산 공식이 아닌 Excel 셀 값 읽기 -openpyxl
나는 셀 값을 읽기 위해 openpyxl을 사용하고 있습니다(이 열은 addin-webservice 업데이트를 제외하고).
사용한 적이 있습니다.data_only = True
그러나 현재 셀 값은 표시되지 않고 Excel이 마지막으로 시트를 읽을 때 저장된 값입니다.
wbFile = openpyxl.load_workbook(filename = xxxx,data_only=True)
wsFile = wbFile[c_sSheet]
셀 실제 값을 어떻게 읽을 수 있습니까?
wb = openpyxl.load_workbook(filename, data_only=True)
그data_only
깃발이 도움이 됩니다.
@alex-martelli가 말했듯이, openpyxl은 공식을 평가하지 않습니다.openpyxl로 Excel 파일을 열 때 공식을 읽거나 마지막으로 계산된 값을 읽을 수 있습니다.지정한 대로 수식이 추가 기능에 종속되어 있으면 캐시된 값이 정확할 수 없습니다.파일 사양 이외의 추가 기능으로는 지원되지 않습니다.대신 엑셀 런타임과 상호 작용할 수 있는 xlwings와 같은 것을 보고 싶을 수 있습니다.
data_only : 수식 셀에 대한 짝수 값을 읽습니다.
keep_vba: 매크로 지원 엑셀을 사용하는 경우에만 사용됩니다.
file_location = 'C:\Arpan Saini\Monsters\Project_Testing\SecCardGrad\SecCardGrad_Latest_docs\Derived_Test_Cases_Secure_Card_Graduate.xlsm'
wb = load_workbook(file_location, keep_vba=True, data_only=True)
@ @Charlie Clark를 사용할 수 .xlwings
(MS Excel이 있는 경우).예를 들어 보겠습니다.
공식이 . 를 들어, 가 공식을 가지고 엑셀 를 정의하는 를 들 수 있습니다. 예를 들어, 제가 정의한 예를 들어.openpyxl
from openpyxl import Workbook, load_workbook
wb=Workbook()
ws1=wb['Sheet']
ws1['A1']='a'
ws1['A2']='b'
ws1['A3']='c'
ws1['B1']=1
ws1['B2']=2
ws1['B3']='=B1+B2'
wb.save('to_erase.xlsx')
할 때, 언한것처,openpyxl
입니다.
wb2 = load_workbook(filename='to_erase.xlsx',data_only=True)
wb2['Sheet']['B3'].value
사용할 수 있습니다.xlwings
Excel로 계산된 공식을 얻는 방법:
import xlwings as xw
wbxl=xw.Book('to_erase.xlsx')
wbxl.sheets['Sheet'].range('B3').value
이 값은 예상 값인 3을 반환합니다.
저는 매우 복잡한 공식과 시트 간의 참조로 스프레드시트를 작업할 때 매우 유용하다는 것을 알게 되었습니다.
같은 문제에 직면했습니다.세포가 무엇이든 간에 세포의 값을 읽는 데 필요합니다. 스칼라, 사전 계산된 값을 가진 공식 또는 이를 사용하지 않는 공식, 정확도보다 내결함성을 선호합니다.
전략은 매우 간단합니다.
- 셀에 공식이 없는 경우 셀의 값을 반환합니다.
- 공식일 경우 사전 계산된 값을 얻도록 합니다.
- 그렇지 못한 경우, 다음을 사용하여 평가해 보십시오;
- ) 때문에
pycel
공식을 제한적으로 지원하거나 일부 오류가 있을 경우) 경고하고 없음을 반환합니다.
저는 이 모든 기계를 숨기고 셀 값을 읽기 위한 간단한 인터페이스를 제공하는 클래스를 만들었습니다.
오류 허용보다 정확성이 우선인 경우 4단계에서 예외가 발생하도록 클래스를 쉽게 수정할 수 있습니다.
누군가에게 도움이 되길 바랍니다.
from traceback import format_exc
from pathlib import Path
from openpyxl import load_workbook
from pycel.excelcompiler import ExcelCompiler
import logging
class MESSAGES:
CANT_EVALUATE_CELL = ("Couldn't evaluate cell {address}."
" Try to load and save xlsx file.")
class XLSXReader:
"""
Provides (almost) universal interface to read xlsx file cell values.
For formulae, tries to get their precomputed values or, if none,
to evaluate them.
"""
# Interface.
def __init__(self, path: Path):
self.__path = path
self.__book = load_workbook(self.__path, data_only=False)
def get_cell_value(self, address: str, sheet: str = None):
# If no sheet given, work with active one.
if sheet is None:
sheet = self.__book.active.title
# If cell doesn't contain a formula, return cell value.
if not self.__cell_contains_formula(address, sheet):
return self.__get_as_is(address, sheet)
# If cell contains formula:
# If there's precomputed value of the cell, return it.
precomputed_value = self.__get_precomputed(address, sheet)
if precomputed_value is not None:
return precomputed_value
# If not, try to compute its value from the formula and return it.
# If failed, report an error and return empty value.
try:
computed_value = self.__compute(address, sheet)
except:
logging.warning(MESSAGES.CANT_EVALUATE_CELL
.format(address=address))
logging.debug(format_exc())
return None
return computed_value
# Private part.
def __cell_contains_formula(self, address, sheet):
cell = self.__book[sheet][address]
return cell.data_type is cell.TYPE_FORMULA
def __get_as_is(self, address, sheet):
# Return cell value.
return self.__book[sheet][address].value
def __get_precomputed(self, address, sheet):
# If the sheet is not loaded yet, load it.
if not hasattr(self, '__book_with_precomputed_values'):
self.__book_with_precomputed_values = load_workbook(
self.__path, data_only=True)
# Return precomputed value.
return self.__book_with_precomputed_values[sheet][address].value
def __compute(self, address, sheet):
# If the computation engine is not created yet, create it.
if not hasattr(self, '__formulae_calculator'):
self.__formulae_calculator = ExcelCompiler(self.__path)
# Compute cell value.
computation_graph = self.__formulae_calculator.gen_graph(
address, sheet=sheet)
return computation_graph.evaluate(f"{sheet}!{address}")
저는 다음과 같은 방법으로 이 문제를 해결했습니다.
import xlwings
from openpyxl import load_workbook
data = load_workbook('PATH_TO_YOUR_XLSX_FILE')
data['sheet_name']['A1'].value = 1
data.save('PATH_TO_YOUR_XLSX_FILE')
excel_app = xlwings.App(visible=False)
excel_book = excel_app.books.open('PATH_TO_YOUR_XLSX_FILE')
excel_book.save()
excel_book.close()
excel_app.quit()
data = load_workbook('PATH_TO_YOUR_XLSX_FILE', data_only=True)
이게 당신에게 도움이 되길...
openpyxl 대신 xlwings를 사용합니다.
워크시트에 "REF!" 오류 셀이 있으면 data_only 옵션이 제대로 작동하지 않습니다.Openpyxl은 작은 테스트 xlsx 파일의 각 셀 값에 대해 None을 반환합니다.저는 엑셀을 열고 셀을 고친 후 data_만 완벽하게 작동합니다.나는 openpyxl 3.0.3을 사용합니다.
저는 파이썬 라이브러리를 사용하여 엑셀을 계산하는 대신 엑셀을 사용하도록 합니다.
왜죠? 순수한 파이썬은 아니지만 관련된 파이썬의 양을 최소화합니다.저는 엑셀 공식을 평가하기 위해 파이썬을 사용하는 대신 엑셀이 자체 기능을 처리하도록 했습니다.이렇게 하면 Excel 공식을 평가하는 Python에서 발생할 수 있는 버그를 방지할 수 있습니다.다음은 이 접근 방식의 개요입니다.
- data_only=False로 openpyxl을 호출하여 편집한 다음 스프레드시트를 저장합니다.
- 하위 프로세스를 사용합니다.새 스프레드시트를 Excel에서 열고 Excel이 스프레드시트 공식을 평가하도록 합니다.
- pnput을 사용합니다.키보드를 눌러 업데이트된 스프레드시트를 저장하고 Excel을 종료합니다.
- openpyxl with data_only=True를 사용하여 업데이트된 스프레드시트를 열고 수식의 값을 가져옵니다.
다음은 새 워크북을 만들고 셀 E2에 "=SUM(Al:C3)" 공식을 넣고 데이터를 셀 A1-C3에 넣은 다음 공식을 평가하는 Windows용 테스트 프로그램입니다.
from openpyxl import load_workbook, Workbook
from pynput.keyboard import Key, Controller
import subprocess
import time
import os
excel_prog = r'C:\Program Files\Microsoft Office\root\Office16\EXCEL.EXE'
# Create test Excel workbook, get default worksheet.
wb = Workbook()
ws = wb.active
# Put data and a formula into worksheet.
for row_index in range(1,4):
for column_index in range(1,4):
ws.cell(row = row_index, column = column_index).value = row_index + column_index
ws['E1'].value = 'Sum of cells in range A1:C3:'
ws['E2'].value = '=SUM(A1:C3)'
# Try to get value of formula. We'll see the formula instead.
print('E2:', ws['E2'].value)
# Save and close workbook.
wb.save(filename = 'test.xlsx')
wb.close()
# Pause to give workbook time to close.
time.sleep(5)
# Open the workbook in Excel. I specify folder, otherwise Excel will
# open in "Protected View", interfering with using pynput.
subprocess.Popen([excel_prog, os.path.join(os.getcwd(), 'test.xlsx')])
# Pause to give workbook time to open and for formulas to update.
time.sleep(5)
# Save workbook using pynput.
keyboard = Controller()
with keyboard.pressed(Key.ctrl):
keyboard.press('s')
keyboard.release('s')
# Pause to give workbook time to save.
time.sleep(5)
# Close workbook.
with keyboard.pressed(Key.alt):
keyboard.press(Key.f4)
keyboard.release(Key.f4)
# Pause to give workbook time to fully close.
time.sleep(5)
# Open Excel workbook and worksheet in openpyxl, data-only.
wb = load_workbook(filename = 'test.xlsx', data_only = True)
ws = wb.active
# Get value of the cell containing the formula.
print('E2:', ws['E2'].value)
# Close workbook.
wb.close()
XL 계산기에는 셀을 평가하는 기능이 있습니다.
from xlcalculator import ModelCompiler
from xlcalculator import Model
from xlcalculator import Evaluator
filename = r'xxxx.xlsm'
compiler = ModelCompiler()
new_model = compiler.read_and_parse_archive(filename)
evaluator = Evaluator(new_model)
val1 = evaluator.evaluate('First!A2')
print("value 'evaluated' for First!A2:", val1)
출력은 다음과 같습니다.
첫 번째 값은 '평가됨'입니다!답2: 0.1
언급URL : https://stackoverflow.com/questions/28517508/read-excel-cell-value-and-not-the-formula-computing-it-openpyxl
'programing' 카테고리의 다른 글
파이썬에서 이름 망글링을 사용해야 합니까? (0) | 2023.07.23 |
---|---|
키 Json, Sum 및 동적 그룹화 방법 (0) | 2023.07.23 |
커서가 오라클에서 레코드를 반환하는지 확인하는 방법은 무엇입니까? (0) | 2023.07.23 |
"x < y < z"가 "x < y and y < z"보다 빠릅니까? (0) | 2023.07.23 |
vuex store의 replaceState 함수가 호출될 때 알 수 있는 방법이 있습니까? (0) | 2023.07.18 |