2013-04-05 5 views
7

Pracuję nad skryptem, który modyfikuje istniejący dokument programu Excel i muszę mieć możliwość wstawienia kolumny między dwiema innymi kolumnami, takimi jak komenda makra VBA .EntireColumn.Insert.Wstaw kolumnę za pomocą openpyxl

Czy jest jakaś metoda z openpyxl do wstawienia takiej kolumny?
Jeśli nie, jakakolwiek rada na temat pisania?

Odpowiedz

6

Nie znalazłem czegoś takiego jak .EntireColumn.Insert w openpyxl.

Pierwsza myśl przychodzi mi do głowy to ręczne wstawianie kolumny przez modyfikowanie _ komórek w arkuszu. Nie sądzę, że jest to najlepszy sposób, aby wstawić kolumnę, ale to działa:

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) 

Rozumiem, że to rozwiązanie jest bardzo brzydki, ale mam nadzieję, że to pomoże Ci myśleć w dobrym kierunku.

+0

Wygląda na to, że powinien wystarczyć. Arkusz roboczy, w którym będę go używał, ma tylko kilkaset linii i muszę wstawić tylko dwie kolumny, więc powinno to działać idealnie. Zaimplementuję to od razu. Dzięki! – Shawn

+1

Podczas tej pracy warto zauważyć, że zależy to od wewnętrznych zmian, które się zmienią. Kod jest również niezgodny z Python 3. Aby uzyskać bardziej rozbudowane rozwiązanie, zobacz https://bitbucket.org/snippets/openpyxl/qyzKn –