2014-02-26 23 views
0

使用Python,我需要能夠做以下操作,工作簿爲2007的Excel:從XLS文件中刪除列

1.delete colums

我期待到xlrd;然而。

任何人都可以請告訴我怎麼可以這樣做?

回答

3

如果你在Python 3.x的工作,你會發現很多使用xlrd/xlwt/xlutils家庭的麻煩,因爲他們是模塊的Python 2.

你可能會考慮openpyxl用於在Excel 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') 
+0

這對我沒有用;我得到錯誤:'UnboundLocalError:在賦值之前引用的局部變量'c'。 –

+0

我得到了同樣的錯誤,對此有任何修復? – MiNdFrEaK

+1

可能會晚到晚會,但是當col_num <= cmax - 1時可能會引發錯誤,因此循環的第一個循環永遠不會進入,並且c永遠不會獲得值。第二個for循環使用c,所以錯誤被拋出。我很確定第一個for循環應該有range(col_num,cmax + 1)。 –

0

此使用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 

在其最後一次迭代這份來自ws.max_column+1Nonews.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 
+0

無法刪除多個文件 – MiNdFrEaK