python एक्सेल सेल से पाइथन xlrd के साथ सूत्र प्राप्त करें




excel formula (4)

मुझे एक्सेल शीट से पायथन कोड में एक एल्गोरिदम पोर्ट करना है, लेकिन मुझे एक्सेल फ़ाइल से एल्गोरिदम इंजीनियर करना होगा

एक्सेल शीट काफी जटिल है, इसमें कई कोशिकाएं हैं जिनमें सूत्र हैं जो अन्य कोशिकाओं को संदर्भित करते हैं (जिसमें एक सूत्र या स्थिर भी हो सकता है)।

मेरा विचार है कि एक अजगर लिपि के साथ विश्लेषण करना शीट बिल्डिंग कोशिकाओं के बीच निर्भरताओं की एक प्रकार की मेज, जो है:

ए 1 बी 4, सी 5, ई 7 फॉर्मूला पर निर्भर करता है: "= sqrt (बी 4) + सी 5 * ई 7"
ए 2 बी 5, सी 6 फॉर्मूला पर निर्भर करता है: "= पाप (बी 5) * सी 6"
...

xlrd पायथन मॉड्यूल एक xlrd कार्यपुस्तिका पढ़ने की अनुमति देता है लेकिन फिलहाल मैं एक सेल के मूल्य तक पहुंच सकता हूं, सूत्र नहीं।

उदाहरण के लिए, निम्नलिखित कोड के साथ मैं केवल एक सेल का मूल्य प्राप्त कर सकता हूं:

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 (...) विधि द्वारा लौटाई गई सेल ऑब्जेक्ट से फ़ॉर्मूल प्राप्त करने का कोई तरीका नहीं है। documentation वे कहते हैं कि फॉर्मूला का एक स्ट्रिंग संस्करण प्राप्त करना संभव है (अंग्रेजी में क्योंकि एक्सेल फ़ाइल में संग्रहीत फ़ंक्शन नाम अनुवाद के बारे में कोई जानकारी नहीं है)। वे नाम और ऑपरेंड कक्षाओं में सूत्रों (अभिव्यक्तियों) के बारे में बात करते हैं, वैसे भी मैं समझ नहीं पा रहा हूं कि इन कक्षाओं के उदाहरणों को सेल क्लास इंस्टेंस द्वारा कैसे प्राप्त किया जाए, जिसमें उन्हें शामिल होना चाहिए।

क्या आप एक कोड स्निपेट सुझा सकते हैं जो सेल से फॉर्मूला टेक्स्ट प्राप्त करता है?


तो मुझे पता है कि यह एक बहुत पुरानी पोस्ट है, लेकिन मुझे कार्यपुस्तिका में सभी चादरों के सूत्रों के साथ-साथ नव निर्मित कार्यपुस्तिका को सभी प्रारूपण बनाए रखने का एक अच्छा तरीका मिला।

पहला कदम है .xlsx फ़ाइल की एक प्रतिलिपि को .xls के रूप में सहेजना है - नीचे दिए गए कोड में फ़ाइल नाम के रूप में .xls का उपयोग करें

पायथन 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_formulas' का ढांचा

{'Worksheet_Name': {'A1_cell_reference':'cell_formula'}}

उदाहरण परिणाम:

