使用应用的数字格式openpyxl读取单元格值? - redux

时间:2017-02-01 21:25:29

标签: python excel openpyxl

Python 2.7,openpyxl 2.4.x

我试图在Excel中读取一个日期值(" 05/01/2016")并且已应用自定义数字格式的单元格(" yyyymm")所以它显示为" 201605"。我想要最终得到的是应用自定义数字格式后的值(即用户在excel中看到的内容(" 201605"))。知道如何使用openpyxl做到这一点?

注意:我不能简单地将日期重新格式化为yyyymm,因为用户可能会更改自定义格式,我需要应用自定义格式后的最终结果。那么也许在openpyxl中可以在读取的单元格中应用自定义格式?

我意识到这与这篇文章(similar question)非常相似,但我并不确定如何在我的环境中应用它

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

没有实施。 您正在寻找的是cell.number_format。 请尝试以下方法:

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

在您需要格式化cell.value的时候:

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

使用Python测试:3.4.2 - openpyxl:2.4.1 - LibreOffice:4.3.3.2