как извлечь данные из одной книги excel и вывести в другую, используя python xlrd/xlwt?

Я пытаюсь написать скрипт, который автоматизирует копирование/вставку табелей учета рабочего времени сотрудников из нескольких файлов в один скомпилированный файл. Поскольку это табели учета рабочего времени с кодами проектов, некоторые ячейки остаются пустыми, если сотрудник в тот день работал над другим проектом. Также файлы были преобразованы из xlsx (2007) в .csv.xls, который xlrd, кажется, открывается очень хорошо.

Я знаю, как открыть и создать объект книги, но мои знания об этом модуле очень ограничены, поэтому я подумал, что может быть полезен общий алгоритм:

import xlrd, xlwt

put all following in for or while loop to iterate through files:
book = xlrd.open_workbook('mybook.csv.xls')
extract data; store data for ouput
use for loop to iterate over data, output to final sheet
open next file, repeat process storing each output below the previous

Я ищу все, что поможет мне найти ответы, а не только код. Любая помощь будет оценена по достоинству. Спасибо.


person Corey    schedule 01.06.2011    source источник
comment
Также я пытаюсь прочитать столбцы {A:T} и строки {3:27}, которые включают типы str и float. Я почти уверен, что список со строкой типа для существующих значений и nan или null для любого пустого места будет легко работать.   -  person Corey    schedule 01.06.2011
comment
Для чтения/записи файлов xlsx в Python используйте openpyxl (bitbucket.org/ericgazoni/openpyxl/downloads ). Однако реальное решение состоит в том, чтобы перестать заставлять сотрудников хранить свои табели учета рабочего времени в файлах Excel!   -  person Steven Rumbalski    schedule 01.06.2011
comment
Конечно. Спасибо, я проверю openpyxl. Кроме того, я уже проработал большую часть этой проблемы, так что, если вы действительно этого не хотите; дополнительная информация не требуется, но спасибо!   -  person Corey    schedule 01.06.2011


Ответы (2)


Это может помочь ... он воспроизводит ваши данные как можно точнее (даты остаются как даты, пустые ячейки не становятся текстовыми ячейками с содержимым нулевой длины, логические значения и ячейки ошибок не становятся числовыми ячейками).

from xlrd import XL_CELL_EMPTY, XL_CELL_TEXT, XL_CELL_NUMBER,
    XL_CELL_DATE, XL_CELL_BOOLEAN, XL_CELL_ERROR, open_workbook
from xlwt import Row, easyxf, Workbook

method_for_type = {
    XL_CELL_TEXT:    Row.set_cell_text,
    XL_CELL_NUMBER:  Row.set_cell_number,
    XL_CELL_DATE:    Row.set_cell_number,
    XL_CELL_ERROR:   Row.set_cell_error,
    XL_CELL_BOOLEAN: Row.set_cell_boolean,
    }

date_style = easyxf(num_format_str='yyyy-mm-dd')
other_style = easyxf(num_format_str='General')

def append_sheet(rsheet, wsheet, wrowx=0):
    for rrowx in xrange(rsheet.nrows):
        rrowvalues = rsheet.row_values(rrowx)
        wrow = wsheet.row(wrowx)
        for rcolx, rtype in enumerate(rsheet.row_types(rrowx)):
            if rtype == XL_CELL_EMPTY: continue
            wcolx = rcolx
            wmethod = method_for_type[rtype]
            wstyle = date_style if rtype == XL_CELL_DATE else other_style
            wmethod(wrow, wcolx, rrowvalues[rcolx], wstyle) 
        wrowx += 1
    return wrowx

if __name__ == '__main__':
    import sys, xlrd, xlwt, glob
    rdpattern, wtfname = sys.argv[1:3]
    wtbook = Workbook()
    wtsheet = wtbook.add_sheet('guff')
    outrowx = 0
    for rdfname in glob.glob(rdpattern):
        rdbook = open_workbook(rdfname)
        rdsheet = rdbook.sheet_by_index(0)
        outrowx = append_sheet(rdsheet, wtsheet, outrowx)
        print outrowx
    wtbook.save(wtfname)