{u'CY16': {'A1': '=Data!B5',
  'B1': '=Data!B1',
  'B10': '=IFERROR(Data!B12,"")',
  'B11': '=IFERROR(SUM(B9:B10),"")',

अपडेट करें : मैंने जो कुछ भी वर्णन किया है, वही करने के लिए मैंने एक छोटी लाइब्रेरी को चलाया है और लागू किया है: एक्सेल स्प्रेडशीट से कोशिकाओं और निर्भरताओं को निकालने और उन्हें पायथन कोड में परिवर्तित करना। कोड github पर है , पैच स्वागत है :)

बस यह जोड़ने के लिए कि आप win32com का उपयोग करके एक्सेल के साथ हमेशा बातचीत कर सकते हैं (बहुत तेज़ नहीं लेकिन यह काम करता है)। यह आपको फॉर्मूला प्राप्त करने की अनुमति देता है। एक ट्यूटोरियल यहां पाया जा सकता है और विवरण मिल सकते हैं इस पाठ में [कैश की गई प्रतिलिपि]

अनिवार्य रूप से आप बस करते हैं:

app.ActiveWorkbook.ActiveSheet.Cells(r,c).Formula

सेल निर्भरताओं की एक तालिका बनाने के लिए, एक मुश्किल चीज एक्सेल अभिव्यक्तियों को पार्स कर रही है। अगर मुझे सही याद है कि आपके द्वारा वर्णित ट्रेस कोड हमेशा यह सही तरीके से नहीं करता है। मैंने जो सबसे अच्छा देखा है वह ईडब्ल्यू बैचल द्वारा एल्गोरिदम है , जिसमें से एक पायथन कार्यान्वयन उपलब्ध है जो अच्छी तरह से काम करता है।


ऐसा लगता है कि xlrd के साथ आप जो करना चाहते हैं वह करना असंभव है। आप इस पोस्ट को विस्तृत विवरण के लिए देख सकते हैं कि आपको आवश्यक कार्यक्षमता को कार्यान्वित करना इतना कठिन क्यों है।

ध्यान दें कि डेवलपिंग टीम पायथन-एक्सेल Google समूह पर समर्थन के लिए एक महान काम करती है।


[डी] दावेदार: मैं xlrd के लेखक / रखरखाव हूँ।

सूत्र पाठ के लिए दस्तावेज़ संदर्भ "नाम" सूत्र हैं; दस्तावेज़ों की शुरुआत के पास "नामित संदर्भ, स्थिरांक, सूत्र, और मैक्रोज़" अनुभाग पढ़ें। ये सूत्र शीट-व्यापी या पुस्तक-व्यापी से जुड़े हैं; वे अलग-अलग कोशिकाओं से जुड़े नहीं हैं। उदाहरण: PI मानचित्र =Mktng!$A$2:$Z$99 , SALES मानचित्र =Mktng!$A$2:$Z$99 । नाम-फॉर्मूला डीकंपलर को परिभाषित नामों के सरल और / या सामान्य रूप से पाए गए उपयोगों के निरीक्षण के समर्थन के लिए लिखा गया था।

सामान्य रूप से सूत्र कई प्रकार के होते हैं: सेल, साझा, और सरणी (सभी सेल, सीधे या अप्रत्यक्ष रूप से जुड़े), नाम, डेटा सत्यापन और सशर्त स्वरूपण।

बाइटकोड से टेक्स्ट तक सामान्य सूत्रों को कम करना, धीरे-धीरे "कार्य-प्रगति" है। ध्यान दें कि यह मानते हुए कि यह उपलब्ध था, तब आपको सेल संदर्भों को निकालने के लिए पाठ सूत्र को पार्स करने की आवश्यकता होगी। Excel सूत्रों को सही ढंग से पार्स करना एक आसान काम नहीं है; एचटीएमएल के साथ, regexes का उपयोग करना आसान लग रहा है लेकिन काम नहीं करता है। फॉर्मूला बाइटकोड से सीधे संदर्भ निकालना बेहतर होगा।

यह भी ध्यान रखें कि सेल-आधारित सूत्र नामों का संदर्भ ले सकते हैं, और नाम सूत्र दोनों कक्षों और अन्य नामों को संदर्भित कर सकते हैं। इसलिए सेल-आधारित और नाम सूत्र दोनों से सेल और नाम संदर्भ दोनों निकालना आवश्यक होगा। साझा सूत्रों पर जानकारी रखने के लिए आपके लिए उपयोगी हो सकता है; अन्यथा निम्नलिखित पार्स किया गया है:

B2 =A2
B3 =A3+B2
B4 =A4+B3
B5 =A5+B4
...
B60 =A60+B59

आपको B3:B60 सूत्रों के बीच समानता को कम करने की आवश्यकता होगी।

किसी भी मामले में, उपर्युक्त में से कोई भी जल्द ही उपलब्ध नहीं होने की संभावना है - xlrd प्राथमिकताएं कहीं और झूठ बोलती हैं।







xlrd