使用Python,我需要能够对excel 2007的工作簿执行以下操作:
1.delete colums
我正在研究xlrd;但是。
有谁能告诉我怎么能这样做?
答案 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