python xlrd를 사용하여 Excel 셀에서 공식 가져오기
나는 엑셀 시트에서 파이썬 코드로 알고리즘을 포팅해야 하지만 엑셀 파일에서 알고리즘을 리버스 엔지니어링해야 합니다.
Excel 시트는 매우 복잡하며, 다른 셀을 참조하는 공식(공식 또는 상수를 포함할 수도 있음)이 있는 셀이 많이 포함되어 있습니다.
제 아이디어는 파이썬 스크립트를 사용하여 셀 간의 의존성 테이블을 구축하는 시트를 분석하는 것입니다. 즉,
A1은 B4, C5, E7 공식에 의존합니다: "=sqrt(B4)+C5*E7"
는 B5, 공식에 . A2"B5, C6"입니다. "=sin(B5)*C6"
...
xlrd python 모듈은 XLS 워크북을 읽을 수 있지만 지금은 공식이 아닌 셀 값에 액세스할 수 있습니다.
예를 들어, 다음 코드를 사용하면 셀 값을 쉽게 얻을 수 있습니다.
import xlrd
#open the .xls file
xlsname="test.xls"
book = xlrd.open_workbook(xlsname)
#build a dictionary of the names->sheets of the book
sd={}
for s in book.sheets():
sd[s.name]=s
#obtain Sheet "Foglio 1" from sheet names dictionary
sheet=sd["Foglio 1"]
#print value of the cell J141
print sheet.cell(142,9)
어쨌든 .cell(...) 메서드에서 반환된 Cell 개체에서 공식을 가져올 방법이 없는 것 같습니다.문서에서는 (Excel 파일에 저장된 함수 이름 변환에 대한 정보가 없기 때문에) 공식의 문자열 버전을 얻을 수 있다고 말합니다.이름 및 연산자 클래스에서 수식(식)에 대해 이야기하지만, 이 클래스의 인스턴스를 포함해야 하는 셀 클래스 인스턴스로 가져오는 방법을 이해할 수 없습니다.
셀에서 공식 텍스트를 가져오는 코드 스니펫을 제안할 수 있습니까?
[Dis] 클레임자:의 작성자/관리자입니다.xlrd
.
수식 텍스트에 대한 문서 참조는 "이름" 수식에 대한 것입니다. 문서 시작 부분에 있는 "이름 지정된 참조, 상수, 수식 및 매크로" 섹션을 참조하십시오.이러한 수식은 이름에 시트 전체 또는 책 전체에 연결되며, 개별 셀에는 연결되지 않습니다. 예:PI
에 대한 지도.=22/7
,SALES
에 대한 지도.=Mktng!$A$2:$Z$99
는 정의된.name -discovery의 보다 으로 발견되는 되었습니다.
일반적으로 셀, 공유 및 배열(모두 셀과 직접 또는 간접적으로 연결됨), 이름, 데이터 유효성 검사 및 조건부 형식 지정 등 여러 가지 공식이 있습니다.
일반 공식을 바이트코드에서 텍스트로 압축 해제하는 것은 "진행 중인 작업"입니다.사용 가능한 경우 텍스트 수식을 구문 분석하여 셀 참조를 추출해야 합니다.HTML과 마찬가지로 정규식을 사용하는 것은 쉬워 보이지만 작동하지 않기 때문에 Excel 공식을 올바르게 구문 분석하는 것은 쉽지 않습니다.공식 바이트 코드에서 직접 참조를 추출하는 것이 좋습니다.
또한 셀 기반 수식은 이름을 나타낼 수 있으며, 이름 수식은 셀과 다른 이름을 모두 나타낼 수 있습니다.따라서 셀 기반 공식과 이름 공식에서 셀 및 이름 참조를 모두 추출해야 합니다.공유 수식에 대한 정보가 있으면 유용할 수 있습니다. 그렇지 않으면 다음을 구문 분석할 수 있습니다.
B2 =A2
B3 =A3+B2
B4 =A4+B3
B5 =A5+B4
...
B60 =A60+B59
당신은 그것들 사이의 유사성을 추론할 필요가 있을 것입니다.B3:B60
직접 공식을 작성합니다.
어떤 경우에도, 위의 어떤 것도 곧 사용할 수 없을 것입니다.xlrd
우선순위는 다른 곳에 있습니다.
업데이트: Excel 스프레드시트에서 셀과 종속성을 추출하여 파이썬 코드로 변환하는 것과 같은 정확한 작업을 수행하기 위해 작은 라이브러리를 구현했습니다.코드는 github에 있습니다, 패치를 환영합니다 :)
덧붙이자면, 당신은 항상 win32com을 사용하여 엑셀과 상호 작용할 수 있습니다(매우 빠르지는 않지만 작동합니다).이렇게 하면 공식을 얻을 수 있습니다.자습서는 [캐시된 복사본]에서 찾을 수 있으며 자세한 내용은 이 장 [캐시된 복사본]에서 확인할 수 있습니다.
기본적으로 다음을 수행합니다.
app.ActiveWorkbook.ActiveSheet.Cells(r,c).Formula
셀 종속성 표를 만드는 것과 관련하여, 까다로운 것은 엑셀 표현식을 구문 분석하는 것입니다.제가 정확히 기억한다면, 당신이 언급한 추적 코드가 항상 이것을 올바르게 수행하는 것은 아닙니다.제가 본 것 중 가장 좋은 것은 E.W. Bachtal의 알고리즘으로, 잘 작동하는 파이썬 구현을 사용할 수 있습니다.
그래서 저는 이것이 매우 오래된 게시물이라는 것을 알고 있지만, 저는 워크북의 모든 시트에서 공식을 가져올 수 있는 적절한 방법을 찾았고 새로 만들어진 워크북이 모든 서식을 유지하도록 했습니다.
첫 번째 단계는 .xlsx 파일의 복사본을 .xls로 저장하는 것입니다. 아래 코드의 파일 이름으로 .xls를 사용합니다.
Python 2.7 사용
from lxml import etree
from StringIO import StringIO
import xlsxwriter
import subprocess
from xlrd import open_workbook
from xlutils.copy import copy
from xlsxwriter.utility import xl_cell_to_rowcol
import os
file_name = '<YOUR-FILE-HERE>'
dir_path = os.path.dirname(os.path.realpath(file_name))
subprocess.call(["unzip",str(file_name+"x"),"-d","file_xml"])
xml_sheet_names = dict()
with open_workbook(file_name,formatting_info=True) as rb:
wb = copy(rb)
workbook_names_list = rb.sheet_names()
for i,name in enumerate(workbook_names_list):
xml_sheet_names[name] = "sheet"+str(i+1)
sheet_formulas = dict()
for i, k in enumerate(workbook_names_list):
xmlFile = os.path.join(dir_path,"file_xml/xl/worksheets/{}.xml".format(xml_sheet_names[k]))
with open(xmlFile) as f:
xml = f.read()
tree = etree.parse(StringIO(xml))
context = etree.iterparse(StringIO(xml))
sheet_formulas[k] = dict()
for _, elem in context:
if elem.tag.split("}")[1]=='f':
cell_key = elem.getparent().get(key="r")
cell_formula = elem.text
sheet_formulas[k][cell_key] = str("="+cell_formula)
sheet_formulas
사전 'sheet_formula'의 구조
{'Worksheet_Name': {'A1_cell_reference':'cell_formula'}}
예 결과:
{u'CY16': {'A1': '=Data!B5',
'B1': '=Data!B1',
'B10': '=IFERROR(Data!B12,"")',
'B11': '=IFERROR(SUM(B9:B10),"")',
xlrd로 당신이 원하는 것을 하는 것은 지금 불가능한 것 같습니다.필요한 기능을 구현하는 것이 왜 그렇게 어려운지에 대한 자세한 설명은 이 게시물을 참조하십시오.
개발팀은 python-excel 구글 그룹에서 지원을 위해 훌륭한 일을 하고 있습니다.
이 게시물이 조금 늦은 건 알지만, 여기서 다루지 않은 제안이 하나 있습니다.워크시트에서 모든 항목을 잘라내고 특수 붙여넣기(OpenOffice)를 사용하여 붙여넣습니다.이렇게 하면 수식이 숫자로 변환되므로 추가 프로그래밍이 필요하지 않으며 작은 워크북에 적합한 솔루션입니다.
네! win32com은 저에게 적합합니다.
import win32com.client
Excel = win32com.client.Dispatch("Excel.Application")
# python -m pip install pywin32
file=r'path Excel file'
wb = Excel.Workbooks.Open(file)
sheet = wb.ActiveSheet
#Get value
val = sheet.Cells(1,1).value
# Get Formula
sheet.Cells(6,2).Formula
언급URL : https://stackoverflow.com/questions/4690423/get-formula-from-excel-cell-with-python-xlrd
'programing' 카테고리의 다른 글
Oracle, 문자열에 선행 0 추가(숫자가 아님) (0) | 2023.04.29 |
---|---|
Angular에서 라우팅 경로를 통해 데이터 전송 (0) | 2023.04.29 |
Angular CLI에서 구성 요소의 이름을 변경하는 방법은 무엇입니까? (0) | 2023.04.29 |
Excel/VB 함수 오류: "일정한 식을 입력해야 합니다." (0) | 2023.04.29 |
스위프트에서 배열을 섞으려면 어떻게 해야 합니까? (0) | 2023.04.29 |