Я использую этот код:

import xlrd
import csv

with xlrd.open_workbook('iSolar Transactions (CURRENT).xlsm') as wb:
    sh = wb.sheet_by_index(2)  # or wb.sheet_by_name('name_of_the_sheet_here')
    with open('client_history.csv', 'wb') as f:
        c = csv.writer(f)
        for r in range(sh.nrows):
            c.writerow(sh.row_values(r))

Он создает копию достаточно хорошо, но не копирует форматирование столбцов. Например, date столбец 2017-04-21 копируется как число 41562. Есть ли способ скопировать через форматирование тоже?

РЕДАКТИРОВАТЬ: Используя код Tiny.D:

import xlrd
import csv
from datetime import datetime

with xlrd.open_workbook('iSolar Transactions (CURRENT).xlsm') as wb:
    sh = wb.sheet_by_index(2)  # or wb.sheet_by_name('name_of_the_sheet_here')
    column_date = 4 #suppose the first column in your work book is date    
    with open('client_history.csv', 'wb') as f:
        c = csv.writer(f)
        for r in range(1,sh.nrows):
            year, month, day= xlrd.xldate_as_tuple(int(sh.row_values(r)[column_date]), wb.datemode) 
            py_date = datetime(year, month, day)
            c.writerow([py_date]+sh.row_values(r)[1:])

Я получаю эту ошибку:

Traceback (most recent call last):
  File "C:/Users/warren.si/Dropbox/iShack/Records/#04 Field Operations/#01 client recruitment & management/Client Database/#09 Client Accounts/client_history_tocsv3.py", line 11, in <module>
    year, month, day= xlrd.xldate_as_tuple(int(sh.row_values(r)[column_date]), wb.datemode)
ValueError: too many values to unpack
0
warrenfitzhenry 24 Апр 2017 в 10:38

2 ответа

Лучший ответ

Вы можете использовать xldate_as_tuple, ниже приведена исправленная версия, основанная на ваш код:

import xlrd
import csv
from datetime import datetime

with xlrd.open_workbook('iSolar Transactions (CURRENT).xlsx') as wb:
    sh = wb.sheet_by_index(2)  # or wb.sheet_by_name('name_of_the_sheet_here')
    column_date = 4 #suppose the 5th column in your work book is date    
    with open('client_history.csv', 'wb') as f:
        c = csv.writer(f)
        c.writerow(sh.row_values(0)) # write header to csv
        for r in range(1,sh.nrows):
            year, month, day, hour, minute, sec = xlrd.xldate_as_tuple(int(sh.row_values(r)[column_date]), wb.datemode) #unpack all values here, not just year, month, day
            py_date = datetime(year, month, day, hour, minute)
            c.writerow(sh.row_values(r)[:3]+[py_date] + sh.row_values(r)[5:])
1
Tiny.D 24 Апр 2017 в 09:03

Вы можете использовать xldate_as_datetime для преобразования в формат даты и времени Python:

In [4]: xlrd.xldate.xldate_as_datetime(41562, 1)
Out[4]: datetime.datetime(2017, 10, 16, 0, 0)

Рекомендации:

http://xlrd.readthedocs.io/en/latest/api.html#xlrd.xldate.xldate_as_datetime http://xlrd.readthedocs.io/en/latest/dates.html

1
Dekel Paz 24 Апр 2017 в 07:48
43582320