openpyxl - составление идентичных листов на новый лист - PullRequest
0 голосов
/ 26 октября 2018

У меня есть книга Excel, которая состоит из нескольких вкладок одного стиля таблицы (одинаковое количество столбцов, одинаковые типы данных).Я хочу объединить (добавить «стек? Внешнее соединение» - что угодно!) Каждую из таблиц в одну новую таблицу со следующими требованиями:

  • Я не хочу повторять заголовок.
  • Я не знаю количество строк в каждой существующей вкладке.
  • Я хотел бы знать, с какой вкладки пришла каждая строка.

Пока мой концептуальный процесс выглядит следующим образом:

  1. Загрузить в рабочую книгу
  2. Получить список листов
  3. Зациклить список листовЯ создал.
  4. Добавьте новый столбец A, который содержит имя листа в каждой ячейке.
  5. Добавьте новый пустой лист
  6. Зациклите список созданных мной листовснова
  7. Добавьте данные к моему новому листу, исключая первую строку после первой итерации.
  8. Сохраните книгу

Вот код, которыйУ меня так далеко:

def combine(path):
    # Load in workbook
    wb = xl.load_workbook(filename=path)

    # Get a list of sheets
    ws_list = wb.sheetnames

    # Loop over the list of sheets I created
    for i, ws in enumerate(ws_list):
        # Add a new column A
        wb[ws].insert_cols(idx=0)  
        for column in wb[ws]['A{0}:A{1}'.format(wb[ws].min_row, wb[ws].max_row)]:
            for cell in column:
                # that contains the name of the sheet in every cell
                cell.value = str(ws)

    # Add a new empty sheet
    wb.create_sheet(title=u'COMBINED',index=0)
    # Loop over the list of sheets I created againv
    for i, ws in enumerate(ws_list):
        # Append the data (currently should copy headers as well)
        wb['COMBINED'].append(wb[ws].rows)

    # Save workbook
    wb.save(path) 

И это ошибка, которую я получаю

Обратите внимание, что «Падение 03» является первымt имя вкладки, и это текст, добавленный в первый столбец первой вкладки.Из-за этого я предполагаю, что процесс работает на шаге 5.

Traceback (most recent call last):
  File "test.py", line 194, in <module>
    main()
  File "test.py", line 188, in main
    combine(excel_path)
  File "test.py", line 166, in combine
    wb['COMBINED'].append(wb[ws].rows)                          <- my script
  File "C:\Python27\ArcGISx6410.5\lib\site-packages\openpyxl\worksheet\worksheet.py", line 777, in append
    cell = Cell(self, row=row_idx, col_idx=col_idx, value=content)
  File "C:\Python27\ArcGISx6410.5\lib\site-packages\openpyxl\cell\cell.py", line 115, in __init__
    self.value = value
  File "C:\Python27\ArcGISx6410.5\lib\site-packages\openpyxl\cell\cell.py", line 294, in value
    self._bind_value(value)
  File "C:\Python27\ArcGISx6410.5\lib\site-packages\openpyxl\cell\cell.py", line 207, in _bind_value
    raise ValueError("Cannot convert {0!r} to Excel".format(value))
ValueError: Cannot convert (<Cell u'Fall 03'.A1>, <Cell u'Fall 03'.B1>, <Cell u'Fall 03'.C1>, <Cell u'Fall 03'.D1>, <Cell u'Fall 03'.E1>, <Cell u'Fall 03'.F1>, <Cell u'Fall 03'.G1>, <Cell u'Fall 03'.H1>, <Cell u'Fall 03'.I1>, <Cell u'Fall 03'.J1>, <Cell u'Fall 03'.K1>, <Cell u'Fall 03'.L1>, <Cell u'Fall 03'.M1>, <Cell u'Fall 03'.N1>, <Cell u'Fall 03'.O1>, <Cell u'Fall 03'.P1>, <Cell u'Fall 03'.Q1>, <Cell u'Fall 03'.R1>, <Cell u'Fall 03'.S1>, <Cell u'Fall 03'.T1>, <Cell u'Fall 03'.U1>, <Cell u'Fall 03'.V1>, <Cell u'Fall 03'.W1>, <Cell u'Fall 03'.X1>, <Cell u'Fall 03'.Y1>, <Cell u'Fall 03'.Z1>, <Cell u'Fall 03'.AA1>, <Cell u'Fall 03'.AB1>, <Cell u'Fall 03'.AC1>, <Cell u'Fall 03'.AD1>, <Cell u'Fall 03'.AE1>, <Cell u'Fall 03'.AF1>, <Cell u'Fall 03'.AG1>, <Cell u'Fall 03'.AH1>, <Cell u'Fall 03'.AI1>, <Cell u'Fall 03'.AJ1>, <Cell u'Fall 03'.AK1>, <Cell u'Fall 03'.AL1>) to Excel

Если я могу быть разборчивым

Пока я пытаюсь придерживатьсяв openpyxl, потому что я знаю, что он установлен на всех машинах, которые мне нужно будет использовать.Я также могу использовать любой модуль, который входит в стандартный дистрибутив ArcGIS 10.5 ArcPy.

Я посмотрел на эти решения, и ни одно из них, похоже, не работает:

  1. В этом, похоже, используется итерация '.rows'неправильно
  2. Этот не работал, потому что я не знаю количество строк в существующих таблицах.
  3. Этот выиграл 'не работают, потому что они просят скопировать между таблицами, что по какой-то причине является нетривиальным отклонением.

1 Ответ

0 голосов
/ 26 октября 2018

Вы не можете сделать это wb['COMBINED'].append(wb[ws].rows).Вы можете добавить только последовательность простых элементов, таких как числа или строки, и вы пытаетесь передать последовательность кортежей, содержащих Cell объекты.for row in ws1.values: ws.append(row) было бы возможно.

Ваш код также слишком сложен: вы можете просто циклически перебирать листы в рабочей книге: for ws in wb и использовать ws.iter_rows() и ws.iter_cols() для параметрического доступа.

...