В прошлой статье я рассмотрел пример консолидации данных файлов папки, содержащей множество однотипных файлов Excel в Питоне. При этом прототипом программы на Питоне для меня послужила моя программа на VBA. В ней я открываю один из файлов Excel, и по нему произвожу настройки диапазона выборки данных на конкретном листе. Пока в Питоне я понял, что организация диалога намного сложнее или может быть непривычней. Во всяком случае, я пока плотно не занимался этим. Предыдущая программа работает быстро и без ошибок. Один минус. Не переносятся стили из файла шаблона или одного из файлов Excel с данными . По запросу в Яндексе я нашёл статью по сохранению форматирования при обработке файлов Excel в Питоне
Я использовал часть предложенного кода в новой версии программы. Сегодня я проверил работоспособность новой программы консолидации данных с сохранением стилей и форматирования. Всё работает, но не всегда, как бы хотелось. Все данные для программы консолидации находятся в предыдущей статье.
Какие возникли опять проблемы?
- Выдавалась ошибка при чтении файлов нового формата XLSX, и программа снималась. Поэтому все файлы я переводил в формат 2003.
- Форматы и стили в изменяемых ячейках выходного файла почему-то сохранились не все, а выборочно.
import xlrd
from xlrd import open_workbook
import sys
import os
from array import *
Это кусок взят из файла, сохранющего стили при копировании
import xlutils.copy
mypath=”C:\Python 3_7\Списокфайлов\File_XlsПосещаемостьмарт_2019″
inBook = xlrd.open_workbook(‘C:\Python 3_7\Списокфайлов\Консолидация_Шаблон.xls’, formatting_info=True)
outBook = xlutils.copy.copy(inBook)
def _getOutCell(outSheet, colIndex, rowIndex):
HACK: Extract the internal xlwt cell representation.
row = outSheet._Worksheet__rows.get(rowIndex)
if not row:
return None
cell = row._Row__cells.get(colIndex)
return cell
def setOutCell(outSheet, row, col, value):
Change cell value without changing formatting.”’
# HACK to retain cell style.
previousCell = _getOutCell(outSheet, row, col)
# END HACK, PART I
outSheet.write(row, col, value) # HACK, PART II
if previousCell:
newCell = _getOutCell(outSheet, row, col)
if newCell:
newCell.xf_idx = previousCell.xf_idx # END HACK
outSheet = outBook.get_sheet(0)
data = array(‘i’,[0,0,0,0,0,0,0,0])
print(len(data))
for k in range(0,8):
print(data[k])
wbk = xlwt.Workbook(‘utf-8’)
ws=wbk.add_sheet(‘Консолидация_данных’)
Хранение считанных значений для суммирования
kol=0
for rootdir, dirs, files in os.walk(mypath):
for file in files:
kol+=1
file1=(os.path.join(rootdir, file))
#print("kol=",kol , "Файл-", file1)
wb=open_workbook(file1,formatting_info=True)
s= wb.sheet_by_index(0)
k=0
for m in range(3,7):
for n in range(3,5):
value1=int(s.cell(m,n).value)
data[k]=data[k]+value1
k=k+1
print(“Всего обработано файлов для суммирования – “, kol)
Вывод сумм для проверки
print(“\n”*2)
print(“Итоговые суммы после обработки фсех файлов для переноса в результирующий файл “)
for k in range(0,8):
print(data[k])
Перенос итоговых сумм в файл
k=0
for i in range(3,7):
for j in range(3,5):
value1=int(str(data[k]))
setOutCell(outSheet, i,j,value1)
k+=1
outBook.save(‘output.xls’)