如何在Python中使用AutoFit时避免Excel隐藏列被显示
问题:AutoFit自动调整Excel列宽时避免展开隐藏列
在Python脚本中使用AutoFit自动调整Excel文件列宽时,存在需要保持隐藏但仍需格式化的列,但AutoFit功能会将所有隐藏列展开,如何避免这种情况?
用户提供的代码:
from win32com.client import Dispatch import openpyxl as opxl #other xl import os xl = Dispatch("Excel.Application") xl.Visible = True dir_path = os.path.dirname(os.path.realpath(__file__)) r_dir = dir_path+'/WR.xlsx' wb1 = xl.Workbooks.Open(Filename = r_dir) WR_fn = opxl.load_workbook(r_dir) for list_name in WR_fn.sheetnames: ws = wb1.Worksheets(str(list_name)) ws.Columns.AutoFit() wb1.Save() print("Formating is done!")
解决方案
可以通过两种方式解决这个问题:
方法1:记录隐藏列状态,AutoFit后恢复隐藏
先遍历工作表的所有列,记录隐藏列的索引,执行AutoFit后再将这些列重新设置为隐藏状态,这样既完成列宽调整,又保留原有的隐藏设置。
修改后的代码如下:
from win32com.client import Dispatch import os xl = Dispatch("Excel.Application") xl.Visible = True dir_path = os.path.dirname(os.path.realpath(__file__)) r_dir = dir_path+'/WR.xlsx' wb1 = xl.Workbooks.Open(Filename = r_dir) for list_name in wb1.SheetNames: ws = wb1.Worksheets(list_name) # 记录所有隐藏列的索引 hidden_cols = [] for col in ws.Columns: if col.Hidden: hidden_cols.append(col.Column) # 执行全局AutoFit ws.Columns.AutoFit() # 恢复隐藏列 for col_idx in hidden_cols: ws.Columns(col_idx).Hidden = True wb1.Save() print("Formatting is done!")
注:这里去掉了openpyxl的重复加载,直接用win32com自带的wb1.SheetNames获取工作表名,减少资源消耗
方法2:仅对可见列执行AutoFit
不直接对所有列执行AutoFit,而是遍历每一列,只对可见列单独执行AutoFit操作,从根源上避免触碰隐藏列。
修改后的代码如下:
from win32com.client import Dispatch import os xl = Dispatch("Excel.Application") xl.Visible = True dir_path = os.path.dirname(os.path.realpath(__file__)) r_dir = dir_path+'/WR.xlsx' wb1 = xl.Workbooks.Open(Filename = r_dir) for list_name in wb1.SheetNames: ws = wb1.Worksheets(list_name) # 遍历所有列,仅对可见列执行AutoFit for col in ws.Columns: if not col.Hidden: col.AutoFit() wb1.Save() print("Formatting is done!")
两种方法都能达到需求:方法1执行效率更高(仅一次全局AutoFit),方法2逻辑更直观,可根据实际场景选择。
内容的提问来源于stack exchange,提问作者Valerie
相关产品推荐
相关产品推荐

