Как извлечь данные из одной книги 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
Я ищу все, что поможет мне найти ответы, а не только код. Любая помощь будет оценена. Благодарю.
2 ответа
Это может помочь... он воспроизводит ваши данные настолько близко, насколько это возможно (даты остаются в виде дат, пустые ячейки не становятся текстовыми ячейками с содержимым 0-длины, логические и ошибочные ячейки не становятся числовыми ячейками).
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)
Я создаю класс под названием функции Excel для xlutils, xlrd и xlwt, который в конечном итоге мог бы создать библиотеку. Если вы заинтересованы в помощи, я пытаюсь сделать функцию удаления листа.
Возможно, вы захотите перейти к openpyxl и / или pyexcel, потому что они проще и имеют функции для этого.
Вот как копировать используя open pyxl: Скопируйте весь лист с помощью 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)