2014-02-26 1 views
0

, 나는 엑셀 2007 통합 문서에 다음과 같은 작업을 수행 할 수 있어야 XLS 파일에서 열 삭제 :파이썬을 사용하여

1.delete의 colums

내가 xlrd로 찾고 있어요; 하나.

아무도 말해 줄 수 있습니까?

답변

3

파이썬 3.x의에서 작업하는 경우가

당신은 openpyxl을 고려해 볼 수 있습니다 파이썬 2에 대한 모듈을있는 한, 당신의 xlrd/xlwt/xlutils 제품군을 사용하여 문제를 많이 찾을 수 있습니다을 사용하여 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') 
+0

이것은 나를 위해 작동하지 않습니다. 'UnboundLocalError : 할당 전에 참조 된 로컬 변수 'c'오류가 발생했습니다. –

+0

동일한 오류가 발생했습니다. 수정 사항이 있습니까? – MiNdFrEaK

+1

파티에 늦을 지 모르지만 col_num <= cmax - 1 일 때 오류가 발생하기 때문에 첫 번째 for 루프는 입력되지 않고 c는 결코 값을 갖지 않습니다. 두 번째 for 루프는 c를 사용하므로 오류가 발생합니다. 나는 첫 번째 for 루프가 range (col_num, cmax + 1)를 가져야한다고 확신한다. –

0

이것은 openpyxl 2.3.3를 사용하여 XLSX 워크 시트에서 열을 삭제합니다. 거기에 사용되는 값을 닦아 열 ws.max_column이 사본을 최종 반복에 열 ws.max_column+1에서 None 값을

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은 감소하지 않습니다.

다른 대답은 ws.max_column을 재설정하기 위해 Worksheet.garbage_collect()을 사용하는 이야기가 있지만 개인적인 방법 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