从xls文件中删除列

时间:2014-02-26 16:54:06

标签: python-3.x xls xlrd

使用Python,我需要能够对excel 2007的工作簿执行以下操作:

1.delete colums

我正在研究xlrd;但是。

有谁能告诉我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

如果你在Python 3.x中工作,那么使用xlrd / xlwt / xlutils系列会遇到很多麻烦,因为他们&# 39;用于Python 2的重新模块。

您可以考虑 openpyxl 在Python 3中使用Excel 2007 .xlsx文件。

如果你只需要移动值(忽略格式化等),这就是一种方法。你可以在此基础上建立:

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')

答案 1 :(得分:2)

这将使用openpyxl 2.3.3从xlsx工作表中删除列。您可以指定列号或字母:

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

在最后一次迭代中,这会将None列从ws.max_column+1列复制到列ws.max_column,从而消除以前的值。虽然单元格中的值是正确的,但遗憾的是ws.max_column不会减少。

在其他答案中有关于使用Worksheet.garbage_collect()重置ws.max_column的说法,但我只能找到私有方法Worksheet._garbage_collect(),因此我没有使用它。

更新: 最后我发现删除很多列效率很低。隐藏它们是一种出色的解决方案。这样可以保留格式,更重要的是,保持引用隐藏单元格的公式的完整性:

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