Python xlsxwriter преобразует дату в число при написании xlsx - PullRequest
0 голосов
/ 26 апреля 2018

Мне нужно экспортировать таблицу базы данных в формат Excel (xlsx).

Я узнал, что Python очень быстро обрабатывает файлы.

Я установил python 3.6.1, XlsxWriter-1.0.2 и cx_Oracle-5.3-12c

Но я увидел, что поле даты из базы данных преобразуется в число. Чтобы решить эту проблему, я проверил, является ли значение списка \ (ячейка) значением даты и времени, если да, то отформатировал значение в тип даты, что решает мою проблему

Но теперь я сталкиваюсь с проблемой производительности при этой дополнительной проверке, при любом предложении, как повысить производительность

Ниже функция python используется для генерации Excel XLSX из курсора базы данных

#Function to write excel from Oracle Cursor
def writeToExcel(cur_sor, targetDir, export_file_name):
    Actual_Path = os.path.join(targetDir, export_file_name)

    #Array to capture Date type columns
    DateTimeColumns = []

    print('\t\t\t  writing: '+export_file_name+'\t\t\t\t'+str(datetime.datetime.now()))
    workbook = xlsxwriter.Workbook(Actual_Path)  # Create Excel Object for new workbook
    worksheet = workbook.add_worksheet(sourceSYS)  # Add a New Worksheet Name - scott_schema
    row = 0
    col = 0

    for i in range(len(cur_sor.description)):
        desc = cur_sor.description[i]

        #Only Data Type column will be capture
        if format(desc[1])== "<class 'cx_Oracle.TIMESTAMP'>":
            DateTimeColumns.append(i)

        bold = workbook.add_format({'bold': True})
        date_format = workbook.add_format({'num_format': 'dd/mm/yy'})
        worksheet.write(row, (col + i), format(desc[0]), bold)  # Iterate for column headers

    date_format = workbook.add_format({'num_format': 'dd/mm/yy'})
    color_format = workbook.add_format()
    color_format.set_font_color('red')
    row = row + 1

    #Loop for each row, return by database cursor
    for tupple_row in cur_sor:
        col = 0
        #Loop for each column, for particular row open in level-up cursor
        for list_item in tupple_row:

            #If column position matches with datetype column position
            if col in DateTimeColumns:
                #Check if the cell value is date type, additional check to handle "None" (blank date cell)
                if isinstance(list_item, datetime.date) or isinstance(list_item, datetime.datetime) \
                    or isinstance(list_item, datetime.time) or isinstance(list_item, datetime.timedelta):
                    #Format the date, inorder to save as date rather number
                    worksheet.write(row, col, list_item.strftime("%Y-%b-%d %H:%M:%S.%f"))
            else:
                worksheet.write(row, col, list_item)

            col = col + 1
        row = row + 1

    workbook.close()

1 Ответ

0 голосов
/ 26 апреля 2018

Вы должны прочитать документы http://xlsxwriter.readthedocs.io/working_with_dates_and_time.html

Работа с датами и временем Даты и время в Excel представлены действительными числами, например, «1 января 2013 г., 12:00» обозначено числом 41275,5.

В целой части числа хранится количество дней с начала эпохи, а в дробной части - процентное соотношение дня.

Дата или время в Excel такие же, как и у любого другого числа. Чтобы отобразить число в качестве даты, к нему необходимо применить числовой формат Excel

Можете ли вы поделиться кодом, чтобы я мог лучше помочь с вашей проблемой производительности?

...