У меня есть книга Excel, которая состоит из нескольких вкладок одного стиля таблицы (одинаковое количество столбцов, одинаковые типы данных).Я хочу объединить (добавить «стек? Внешнее соединение» - что угодно!) Каждую из таблиц в одну новую таблицу со следующими требованиями:
- Я не хочу повторять заголовок.
- Я не знаю количество строк в каждой существующей вкладке.
- Я хотел бы знать, с какой вкладки пришла каждая строка.
Пока мой концептуальный процесс выглядит следующим образом:
- Загрузить в рабочую книгу
- Получить список листов
- Зациклить список листовЯ создал.
- Добавьте новый столбец A, который содержит имя листа в каждой ячейке.
- Добавьте новый пустой лист
- Зациклите список созданных мной листовснова
- Добавьте данные к моему новому листу, исключая первую строку после первой итерации.
- Сохраните книгу
Вот код, которыйУ меня так далеко:
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.
Я посмотрел на эти решения, и ни одно из них, похоже, не работает:
- В этом, похоже, используется итерация '.rows'неправильно
- Этот не работал, потому что я не знаю количество строк в существующих таблицах.
- Этот выиграл 'не работают, потому что они просят скопировать между таблицами, что по какой-то причине является нетривиальным отклонением.