person John Machin    schedule 04.06.2011
comment
На самом деле я собирался написать вам по электронной почте! .csv.xls — это расширение, данное файлу, который был преобразован из xl2007 в CSV путем сохранения с использованием расширения .csv. Я надеялся, что связался с вами, чтобы попробовать бета-версию 2007 года, xlsxrd, поскольку все файлы, которые я мы имеем дело с 2007 годом. Это было бы здорово для всего отдела, так как мы почти все являемся пользователями Python! Также я пробовал openpyxl, но мне (новичку) было легче понять xlrd и начать использовать с более полным документом. Если возможно, это было бы очень приятно. - person Corey; 06.06.2011
comment
@Corey: я пришлю вам бета-версию xlsxrd, как только узнаю ваш адрес электронной почты. - person John Machin; 06.06.2011
comment
вкпапин | mtu.edu, спасибо большое! мы будем использовать его с пользой. - person Corey; 06.06.2011

Я создаю класс с именем функции excel для xlutils, xlrd и xlwt, который я мог бы в конечном итоге сделать библиотекой. Если вы заинтересованы в помощи, я пытаюсь сделать функцию удаления листа.

Возможно, вы захотите перейти к openpyxl и/или pyexcel, потому что они проще и имеют для этого функции.

Вот как скопировать с помощью openpyxl: Копировать весь рабочий лист с помощью openpyxl

Вот документация для pyexcel, который является оболочкой для xlwt, xlrd и xlutils: https://pyexcel.readthedocs.io/en/latest/

Если вы хотите извлечь данные из одной книги Excel и вывести их в другую, вам следует использовать createCopy(исходная книга, другая книга, исходное имя файла, новое имя файла)

import xlwt
import xlrd
import xlutils.copy
import xlutils class excelFunctions():

def getSheetNumber(self, fileName, sheetName):

    # opens existing workbook
    workbook = xlrd.open_workbook(fileName, on_demand=True)

    #turns sheet name into sheet number       
    for index, sheet in enumerate(workbook.sheet_names()):
        if sheet == sheetName:
            return index


def createSheet(self, fileName, sheetName):

    # open existing workbook
    rb = xlrd.open_workbook(fileName, formatting_info=True, on_demand=True)

    # make a copy of it
    wb = xl_copy(rb)

    # creates a variable called sheets which stores all the sheet names
    sheets = rb.sheet_names()

    # creates a string which is equal to the sheetName user input
    str1 = sheetName

    # checks to see if the given sheetName is a current sheet
    if (str1 not in sheets):

        # add sheet to workbook with existing sheets
        Sheet = wb.add_sheet(sheetName)

        # save the sheet with the same file name as before
        wb.save(fileName)

    else:
        # this declares the sheet variable to be equal to the sheet name the user gives
        sheet = wb.get_sheet(self.getSheetNumber(fileName, sheetName))

        # save the sheet with the same file name as before
        wb.save(fileName)



def createCopy(self, fileName, fileName2, sheetName, sheetName2):


    # open existing workbook
    rb = xlrd.open_workbook(fileName, formatting_info=True)

    # defines sheet as the name of the sheet given
    sheet = rb.sheet_by_name(sheetName)

    # makes a copy of the original sheet
    wb = xl_copy(rb)

    # creates an int called column_count which is equal to the sheets maximum columns 
    column_count = sheet.ncols - 1

    # creates a blank array called stuff
    Stuff = []

    # this loops through adding columns from the given sheet name
    for i in range (0, column_count):
        Stuff.append([sheet.cell_value(row, i) for row in range(sheet.nrows)])

    # create a sheet if there is not already a sheet    
    self.createSheet(fileName, sheetName2)

    # defines sheet as the new sheet
    sheet = wb.get_sheet(self.getSheetNumber(fileName, sheetName2))

    # this writes to the sheet
    for colidx, col in enumerate(Stuff):
        for rowidx, row in enumerate(col):
            sheet.write(rowidx, colidx, row)

    # this saves the file
    wb.save(fileName2)
person Nick M.    schedule 30.06.2016
comment
Здравствуйте, Ник, извините за поздний ответ... Я только что зарегистрировался здесь сегодня, и, видимо, это было какое-то время, невероятно долгое время. Как ты поживаешь? вы продолжали свои усилия? В данный момент я стряхиваю пыль с Python, и мне было бы интересно услышать от вас... моя электронная почта все та же и находится в комментариях выше... (слишком поздно, чтобы отменить эту часть гениальности) - person Corey; 04.11.2016