Консолидация. Продолжение

Автор: | 22.04.2019

В прошлой статье я рассмотрел пример консолидации данных файлов папки, содержащей множество однотипных файлов Excel в Питоне. При этом прототипом программы на Питоне для меня послужила моя программа на VBA. В ней я открываю один из файлов Excel, и по нему произвожу настройки диапазона выборки данных на конкретном листе. Пока в Питоне я понял, что организация диалога намного сложнее или может быть непривычней. Во всяком случае, я пока плотно не занимался этим. Предыдущая программа работает быстро и без ошибок. Один минус. Не переносятся стили из файла шаблона или одного из файлов Excel с данными . По запросу в Яндексе я нашёл статью по сохранению форматирования при обработке файлов Excel в Питоне

Я использовал часть предложенного кода в новой версии программы. Сегодня я проверил работоспособность новой программы консолидации данных с сохранением стилей и форматирования. Всё работает, но не всегда, как бы хотелось. Все данные для программы консолидации находятся в предыдущей статье.

Какие возникли опять проблемы?

  1. Выдавалась ошибка при чтении файлов нового формата XLSX, и программа снималась. Поэтому все файлы я переводил в формат 2003.
  2. Форматы и стили в изменяемых ячейках выходного файла почему-то сохранились не все, а выборочно.

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’)