So weiß ich, das ist eine sehr alte Post, aber ich fand die Formeln aus allen Blättern in einer Arbeitsmappe sowie mit dem neu erstellen Arbeitsmappe alle Formatierungen das Erhaltens behält eine anständige Art und Weise.
Erster Schritt ist eine Kopie Ihrer .xlsx-Datei als .xls speichern - Verwenden Sie die .xls als Dateiname in dem folgenden Code
Python Verwenden von 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
Struktur Wörterbuch 'sheet_formulas'
{'Worksheet_Name': {'A1_cell_reference':'cell_formula'}}
Beispielergebnisse:
{u'CY16': {'A1': '=Data!B5',
'B1': '=Data!B1',
'B10': '=IFERROR(Data!B12,"")',
'B11': '=IFERROR(SUM(B9:B10),"")',
Versuchen Sie das 'openpyxl' Modul zu benutzen. Sie können die Excel-Datei laden, indem Sie Formeln als Formeln und nicht als berechnete Zellen speichern. – Abdou
Ich habe bereits alle meine Arbeit mit xlrd, ich bevorzuge, wenn es irgendeine Möglichkeit mit xlrd als alle meine Arbeit zu openpyxl ändern, wenn dies die einzige Lösung ist dann werde ich auf openpyxl verschieben, aber wirklich etwas mit xlrd –
xlrd haben eine Klasse namens Name, die das tun soll, aber ich bin mir nicht sicher, wie man sie mit einer Arbeitsmappe instanziiert. Probieren Sie es aus und schauen Sie sich das an. – Abdou