背景:在做销售数据处理的过程中,数据会随着月份增加,没过一个月就需要增加一列,如果提前所有的月份都列出来,没有数据的列会影响整个表格的布局,如何将没有数据的列进行隐藏呢!并且随着月份的增加,逐渐的释放隐藏的数据。可以使用隐藏函数一个一个的隐藏,也可以使用建立组,然后将组进行隐藏。两者在操作中原理很相近,但是,建立组并隐藏的形式可以更好的释放隐藏的列。
1 函数:ws.column_dimensions.group和ws.row_dimensions.group
语法:
from openpyxl import Workbook
wb = Workbook() # 新建一个工作簿
ws = wb.active
ws.column_dimensions.group(start, end,outline_level=n, hidden=True)
ws.row_dimensions.group(start, end,outline_level=n, hidden=True)
参数:
start:从那一列开始,输入的是(A,B,C,,,,,,)
end:那一列结束,输入的是(A,B,C,,,,,,),如果没有end,单独对start建立组
outline_level:组的层级,默认是1,如果存在多个层级也可以使用2,3,4,5,,,,,,
hidden:是否隐藏,默认是False
思考:如果一个sheet有12列,并且第10和11建立组,我在第8列后增加了一列,那如何对原来的列建立组呢?如果之前建立了组别如果再次创建组别,会对新的组别有什么影响呢!该如何取消组别呢!程序该如何智能一些,不需要每次进行调整呢!
个人思考,对于插入的列之后,会对插入位置之后的列的位置造成影响,之前的列的位置不会进行改变。如果是月度销售数据的释放,可以每次取消一个列。
实例:
from openpyxl import Workbook
wb = Workbook() # 新建一个工作簿
ws = wb.active
row_values=[]
for value in ws[2]:# 假设列名称在第二列
row_values.append(value)
# 当你不知道列的位置可以透过获得列名称的位置获得列所对应的英文字母名称
# start_column_name,建立组的开始列名称
# end_column_name,建立组的结束列名称
BKBL_by_customer.column_dimensions.group(get_column_letter(row_values.index(start_column_name)+1),
get_column_letter(row_values.index(start_column_name)+1),
1,hidden=True)
取消组:
方案一:outline_level的参数设置为0
from openpyxl import Workbook
wb = Workbook() # 新建一个工作簿
ws = wb.active
row_values=[]
for value in ws[2]:# 假设列名称在第二列
row_values.append(value)
# 当你不知道列的位置可以透过获得列名称的位置获得列所对应的英文字母名称
# start_column_name,建立组的开始列名称
# end_column_name,建立组的结束列名称
BKBL_by_customer.column_dimensions.group(start,end,0,hidden=True)
注意:如果start=“N”,“N”并且是一个组的第一列,无论是否设置end,在outline_level=0,的情况下,都会取消组。
方案二:
for group in ws.column_dimensions:
# 取消列分组
if ws.column_dimensions[group].outline_level:
ws.column_dimensions[group].outline_level = 0
此方案是将表中所有的组都被取消组别。
此时就可以写一个稍微只能一些的程序,实现在月初的时候就会取消本月数据的组并取消隐藏。
因为程序中有存在建立组别的程序,只需要获得现在的月份,首先是去除所有的组,然后用该月份所在的列的英文字母名称,然后重新建立组就可以了,如果是增加一列到组中,则直接对其单独建立一个组,这样就会在原来的组中增加一列。