2013-04-05 15 views
7

Sto lavorando a uno script che modifica un documento excel esistente e ho bisogno di avere la possibilità di inserire una colonna tra altre due colonne come il comando macro VBA .EntireColumn.Insert.Inserisci colonna usando openpyxl

C'è qualche metodo con openpyxl per inserire una colonna come questa?
In caso negativo, qualche consiglio su come scriverne uno?

risposta

6

Non ho trovato nulla come .EntireColumn.Insert in openpyxl.

Prima di tutto mi viene in mente di inserire manualmente la colonna modificando _cells su un foglio di lavoro. Non credo che sia il modo migliore per inserire colonna ma funziona:

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) 

Capisco che questa soluzione è molto brutto, ma spero vi aiuterà a pensare in una direzione giusta.

+0

Sembra che dovrebbe andare bene. Il foglio di lavoro che utilizzerei è solo alcune centinaia di righe al massimo e ho solo bisogno di inserire due colonne, quindi questo dovrebbe funzionare perfettamente. Lo implementerà immediatamente. Grazie! – Shawn

+1

Mentre funziona, vale la pena notare che dipende fortemente dagli interni che cambieranno. Il codice non è compatibile con Python 3. Per una soluzione più ampia vedi https://bitbucket.org/snippets/openpyxl/qyzKn –

Problemi correlati