Domanda

Utilizzando Python, devo essere in grado di eseguire le seguenti operazioni su una cartella di lavoro per Excel 2007:

1.elimina colonne

Sto esaminando xlrd;Tuttavia.

Qualcuno può dirmi come si potrebbe fare questo?

È stato utile?

Soluzione

Se lavori in Python 3.x, troverai molti problemi nell'usare il file xlrd/xlwt/xlutils family, poiché sono moduli per Python 2.

Potresti considerare openpyxl per lavorare con file .xlsx di Excel 2007 in Python 3.

Se hai solo bisogno di spostare i valori (ignorando la formattazione, ecc.), ecco un modo per farlo.Puoi basarti su questo:

from openpyxl import load_workbook
from openpyxl.cell import column_index_from_string as col_index
from openpyxl.cell import get_column_letter as col_letter

def del_col(s, col, cmax=None, rmax=None):
    col_num = col_index(col) - 1
    cols = s.columns
    if isinstance(cmax, str):
        cmax = col_index(cmax)
    cmax = cmax or s.get_highest_column()
    rmax = rmax or s.get_highest_row()
    for c in range(col_num, cmax + 1):
        # print("working on column %i" % c)
        for r in range(0, rmax):
            cols[c][r].value = cols[c+1][r].value
    for r in range(0, rmax):
        cols[c+1][r].value = ''

    return s

if __name__ == '__main__':
    wb = load_workbook('input_book.xlsx')
    ws = wb.active
    # or by name: ws = wb['SheetName']
    col = 'D'
    del_col(ws, col)
    wb.save('output_book.xlsx')

Altri suggerimenti

Ciò elimina una colonna da un foglio di lavoro xlsx utilizzando openpyxl 2.3.3.È possibile specificare un numero di colonna o una lettera:

import openpyxl.cell

def delete_column(ws, delete_column):
    if isinstance(delete_column, str):
        delete_column = openpyxl.cell.column_index_from_string(delete_column)
    assert delete_column >= 1, "Column numbers must be 1 or greater"

    for column in range(delete_column, ws.max_column + 1):
        for row in range(1, ws.max_row + 1):
            ws.cell(row=row, column=column).value = \
                    ws.cell(row=row, column=column+1).value

Nella sua iterazione finale questo copia None valori dalla colonna ws.max_column+1 a colonna ws.max_column, cancellando i valori che c'erano.Mentre i valori nelle celle sono corretti, purtroppo ws.max_column non diminuisce.

In altre risposte si parla di utilizzo Worksheet.garbage_collect() resettare ws.max_column, ma sono riuscito a trovare solo il metodo privato Worksheet._garbage_collect(), quindi non l'ho usato.

AGGIORNAMENTO:Alla fine ho scoperto che eliminare molte colonne era inefficiente.Nasconderli è una soluzione superiore.Ciò preserva la formattazione e, cosa ancora più importante, mantiene l'integrità delle formule che fanno riferimento alle celle nascoste:

def hide_column(ws, column_id):
    if isinstance(column_id, int):
        assert column_id >= 1, "Column numbers must be 1 or greater"
        column_id = openpyxl.cell.get_column_letter(column_id)
    column_dimension = ws.column_dimensions[column_id]
    column_dimension.hidden = True
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top