2016-09-18 9 views
0

Я пытаюсь получить полную формулу из Excel файла Я перепробовал много способов, но все получить для меня значениепитона: получить полную формулу от первенствуешь, используя xlrd

Мне нужны полная формула, которая находится в клетка, а не значение самой

Я использую питон с xlrd

есть ли функция, которую я могу использовать? или есть все равно?

Большого спасибо

+0

Попробуйте использовать модуль 'openpyxl'. Он позволяет загружать файл excel, сохраняя формулы в виде формул, а не вычисляемых ячеек. – Abdou

+0

Я уже построил всю свою работу с xlrd, я предпочитаю, если есть какой-либо способ с xlrd, чем изменить всю мою работу на openpyxl , если это единственное решение, то я перейду к openpyxl, но действительно предпочитаю что-то с xlrd –

+0

xlrd has класс под названием Name, который должен это сделать, но я не уверен, как создать экземпляр с помощью книги. Попробуйте и посмотрите на это. – Abdou

ответ

1

Так что я знаю, что это очень старый пост, но я нашел достойный способ получения формул из всех листов в книге, а также с вновь созданной рабочей книга сохраняет все форматирование.

Первый шаг, чтобы сохранить копию файла .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 

структура словаря

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

Пример результатов '' sheet_formulas:

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