Excel 시트를 열지 않고 계산(openpyxl 또는 xlwt)
.xls 파일을 열고 새 값을 몇 개 쓴 다음 파일을 저장하는 스크립트를 만들었습니다.
나중에 스크립트가 다시 열리며 수식이 포함된 일부 셀에서 답을 찾습니다.
가 그 즉, 내그셀가만 openpyxl부른나, 공얻게됩니다을식면는다로약을▁(▁if됩니다▁formula,얻, ie▁with공을게식나는▁the,▁i▁open▁that▁getpypy▁cellx면▁i)."=A1*B1"
) 그리고 내가 활성화되면,data_only
난 아무것도 얻지 못합니다.
Python이 .xls 파일을 계산할 수 있는 방법이 있습니까?(또는 PyXll을 사용해 봐야 합니까?)
실제로 Excel 공식을 가져와서 Python을 사용하여 평가하는 프로젝트가 있습니다.파이셀
Pycel은 (COM을 통해) Excel 자체를 사용하여 공식을 추출하므로, 당신의 경우에는 그 부분을 건너뛸 수 있습니다.
그 프로젝트는 아마도 당신이 사용할 수 있는 유용한 것을 가지고 있을 것이지만, 나는 그것의 성숙도나 완성도를 장담할 수 없습니다.그것은 일반 대중을 위해 개발된 것이 아닙니다.
또한 Pycel과 OpenPyXL을 기반으로 하는 코알라라는 새로운 프로젝트가 있습니다.
Excel을 사용할 수 없지만 공식의 결과를 직접 계산할 수 있다면(파이썬 코드에서) 셀에 값과 공식을 모두 쓰는 것입니다(파일을 읽을 때 값을 풀하기만 하면 공식에 전혀 걱정할 필요가 없습니다).이 글을 쓰는 현재, 저는 OpenPyXL에서 그것을 하는 방법을 찾지 못했지만, XlsxWriter는 그것을 할 수 있습니다.설명서에서 다음을 참조하십시오.
XlsxWriter는 공식의 값을 계산하지 않고 값 0을 공식 결과로 저장합니다.그런 다음 파일을 열 때 모든 공식과 함수를 다시 계산해야 한다는 내용의 글로벌 플래그를 XLSX 파일에 설정합니다.이 방법은 Excel 설명서에서 권장하는 방법이며 일반적으로 스프레드시트 응용 프로그램에서 잘 작동합니다.그러나 Excel Viewer와 같이 공식을 계산할 수 있는 기능이 없는 응용 프로그램이나 일부 모바일 응용 프로그램은 0 결과만 표시합니다.
필요한 경우 옵션 값 매개 변수를 사용하여 공식의 계산된 결과를 지정할 수도 있습니다.수식의 값을 계산하지 않는 비 Excel 응용 프로그램을 사용할 때 이 기능이 필요한 경우가 있습니다.계산된 값은 인수 목록의 끝에 추가됩니다.
파일 형식.write_formula('A1', '=2+2', num_format, 4)
이때 이접방사값을면때읽을용하 OpenPyXL을 할 수 .data_only
.이읽는 : (할 수 xlrd를 사용할 수 있습니다.)
마지막으로 Excel을 사용하는 경우 가장 간단하고 신뢰할 수 있는 방법은 Excel에서 파일 열기 및 재저장을 자동화하는 것입니다. 그러면 공식의 값을 계산하고 기록할 수 있습니다.xlwings는 Windows 또는 Mac에서 쉽게 이 작업을 수행할 수 있는 방법입니다.
저는 이 질문이 오래된 것이라는 것을 알지만, 저는 같은 문제에 부딪혔고 광범위한 검색을 해도 답이 나오지 않았습니다.
그 해결책은 사실 매우 간단하기 때문에 저는 이것을 후세를 위해 여기에 게시할 것입니다.
를 들어 xlsx 파일을 openpyxl
했듯이.openpyxl
수식을 계산하지 않지만 파일을 excel로 열면 수식이 자동으로 계산됩니다.따라서 파일을 열고 Excel을 사용하여 저장하기만 하면 됩니다.
이를 위해 다음을 사용할 수 있습니다.win32com
모듈.
import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
workbook = excel.Workbooks.Open(r'absolute/path/to/your/file')
# this must be the absolute path (r'C:/abc/def/ghi')
workbook.Save()
workbook.Close()
excel.Quit()
바로 그겁니다.저는 파이셀이나 코알라를 사용하자는 제안을 모두 보았습니다. 하지만 엑셀에게 열고 저장하라고만 하면 된다면 그건 좀 지나친 것 같습니다.
이 솔루션은 창에만 해당됩니다.
공식 모듈은 저에게 적합합니다.자세한 내용은 https://pypi.org/project/formulas/ 을 참조하십시오.
from openpyxl import load_workbook
import formulas
#The variable spreadsheet provides the full path with filename to the excel spreadsheet with unevaluated formulae
fpath = path.basename(spreadsheet)
dirname = path.dirname(spreadsheet)
xl_model = formulas.ExcelModel().loads(fpath).finish()
xl_model.calculate()
xl_model.write(dirpath=dirname)
#Use openpyxl to open the updated excel spreadsheet now
wb = load_workbook(filename=spreadsheet,data_only=True)
ws = wb.active
저는 같은 문제에 부딪혔고, 얼마간의 조사 끝에 pyoo(https://pypi.org/project/pyoo/ )를 사용하게 되었는데, 이는 모든 플랫폼에서 사용할 수 있는 오픈오피스/libreoffice용이며, 기본적으로 통신할 수 있고 파일을 저장/닫을 필요가 없기 때문에 더 간단합니다. 다른 여러 라이브러리를 시도했지만 다음과 같은 문제를 발견했습니다.
- xlswings:Excel과 Windows/MacOS가 설치되어 있어서 평가할 수 없는 경우에만 작동합니다.
- 코알라: 네트워크 x 2.4 업데이트 후에 고장난 것 같습니다.
- openpyxl:다른 사람들이 지적했듯이 공식을 계산할 수 없기 때문에 pycel과 결합하여 값을 구하는 것을 알아보고 있었습니다.pyoo를 발견해서 최종적으로 시도하지 않았습니다. pycel도 networkx 라이브러리에 의존하고 있기 때문에 Openpyxl+pycel은 현재 작동하지 않을 수 있습니다.
아니요, 그리고.openpyxl
절대 없을 겁니다저는 당신이 사용할 수 있는 공식 설명서의 엔진을 구현하는 파이썬 라이브러리가 있다고 생각합니다.
xlcalculator는 이 작업을 할 수 있습니다.https://github.com/bradbase/xlcalculator
from xlcalculator import ModelCompiler
from xlcalculator import Model
from xlcalculator import Evaluator
filename = r'use_case_01.xlsm'
compiler = ModelCompiler()
new_model = compiler.read_and_parse_archive(filename)
evaluator = Evaluator(new_model)
# First!A2
# value is 0.1
#
# Fourth!A2
# formula is =SUM(First!A2+1)
val1 = evaluator.evaluate('Fourth!A2')
print("value 'evaluated' for Fourth!A2:", val1)
evaluator.set_cell_value('First!A2', 88)
# now First!A2 value is 88
val2 = evaluator.evaluate('Fourth!A2')
print("New value for Fourth!A2 is", val2)
그 결과 다음과 같은 출력이 발생합니다.
file_name use_case_01.xlsm ignore_sheets []
value 'evaluated' for Fourth!A2: 1.1
New value for Fourth!A2 is 89
언급URL : https://stackoverflow.com/questions/22451973/calculating-excel-sheets-without-opening-them-openpyxl-or-xlwt
'programing' 카테고리의 다른 글
앱 실행기 아이콘에서 알림 수를 표시하는 방법 (0) | 2023.08.15 |
---|---|
매개 변수를 사용하여 mySql에서 프로시저 만들기 (0) | 2023.08.15 |
일반 테이블 재쿼리 (0) | 2023.08.15 |
Angular 2 날짜 입력이 날짜 값에 바인딩되지 않습니다. (0) | 2023.08.15 |
외국 키와 관련된 장고의 DeleteView 문제를 해결하려면 어떻게 해야 합니까? (0) | 2023.08.15 |