2013-04-05 2 views
7

Я работаю над скриптом, который изменяет существующий документ excel, и мне нужно иметь возможность вставлять столбец между двумя другими столбцами, такими как макрокоманда VBA .EntireColumn.Insert.Вставить столбец с помощью openpyxl

Есть ли какой-либо метод с openpyxl для вставки столбца, подобного этому?
Если нет, советы по написанию одного?

ответ

6

Не найдено ничего подобного .EntireColumn.Insert in openpyxl.

Первое, что приходит мне в голову, - вставить столбец вручную, изменив _cells на листе. Я не думаю, что это лучший способ, чтобы вставить столбец, но он работает:

from openpyxl.workbook import Workbook 
from openpyxl.cell import get_column_letter, Cell, column_index_from_string, coordinate_from_string 

wb = Workbook() 
dest_filename = r'empty_book.xlsx' 
ws = wb.worksheets[0] 
ws.title = "range names" 

# inserting sample data 
for col_idx in xrange(1, 10): 
    col = get_column_letter(col_idx) 
    for row in xrange(1, 10): 
     ws.cell('%s%s' % (col, row)).value = '%s%s' % (col, row) 

# inserting column between 4 and 5 
column_index = 5 
new_cells = {} 
ws.column_dimensions = {} 
for coordinate, cell in ws._cells.iteritems(): 
    column_letter, row = coordinate_from_string(coordinate) 
    column = column_index_from_string(column_letter) 

    # shifting columns 
    if column >= column_index: 
     column += 1 

    column_letter = get_column_letter(column) 
    coordinate = '%s%s' % (column_letter, row) 

    # it's important to create new Cell object 
    new_cells[coordinate] = Cell(ws, column_letter, row, cell.value) 

ws._cells = new_cells 
wb.save(filename=dest_filename) 

Я понимаю, что это решение очень некрасиво, но я надеюсь, что это поможет вам думать в правильном направлении.

+0

Похоже, что все должно быть хорошо. Рабочий лист, который я использовал бы с этим, всего лишь несколько сотен строк в длину, и мне нужно только вставить два столбца, чтобы это работало отлично. Внедрите это сразу. Благодаря! – Shawn

+1

Хотя это работает, стоит отметить, что это сильно зависит от внутренних изменений, которые будут меняться. Код также несовместим с Python 3. Для более широкого решения см. Https://bitbucket.org/snippets/openpyxl/qyzKn –

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