Python 3.x 从xls文件中删除列
使用Python,我需要能够对excel 2007工作簿执行以下操作: 1.删除列 我正在调查xlrd;不过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 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。无法删除多个文件对我来说很好,谢谢!被接受的答案有一些问题,正如在对该答案的评论中所指出的,但这正是我所需要的。谢谢我更喜欢这个解决方案,而不是公认的解决方案!无法删除多个文件对我来说很好,谢谢!被接受的答案有一些问题,正如在对该答案的评论中所指出的,但这正是我所需要的。谢谢我更喜欢这个解决方案,而不是公认的解决方案!