使用python填充excel文件会弄乱我的日期

时间:2013-03-05 13:46:33

标签: python excel python-2.7

这是过程, 我在名为data的工作表中有一个名为template的xlsm文件。 然后我有5个Csv文件,我必须将所有csv文件的内容放在数据工作表中。

没问题,除非日期是“07/09/12”,否则它将成为excel中的“09/07/12”。

所以我有一个名为data的列表,这里是其中一行的打印

['07/09/12', 'LARO', 'MEDITERRAN', '245', 'UZES', '11', '0', '0', '0', '0', '11', '0']

我正在使用这段代码放入excel文件:

首先我打开文件(xl是因为我使用“with self as xl”)

def open(self):
    self.xl.Visible = 1
    self.xl.ScreenUpdating = False
    self.worksheet = self.xl.Workbooks.Open(self.getOutputFile())

然后我删除了数据工作表

def cleanData(self):
    sheet = self.xl.Sheets(self.sheetName)
    def findNumberOfLines(start_line):
        nb = 0
        while sheet.Cells(start_line + nb, self.startColumn).Value is not None:
            nb += 1
        return nb

然后我填写数据

def fillData(self):
    sheet = self.xl.Sheets(self.sheetName)
    noRow = self.startLine
    for row in self.data:
        noCol = self.startColumn
        for i, value in enumerate(row):
            sheet.Cells(noRow, noCol).Value = value
            noCol+=1
        noRow+=1

我保存

def save(self):
    self.worksheet.Save()

除了日期和月份在excel中反转之外,所有情况都很好(它没有显示美国格式,它显示欧元格式,月和日倒置(10月3日变为9月3日,使用“长日期”格式测试)

奇怪的是:包含日期的excel单元格设置为“标准”但是一旦它被我的python脚本提交,它就被设置为“date”

解决方法 填写表格时,我会截取每个日期并进行转换 到datetime,excel似乎喜欢那个

def fillData(self):
    sheet = self.xl.Sheets(self.sheetName)
    noRow = self.startLine
    pattern = re.compile('^\d+/\d+/\d+$')
    for row in self.data:
        noCol = self.startColumn
        for i, value in enumerate(row):

            if (pattern.match(str(value))):
                date = value.rsplit('/')
                sheet.Cells(noRow, noCol).Value = datetime(int(date[2]), int(date[1]), int(date[0]))
            else: sheet.Cells(noRow, noCol).Value = value
            noCol+=1
        noRow+=1

1 个答案:

答案 0 :(得分:2)

除非你告诉Excel,否则它会尝试使用日期“智能”,这意味着它会猜测格式是什么以及如何显示转换日期。

几乎在所有情况下,你都不希望如此。这些文件在具有不同日期格式的计算机上或用户更改操作系统默认值时会以不同方式显示(甚至一些美国人更喜欢DD / MM / YY而非标准MM / DD / YY)。

所以正确的解决方案是datetime而不是字符串值。这很有效,顺便说一下。因为win32com内的COM框架会将Python datetime对象转换为相应的Excel日期对象,并正确设置格式。