Lesen von Zellenwert mit angewandtem Zahlenformat openpyxl? – redux

Python 2.7, openpyxl 2.4.x

Ich versuche, eine Zelle zu lesen, die ein Datumswert ("05/01/2016") in Excel ist und eine benutzerdefinierte Nummernformatierung angewendet hat ("yyyymm"), so dass sie als "201605" angezeigt wird. Was ich am Ende möchte, ist der Wert, nachdem die benutzerdefinierte Nummernformatierung angewendet wurde (dh was der Benutzer in Excel sieht ("201605")). Irgendeine Idee, wie man das mit openpyxl macht?

Anmerkung: Ich kann nicht einfach nur das Datum nehmen und es neu formatieren, um yyyymm, wie der Benutzer die benutzerdefinierte Formatierung ändern könnte und ich brauche, was das Endergebnis ist, nachdem das benutzerdefinierte Format angewendet wird. Vielleicht gibt es einen Weg in openpyxl, um die benutzerdefinierte Formatierung in Zellen, die gelesen werden, anzuwenden?

Ich weiß, das ist sehr ähnlich zu diesem Beitrag ( ähnliche Frage ), aber ich war nicht ganz sicher, wie man es in meinem Umstand anwenden

Vielen Dank im Voraus für die Hilfe.

  • Xlrd - Fehler "Arbeitsmappe ist verschlüsselt", Python 3.2.3
  • Wie man dataframes aus einem Excel-Blatt mit vielen Tabellen (mit Python, möglicherweise Pandas)
  • Bearbeiten vorhandener Excel-Arbeitsmappen und Blätter mit xlrd und xlwt
  • Python XlsxWriter grenzt um mehrere Zellen
  • Berechnen von Excel-Blättern ohne Öffnen (openpyxl oder xlwt)
  • Geschützte Ansicht in Microsoft Excel 2010 und Python
  • One Solution collect form web for “Lesen von Zellenwert mit angewandtem Zahlenformat openpyxl? – redux”

    Es ist nicht implementiert. Was Sie suchen, ist cell.number_format. Versuchen Sie Folgendes:

    def pyDateFormat(nf): import re """Convert xlsx cell.number_format to Python date Format.""" #xlsx Format = 'YYYYMMDD', 'YYYY\\-MM\\-DD' #Python Format = '%Y%m%d' nf = re.sub(r'\\',r'',nf,0,re.IGNORECASE) #Remove Escapes nf = re.sub(r'([^Y]*)(Y+)(.*)',r'\1%Y\3',nf,0,re.IGNORECASE) #Change YYYY to %Y nf = re.sub(r'([^M]*)(M+)(.*)',r'\1%m\3',nf,0,re.IGNORECASE) #Change MM to %m nf = re.sub(r'([^D]*)(D+)(.*)',r'\1%d\3',nf,0,re.IGNORECASE) #Change DD to %d return nf #end def pyDateFormat 

    An der Stelle, die Sie benötigen die formated cell.value tun:

      cell = wb.ws['A1'] if cell.is_date: value = cell.value.date().__format__( pyDateFormat(cell.number_format) ) 

    Getestet mit Python: 3.4.2 – openpyxl: 2.4.1 – LibreOffice: 4.3.3.2

    Python ist die beste Programmiersprache der Welt.