Mam problem z raportem, który czytam z Openpyxl. Czasami formaty komórkowe w pliku, które otrzymuję, nie są poprawne, a zamiast "10.03.2020" (data formatu komórkowego) dostaję "43900,88455" (ogniwo generalne).

Próbowałem Google, dokumentacji otworu i stackoverflow, ale to nie przyniosło mi bliżej rozwiązania. Czy mógłbyś pomóc i doradzić, jak zmienić format komórki na krótką datę?

Poniżej nie działał, próbowałem wielu innych pomysłów, ale wciąż w martwym końcu. Potrzebuję poprawnych dat dla innych operacji w tym skrypcie.

    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'

Kopiuj komentarz : Próbowałem

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))

Wyniki to typu komórki (4) to: <class 'datetime.datetime'> i wartość bieżąca jest 2020-03-10 22:41:41
Typ komórki (16) to: <class 'float'> i wartość bieżąca to 43900.9475
Excel Wyświetla go jako "General" = "43900,88455"

0
NewBe 18 marzec 2020, 19:02

1 odpowiedź

Najlepsza odpowiedź

Więc wymyśliłem to w końcu. @stovfl Dzięki za swoje wskazówki, doprowadziło to do pomysłu, czego szukać iw rezultacie, jak rozwiązać mój problem.

Oryginalny wątek na stackoverflow jest dostępny tutaj: https://stackoverflow.com/a/29387450/5210159

Poniżej znajduje się kod pracy:

   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)

Po wykonaniu otrzymuję następujące wyniki:

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

43900.9475 -> 2020-03-10 22:44:24
0
NewBe 20 marzec 2020, 09:20