2016-04-08 3 views
1

фона:openpyxl: Добавление данных в первую пустую ячейку столбца

У меня есть книги Excel, содержащие метаданные, которые распространяются через различные рабочие листы. Мне нужно взять соответствующие столбцы данных из разных листов и объединить их в один рабочий лист. С помощью следующего кода мне удалось создать новый рабочий лист и добавить к нему данные.

 # Open workbook and assign worksheet 
     try: 
      wb = openpyxl.load_workbook(metadata) 
      shtEditionLNM = wb.worksheets[0] # Edition date & latest NM 
      shtChartsTitles = wb.worksheets[1] # Charts & Titles 
      shtDepthHeight = wb.worksheets[4] # Depth & heights 
      shtChartProj = wb.worksheets[7] # Chart Projection 
     except: 
      raise SystemExit(0) 

     new = wb.create_sheet() 
     new.title = "MT_CHARTS INFO" 
     new.sheet_properties.tabColor = "1072BA" 
     shtMeta = wb.get_sheet_by_name("MT_CHARTS INFO") 

     for row in shtChartsTitles.rows: 
      shtMeta.append([row[0].value, row[1].value, row[2].value, row[4].value]) 
     for row in shtEditionLNM.rows: 
      shtMeta.append([row[3].value, row[4].value]) 


     wb.save('OW - Quarterly Extract of Metadata for Raster Charts Dec 2015.xlsx') 

Это работает без ошибок, и я могу видеть данные, сохраненные в моей новой книге. Однако, когда я запускаю второй цикл и добавляю значения, они добавляются в ячейку A3169, тогда как я действительно хочу, чтобы они заполнялись из E1.

Мой вопрос сводится к тому, что я могу добавить новый столбец вместо новой строки?

Заранее благодарен!

ответ

4

Не напрямую: ws.append() работает со строками, потому что это способ хранения данных и, таким образом, легче всего оптимизировать только для чтения и только для записи.

Однако ws.cell(row=x, column=y, value=z) позволит вам делать желать лучшего. Версия 2.4 (установка из проверки) также позволит вам работать непосредственно с столбцами, управляя назначением для ячеек для вас: ws['E'] вернет кортеж ячеек в столбце до текущего ws.max_row; ws.iter_cols(min_col, min_row, max_col, max_row) вернет генератор колонок настолько большой, насколько вам это нужно.

1

Спасибо Чарли,

Ваш ответ дал мне направление мне нужно, чтобы это было сделано. Ссылаясь на этот вопрос: how to write to a new cell in python using openpyxl

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

x=0 
    for row in shtEditionLNM.rows: 
     x+=1 
     shtMeta.cell(coordinate="E{}".format(x)).value = row[3].value 
     shtMeta.cell(coordinate="F{}".format(x)).value = row[4].value 
+0

Мой совет - прекратить использование '.cell (coord = ...)' для чего-либо, поскольку это теперь устарело. –

+0

@CharlieClark спасибо, не знал об этом. Я теперь использовал предложенный метод и вижу, что должен использовать это во-первых, чтобы избежать форматирования строк! Он отлично работает. P.S Я только что понял, что вы поддерживаете openpyxl, поэтому я хотел бы поблагодарить вас, поскольку это была огромная помощь в моей роли, у вас или у плагина есть страница пожертвования? – lamb

+0

Рад, что вы сочтете это полезным. У нас нет конкретной страницы пожертвований, но мы принимаем их охотно. Лучше всего напишите мне по электронной почте. –

Смежные вопросы