def file_to_wb(file_name):
    try:
        return openpyxl.load_workbook(filename=file_name)
    except:
        logger.critical('Ошибка открытия файла: %s' % (file_name))
        # time.sleep(30)
        exit(0)
def work_with_dir(folder_for_find_xlsx):
    # folder_for_find_xlsx = os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # полный путь к папке из которой выполняется файл
    list_files = []  # список файлов с полными путями
    for file in os.listdir(folder_for_find_xlsx):  # во всех файлах папки
        if file.endswith(".xlsx"):  # находим файл совпадающий с шаблоном
            # добавляем файл, с полным путем, подходящий шаблону, в список
            list_files.append(os.path.join(file))
    if list_files == []:
        logger.critical('Нету файлов для обработки')
        time.sleep(30)
        exit(0)
    else:
        if exit_sum_file in list_files:
            list_files.remove(exit_sum_file)
            logger.warning('Файл "%s" уже есть в папке, буду перезаписывать' %
                           (exit_sum_file))
        for_del = []
        for list_file in list_files:
            if list_file[0] == '~':
                logger.warning('С файлом "%s" работать не буду' % (list_file))
                for_del.append(list_file)
        for for_del_file in for_del:
            list_files.remove(for_del_file)
    return list_files
def sum_files(work_dir, exit_files_dir):
    num_do_summ = 9
    num_posle_summ = 4
    header1 = []
    hed1 = []
    wb = openpyxl.Workbook()
    new_sheet = wb[wb.sheetnames[0]]  # берем первый лист в файле
    i = 0
    exit_mass = []
    for need_file in work_with_dir(work_dir):
        logger.info('Работаю с файлом: ' + work_dir + '\\' + need_file)
        work_wb = file_to_wb(work_dir + '\\' + need_file)
        sheet = work_wb[double_sheet_name]
        for row in sheet.iter_rows():
            o = []
            o.append(need_file)
            for z in row:
                o.append(z.value)
            if o[2] == "Служебная №:" or o[2] == "Заказчик:" or o[
                    2] == "Заказ №:" or o[2] == "Отгрузка:":
                logger.info('Откидываю строку потому что: ' + o[2])

            elif o[2] == "Наименование":
                for i in o[num_do_summ:len(o) - num_posle_summ]:
                    header1.append(str(i))

            else:
                exit_mass.append(o)

    header = [
        'Наименование', 'Позиция', 'Кол-во узел (шт.)', 'Кол-во изделие (шт.)',
        'Кол-во заказ (шт.)', 'Кол-во НЗП (шт.)', 'Массив'
    ]
    header2 = ['Размеры чист.', 'Размеры заготовки', 'Операции', 'Розцеховка']
    mass = [header + header1 + header2]

    max_elem = 0
    # iter_colls = 12 #количество столбцов без столбцов которые добавлены при поиске дублей
    for i in exit_mass:
        if max_elem < len(i):
            max_elem = len(i)
    # print(max_elem)
    files_list = []

    start = 0
    len_insert = 0
    append_mas = []
    exit_mass2 = []
    for i in exit_mass:
        if i[0] not in files_list:
            files_list.append(i[0])
            len_insert += len(i[num_do_summ:len(i) - num_posle_summ])
    for i in range(0, len_insert):
        append_mas.append(None)
    files_list.clear()
    files_list.append(exit_mass[0][0])
    start2 = 0
    for i in exit_mass:
        if i[0] not in files_list:
            files_list.append(i[0])
            start += start2
        else:
            start2 = len(i[num_do_summ:len(i) - num_posle_summ])
        sp1 = [None] * start
        sp2 = i[num_do_summ:len(i) - num_posle_summ]
        sp3 = [None] * (len_insert - len(sp2) - start)
        sp4 = i[0:num_do_summ]
        sp5 = i[0 - num_posle_summ:]
        sp6 = sp4 + sp1 + sp2 + sp3 + sp5
        exit_mass2.append(sp6.copy())
        sp1.clear()
        sp2.clear()
        sp3.clear()
        sp4.clear()
        sp5.clear()
        sp6.clear()
    exit_mass.clear()
    hed1 = [None] * len(exit_mass2[0])
    for rowtbl in exit_mass2:
        # print(rowtbl)
        for i in range(num_do_summ, len(rowtbl) - num_posle_summ):
            if rowtbl[i] != None:
                hed1[i] = rowtbl[0]

    for row in [hed1[2:len(hed1)]]:
        new_sheet.append(row)
    for row in exit_mass2:
        # row = row[2:len(row)]
        del row[0]
        del row[0]
    for row in mass:
        new_sheet.append(row)
    for row in exit_mass2:
        new_sheet.append(row)

    # Расскрашиваем суммировочную таблицу
    logger.info('Расскрашиваем лист: %s' % ('Sheet'))
    for row in range(1, new_sheet.max_row + 1):
        for col in range(1, new_sheet.max_column + 1):
            new_sheet.cell(row=row, column=col).border = border_1

    for col in range(1, new_sheet.max_column + 1):
        new_sheet.cell(row=1, column=col).fill = fill_1
        new_sheet.cell(row=1, column=col).font = font_1
        new_sheet.cell(row=2, column=col).fill = fill_1
        new_sheet.cell(row=2, column=col).font = font_1
        if col in [3, 4, 5, 6, 7]:
            new_sheet.cell(row=2, column=col).alignment = alignment_1
            new_sheet.column_dimensions[get_column_letter(col)].width = float(
                5)
        if col == 1:
            new_sheet.column_dimensions[get_column_letter(col)].width = float(
                20)
        if col == 2:
            new_sheet.column_dimensions[get_column_letter(col)].width = float(
                25)
        if col in [
                new_sheet.max_column, new_sheet.max_column - 1,
                new_sheet.max_column - 2, new_sheet.max_column - 3
        ]:
            new_sheet.column_dimensions[get_column_letter(col)].width = float(
                25)
        if col in list(range(8, new_sheet.max_column + 1 - 4)):
            new_sheet.cell(row=1, column=col).comment = Comment(
                new_sheet.cell(row=1, column=col).value, "Find Doubles")
            new_sheet.cell(row=2, column=col).comment = Comment(
                new_sheet.cell(row=2, column=col).value, "Find Doubles")
            new_sheet.cell(row=2, column=col).alignment = alignment_1
            new_sheet.column_dimensions[get_column_letter(col)].width = float(
                5)
            new_sheet.cell(row=1, column=col).alignment = alignment_1
        new_sheet.row_dimensions[1].height = 60
        new_sheet.row_dimensions[2].height = 130

    try:
        wb.save(exit_files_dir + '\\' + exit_sum_file)
    except PermissionError as identifier:
        logger.critical('Нет доступа к файлу: %s, %s' %
                        (exit_files_dir + '\\' + exit_sum_file, identifier))
        exit(0)

    work_wb = file_to_wb(exit_files_dir + '\\' + exit_sum_file)
    sheet = work_wb['Sheet']
    sum_mass = []

    def recell(itm):
        return itm.value

    for row in sheet.iter_rows():
        sum_mass.append(list(map(recell, row)))

    hhed1 = sum_mass[0]
    hhed2 = sum_mass[1]
    del sum_mass[0]
    del sum_mass[0]
    double_sheet = work_wb.create_sheet('Итог')  # создаем новый лист в файле
    double_sheet.append(hhed1)
    double_sheet.append(hhed2)
    doubles_rows = []
    for row in sum_mass:
        exit_row = row
        if row[1] not in doubles_rows:
            ss = 0
            for row2 in sum_mass:
                if row[1] == row2[1]:
                    doubles_rows.append(row2[1])
                    ss += int(row2[4])
                    # сравниваем столбцы дублирующихся строк и выводим несовпадающие:
                    if row2[0] != exit_row[0]:
                        logger.warning(
                            'У %s %s не совпадает Наименование: "%s" и "%s"' %
                            (row2[0], row2[1], row2[0], exit_row[0]))
                        exit_row[0] = '|'.join(
                            [str(row2[0]), str(exit_row[0]), 'W'])
                    # logger.debug(exit_row[-1])
                    if row2[-1] != exit_row[-1]:
                        logger.warning(
                            'У %s %s не совпадает Розцеховка: "%s" и "%s"' %
                            (row2[0], row2[1], row2[-1], exit_row[-1]))
                        exit_row[-1] = '|'.join(
                            [str(row2[-1]),
                             str(exit_row[-1]), 'W'])

                    if row2[-2] != exit_row[-2]:
                        logger.warning(
                            'У %s %s не совпадают Операции: "%s" и "%s"' %
                            (row2[0], row2[1], row2[-2], exit_row[-2]))
                        if row2[-2] != None:
                            exit_row[-2] = '|'.join(
                                [str((row2[-2])),
                                 str(exit_row[-2]), 'W'])
                        # print(exit_row)

                    if row2[-3] != exit_row[-3]:
                        logger.warning(
                            'У %s %s не совпадают Размеры заготовки: "%s" и "%s"'
                            % (row2[0], row2[1], row2[-3], exit_row[-3]))
                        exit_row[-3] = '|'.join(
                            [str(row2[-3]),
                             str(exit_row[-3]), 'W'])

                    if row2[-4] != exit_row[-4]:
                        logger.warning(
                            'У %s %s не совпадают Размеры чист.: "%s" и "%s"' %
                            (row2[0], row2[1], row2[-4], exit_row[-4]))
                        exit_row[-4] = '|'.join(
                            [str(row2[-4]),
                             str(exit_row[-4]), 'W'])

                    for rr in range(0, len(row2)):
                        if row2[rr] != None and exit_row[rr] == None:
                            exit_row[rr] = row2[rr]

            exit_row[4] = ss
            ss = 0
            double_sheet.append(exit_row)

    try:
        work_wb.save(exit_files_dir + '\\' + exit_sum_file)
    except PermissionError as identifier:
        logger.critical('Нет доступа к файлу: %s' %
                        (exit_files_dir + '\\' + exit_sum_file))
        exit(0)

    work_wb = file_to_wb(exit_files_dir + '\\' + exit_sum_file)
    sheet = work_wb['Итог']

    # Расскраска выходной таблицы
    logger.info('Расскрашиваем лист: %s' % ('Итог'))
    for row in range(1, sheet.max_row + 1):
        for col in range(1, sheet.max_column + 1):
            if col == 5:
                sheet.cell(row=row, column=col).fill = fill_1
            try:
                split_cell = sheet.cell(row=row, column=col).value.split('|')
                if len(split_cell) > 1:
                    sheet.cell(row=row,
                               column=col).value = '|'.join(split_cell[:-1])
                    sheet.cell(row=row, column=col).fill = fill_2
            except:
                pass
            sheet.cell(row=row, column=col).border = border_1

    for col in range(1, sheet.max_column + 1):
        sheet.cell(row=1, column=col).fill = fill_1
        sheet.cell(row=1, column=col).font = font_1
        sheet.cell(row=2, column=col).fill = fill_1
        sheet.cell(row=2, column=col).font = font_1
        if col in [3, 4, 5, 6, 7]:
            sheet.cell(row=2, column=col).alignment = alignment_1
            sheet.column_dimensions[get_column_letter(col)].width = float(5)
        if col == 1:
            sheet.column_dimensions[get_column_letter(col)].width = float(20)
        if col == 2:
            sheet.column_dimensions[get_column_letter(col)].width = float(25)
        if col in [
                sheet.max_column, sheet.max_column - 1, sheet.max_column - 2,
                sheet.max_column - 3
        ]:
            sheet.column_dimensions[get_column_letter(col)].width = float(25)
        if col in list(range(8, sheet.max_column + 1 - 4)):
            sheet.cell(row=1, column=col).comment = Comment(
                sheet.cell(row=1, column=col).value, "Find Doubles")
            sheet.cell(row=2, column=col).comment = Comment(
                sheet.cell(row=2, column=col).value, "Find Doubles")
            sheet.cell(row=2, column=col).alignment = alignment_1
            sheet.column_dimensions[get_column_letter(col)].width = float(5)
            sheet.cell(row=1, column=col).alignment = alignment_1
        sheet.row_dimensions[1].height = 60
        sheet.row_dimensions[2].height = 130

    try:
        work_wb.save(exit_files_dir + '\\' + exit_sum_file)
    except PermissionError as identifier:
        logger.critical('Не получилось сохранить файл: %s' %
                        (exit_files_dir + '\\' + exit_sum_file))
        exit(0)
