OpenPyXl, как отформатировать ячейку как дату - PullRequest
0 голосов
/ 18 марта 2020

У меня проблема с отчетом, который я читаю с openpyxl. Иногда форматы ячеек в файле, который я получаю, неверны, и вместо «10.03.2020» (формат ячейки Дата) я получаю «43900,88455» (формат ячейки «Общие»).

Я пробовал Google, документацию openpyxl и StackOverflow, но это не приблизило меня к решению. Не могли бы вы помочь и посоветовать, как переключить формат ячейки на Короткую дату, пожалуйста?

Ниже не сработало, я пробовал много других идей, но все еще в тупике. Мне нужны правильные даты для других операций в этом скрипте.

    def sanitizeDates(self):
        # pass
        for i in range(3, self.fileLength-1):
            self.mainWs.cell(i, 4).number_format = 'dd/mm/yyyy'
            self.mainWs.cell(i, 16).number_format = 'dd/mm/yyyy'

Копировать комментарий : Итак, я попытался

print("Cell (4) type is: " + str(type(self.mainWs.cell(i, 4).value)) + " and current value is " + str(self.mainWs.cell(i, 4).value)) 
print("Cell (16) type is: " + str(type(self.mainWs.cell(i, 16).value)) + " and current value is " + str(self.mainWs.cell(i, 16).value))

, что приводит к ячейке ( 4) тип: <class 'datetime.datetime'> и текущее значение 2020-03-10 22:41:41
Тип ячейки (16): <class 'float'> и текущее значение 43900.9475
Excel отображает его как "General" = "43900,88455"

1 Ответ

0 голосов
/ 20 марта 2020

Итак, я все понял. @stovfl спасибо за ваши подсказки, это привело меня к мысли, что искать и, как следствие, как решить мою проблему.

Оригинальный поток в StackOverflow доступен здесь: https://stackoverflow.com/a/29387450/5210159

Ниже приведен рабочий код:

   def sanitizeDates(self):
        for i in range(3, self.fileLength - 1):
            # Check which cells should be sanitized and proceed
            if isinstance(self.mainWs.cell(i, 4).value, float) and isinstance(self.mainWs.cell(i, 16).value, float):
                print(str(self.mainWs.cell(i, 4).value) + " / " + str(self.mainWs.cell(i, 16).value) + " -> " + str(self.convertDate(self.mainWs.cell(i, 4).value)) + " / " + self.convertDate(self.mainWs.cell(i, 16).value))
                self.mainWs.cell(i, 4).value = self.convertDate(self.mainWs.cell(i, 4).value)
                self.mainWs.cell(i, 16).value = self.convertDate(self.mainWs.cell(i, 16).value)
            elif isinstance(self.mainWs.cell(i, 4).value, float):
                print(str(self.mainWs.cell(i, 4).value) + " -> " + str(self.convertDate(self.mainWs.cell(i, 4).value)))
                self.mainWs.cell(i, 4).value = self.convertDate(self.mainWs.cell(i, 4).value)
            elif isinstance(self.mainWs.cell(i, 16).value, float):
                print(str(self.mainWs.cell(i, 16).value) + " -> " + str(self.convertDate(self.mainWs.cell(i, 16).value)))
                self.mainWs.cell(i, 16).value = self.convertDate(self.mainWs.cell(i, 16).value)


    def convertDate(self, dateToConvert):
        # Thank you, StackOverflow <3
        # https://stackoverflow.com/questions/29387137/how-to-convert-a-given-ordinal-number-from-excel-to-a-date
        epochStart = datetime(1899, 12, 31)
        if dateToConvert >= 60:
            dateToConvert -= 1  # Excel leap year bug, 1900 is not a leap year
        return epochStart + timedelta(days=dateToConvert)

После выполнения я получаю следующие результаты:

43899.89134259259 -> 2020-03-09 21:23:32

43900.9475 -> 2020-03-10 22:44:24
...