Как мне пропустить oop через каждый исходный файл и скопировать указанный столбец c в новую рабочую книгу, при этом каждая новая вставка перемещается в соседний столбец? - PullRequest
1 голос
/ 23 января 2020

У меня есть 3 файла Excel со столбцом данных в ячейках с A1 по A10 (« Исходные ячейки ») в каждой книге (на листе 1 в каждой книге). Я хотел бы скопировать данные из исходных ячеек в новую рабочую книгу, но данные должны каждый раз перемещаться в новый столбец.
Например:

  1. Исходные ячейки в файле 1 должны быть скопированы в ячейки с A1 по A10 в новой книге;
  2. Исходные ячейки в файле 2 должны быть скопированы в ячейки с B1 по B10 в новой книге; и
  3. исходные ячейки в файле 3 должны быть скопированы в ячейки с C1 по C10 в новой рабочей книге.

Я изо всех сил пытаюсь найти лучший способ настроить "j" в мой код на каждой итерации. Я также не уверен, что самый чистый способ - запускать каждую функцию для разных исходных файлов.

Все предложения о том, как сделать этот код более чистым, также будут оценены, потому что я признаю, что в данный момент это так грязно!

Заранее спасибо!

import openpyxl as xl

filename_1 = "C:\\workspace\\scripts\\file1.xlsx"
filename_2 = "C:\\workspace\\scripts\\file2.xlsx"
filename_3 = "C:\\workspace\\scripts\\file3.xlsx"

destination_filename = "C:\\workspace\\scripts\\new_file.xlsx"

num_rows = 10
num_columns = 1


def open_source_workbook(path):
    '''Open the workbook and worksheet in the source Excel file'''
    workbook = xl.load_workbook(path)
    worksheet = workbook.worksheets[0]
    return worksheet

def open_destination_workbook(path):
    '''Open the destination workbook I want to copy the data to.'''
    new_workbook = xl.load_workbook(path)
    return new_workbook

def open_destination_worksheet(path):
    '''Open the worksheet of the destination workbook I want to copy the data to.'''
    new_worksheet = new_workbook.active
    return new_worksheet

def copy_to_new_file(worksheet, new_worksheet):
    for i in range (1, num_rows + 1):
        for j in range (1, num_columns + 1):
            c = worksheet.cell(row = i, column = j)
            new_worksheet.cell(row = i, column = j).value = c.value

worksheet = open_source_workbook(filename_1)
new_workbook = open_destination_workbook(destination_filename)
new_worksheet = open_destination_worksheet(new_workbook)
copy_to_new_file(worksheet, new_worksheet)
new_workbook.save(str(destination_filename))

1 Ответ

0 голосов
/ 23 января 2020

Вопрос : L oop файлы, скопировать указанный столбец c, с каждой новой вставкой, перемещающейся в соседний столбец?

Это подход сначала агрегирует из всех файлов значения ячеек столбцов.
Затем переупорядочивает его так, чтобы он мог использоваться методом openpyxl.append(....
Следовательно, нет target Требуются знания столбца.


Ссылка :


  1. Используется импорт

    import openpyxl as opxl
    from collections import OrderedDict
    
  2. Определите файлы в OrderedDict чтобы сохранить файл <=> порядок столбцов

    file = OrderedDict.fromkeys(('file1', 'file2', 'file3'))
    
  3. Определить диапазон в качестве значений индекса. Преобразовать нотацию Excel A1 в значения индекса

    min_col, max_col, min_row, max_row =  
        opxl.utils.cell.range_to_tuple('DUMMY!A1:A10')[1]
    
  4. L oop определенных файлов,
    загрузить каждую книгу и получить ссылку на рабочий лист по умолчанию
    получить значения ячеек из заданного диапазона:
    min_col=1, max_col=1, min_row=1, max_row=10

    for fname in file.keys(): 
        wb = openpyxl.load_workbook(fname)
        ws = wb.current()
        file[fname] =  ws.iter_rows(min_row=min_row, 
                                    max_row=max_row,
                                    min_col=min_col,
                                    max_col=max_col, 
                                    values_only=True)
    
  5. Определить новую книгу и получить ссылку на рабочий лист по умолчанию

    wb2 = opxl.Workbook()
    ws2 = wb2.current()
    
  6. Сжатие значений, Row per Row из всех файлов
    Сопоставление сжатого списка кортежей с помощью lambda для сглаживания со списком значений Row.
    Добавление списка значений в новый рабочий лист

    for row_value in map(lambda r:tuple(v for c in r for v in c), 
                         zip(*(file[k] for k in file))
                        ):
        ws2.append(row_value)
    
  7. Сохранить новую рабочую книгу

    # wb2.save(...)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...