用Python填充Excel文件时日期混乱

3 投票
1 回答
1429 浏览
提问于 2025-04-17 18:00

这是一个过程,

我有一个叫做模板的xlsm文件,里面有一个工作表叫数据。

然后我有5个Csv文件,我必须把所有Csv文件的内容放到数据工作表里。

这样做没有问题,但如果日期是“07/09/12”,在Excel里会变成“09/07/12”。

所以我有一个叫做数据的列表,这里是它的一行的打印内容:

['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里是颠倒的(它不是显示美国格式,而是显示欧洲格式,月份和日期颠倒了,比如3月10日变成了9月3日,我用“长日期”格式测试过)。

奇怪的是:包含日期的Excel单元格设置为“标准”,但一旦被我的Python脚本填充后,它就变成了“日期”。

解决方法:在填充工作表时,我会拦截每个日期并将它们转换为日期时间格式,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 个回答

2

除非你告诉Excel,否则它会试图“聪明”地处理日期,这意味着它会猜测日期的格式以及如何显示转换后的日期。

在几乎所有情况下,你都不希望这样。因为这样的文件在不同日期格式的电脑上显示会不一样,或者当用户更改了操作系统的默认设置时(甚至有些美国人更喜欢用日/月/年而不是标准的月/日/年)。

所以正确的做法是使用datetime而不是字符串值。这样做是有效的,因为win32com内部的COM框架会把Python的datetime对象转换成对应的Excel日期对象,并且会正确设置格式。

撰写回答