def big_trabl(xls_file, trabl):
    logger.critical(
        'Что-то пошло не так при первичной обработке файла: %s. \nПитончег говорит: %s'
        % (xls_file, trabl))
    time.sleep(60)
    exit(0)
        try:
            for xls_file in work_with_dir(folder_for_find_xlsx):
                logger.info('Работаю с файлом: %s' % (xls_file))
                work(xls_file, folder_for_find_xlsx, exit_files_dir)
        except ValueError as trabl:
            big_trabl(xls_file, trabl)
            time.sleep(30)
        except FileNotFoundError as trabl:
            big_trabl(xls_file, trabl)
            time.sleep(30)
        except PermissionError as trabl:
            big_trabl(xls_file, trabl)
            time.sleep(30)

        folder_for_new_xlsx = folder_for_find_xlsx + '\\' + exit_files_dir

        try:
            sum_files(folder_for_new_xlsx, folder_for_find_xlsx)
        except KeyError as trabl:
            xls_file = 'сам знаешь'
            big_trabl(xls_file, trabl)

        # print('Можно закрывать.')
        logger.info('Можно закрывать. Работа закончена за: %s' %
                    round(time.process_time() - start_time, 3))
        time.sleep(30)

    except BaseException as error:
        logger.critical('Ошибка: %s' % (error))
        time.sleep(30)