Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 从xls文件中删除列_Python 3.x_Xls_Xlrd - Fatal编程技术网

Python 3.x 从xls文件中删除列

Python 3.x 从xls文件中删除列,python-3.x,xls,xlrd,Python 3.x,Xls,Xlrd,使用Python,我需要能够对excel 2007工作簿执行以下操作: 1.删除列 我正在调查xlrd;不过 有谁能告诉我如何做到这一点吗?如果您使用的是Python 3.x,那么使用xlrd/xlwt/xlutils系列会遇到很多麻烦,因为它们是Python 2的模块 您可以考虑使用Python 3中的Excel 2007 .xLSx文件 > 如果您只需要转换值(忽略格式等),这里有一种方法。您可以在此基础上: from openpyxl import load_workbook from

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

1.删除列

我正在调查xlrd;不过


有谁能告诉我如何做到这一点吗?

如果您使用的是Python 3.x,那么使用
xlrd
/
xlwt
/
xlutils
系列会遇到很多麻烦,因为它们是Python 2的模块

您可以考虑使用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')

如果您使用的是Python3.x,那么使用
xlrd
/
xlwt
/
xlutils
系列会遇到很多问题,因为它们是Python2的模块

您可以考虑使用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')

这将使用从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\u column+1
复制到列
ws.max\u column
,清除以前存在的值。虽然单元格中的值是正确的,但不幸的是,
ws.max\u列
没有递减

在其他答案中,有人提到使用
工作表.garbage\u collect()
重置
ws.max\u列
,但我只能找到私有方法
工作表。\u garbage\u 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

这将使用从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\u column+1
复制到列
ws.max\u column
,清除以前存在的值。虽然单元格中的值是正确的,但不幸的是,
ws.max\u列
没有递减

在其他答案中,有人提到使用
工作表.garbage\u collect()
重置
ws.max\u列
,但我只能找到私有方法
工作表。\u garbage\u 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

这对我不起作用;我得到了错误:
UnboundLocalError:assignment之前引用的局部变量“c”
。我得到了相同的错误,有没有解决方法?可能会迟到,但当col_num This不能正确回答问题时,可能会抛出该错误,因为openpyxl仅适用于xlsx,不适用于问题中指定的xls。这对我不起作用;我得到了错误:
UnboundLocalError:assignment之前引用的局部变量“c”
。我得到了相同的错误,有没有解决方法?可能会迟到,但当col_num This不能正确回答问题时,可能会抛出该错误,因为openpyxl仅适用于xlsx,不能使用问题中指定的xls。无法删除多个文件对我来说很好,谢谢!被接受的答案有一些问题,正如在对该答案的评论中所指出的,但这正是我所需要的。谢谢我更喜欢这个解决方案,而不是公认的解决方案!无法删除多个文件对我来说很好,谢谢!被接受的答案有一些问题,正如在对该答案的评论中所指出的,但这正是我所需要的。谢谢我更喜欢这个解决方案,而不是公认的解决方案!