Python的杂项
通用
- 使用KeyError抛出时,填写在报错信息里的转义字符不会被正常识别并转义!!!
xlwings库
操作xlsx文件
- 若同时安装了“Microsoft Excel”与“WPS”,脚本运行时可能会报错或优先使用“Microsoft Excel”打开文件。
- 建议在脚本中的“使用xlwings打开表格文件”运行之前,添加清空下方路径文件夹的代码。有些情况下,脚本会因为这个文件夹里面的缓存文件报错。
import os f"C:\\Users\\{os.getlogin()}\\AppData\\Local\\Temp\\gen_py" # os.getlogin()用于获取当前电脑登录的用户名称
写入pandas.Dataframe值
- 如果写入数据的区域中存在“列隐藏”或“启用了自动筛选并添加了筛选条件而使部分行被隐藏了”的情况,最后的写入结果会存在很大偏差。所以在写入表格之前,应先取消“行隐藏”、“列隐藏”、“自动筛选”。
# 待写入的表格 df_2 = pandas.DataFrame( data={ "列1": [2,58,"5+", "822+", "5+",8,2,"5+",38], "列2": [2, 58, "5+", "822+", "5+", 8, 2, "5+", 38] } ) # 取消工作表的行隐藏 ws_by_xlwings.api.Rows.Hidden = False # ws_by_xlwings.api.Rows("2:3").Hidden = False 指定某整行区域隐藏 # 取消工作表的列隐藏 ws_by_xlwings.api.Columns.Hidden = False # ws_by_xlwings.api.Columns("C:T").Hidden = False 指定某整列区域隐藏 # 若存在自动筛选,则取消自动筛选。区域可随意指定。 if ws_by_xlwings.api.AutoFilterMode: ws_by_xlwings.range("A1").api.AutoFilter() # 写入表格的表头部分 ws_by_xlwings.range("A1").value = ( df_2.columns.tolist() ) # 写入表格的内容部分 ws_by_xlwings.range("A2").value = ( df_2.values.tolist() ) # 指定表格的表头区域,可以精确地设置自动筛选。例如:希望添加自动筛选的行在第二行,则可以指定区域为“A2:B2” ws_by_xlwings.range("A1:B1").api.AutoFilter() # 由此可以发现,其实这个自动筛选的接口没有包含检查“当前是否存在自动筛选”的步骤。 # 它只是将当前自动筛选的状态取反。相同的一段代码,既可以关闭也可以开启自动筛选,结果取决于当前表格是否已经启用自动筛选。 - 当被覆写区域中存在“仅存在自动筛选,且应用了筛选条件而使部分行被隐藏”的情况时,直接写入的表格数据的实际结果为:在不存在自动筛选的情况下表格数据将覆盖的区域内,对所有“可见且连续”的区域分别从表格首行开始选取相同行数的数据进行覆写,不对所有“不可见”的区域进行修改。详见下面各图:
无筛选条件的结果 筛选底纹颜色为黄色的结果 1 筛选底纹颜色为黄色的结果 2
- 如果写入数据的区域中存在“列隐藏”或“启用了自动筛选并添加了筛选条件而使部分行被隐藏了”的情况,最后的写入结果会存在很大偏差。所以在写入表格之前,应先取消“行隐藏”、“列隐藏”、“自动筛选”。
窗口冻结
- 使用xlwings冻结表格窗口时,需要设置app的visible=True,即app窗口可见。
- 如果要给多个工作表设定冻结窗口,那么需要在新建工作表后就设定。否则之后就再遍历多工作表的话,会因为无法选择下一个工作表的区域而报错。
- 需要选择最左侧连续整列或最上端连续整行的区域来冻结窗口,否则会因为select()函数的效果而导致最左侧列或最上端行被冻结在可视窗口之外。而至于同时设定行列的冻结方式,还不清楚怎么做。
range区域引用方式
- 文本直接指定
# 单一单元格 ws_by_xlwings.range("B4") # 区域 ws_by_xlwings.range("B4:C9") - 从1开始的索引坐标值指定。先行后列,先左上角后右下角。
# 单一单元格 ws_by_xlwings.range((4,2)) # 区域 ws_by_xlwings.range((4,2),(9,3))
- 文本直接指定
给单元格字体设置颜色的有效方式
- 直接传入RGB三元组
ws_by_xlwings.range("A2").font.color = (255,0,0) # 红色 - 调用Excel原生API。需要注意,此时的颜色表示值需要用十六进制反序值,即BGR。
ws_by_xlwings.range("A2").api.Font.Color = 0x0000FF # 红色
- 直接传入RGB三元组
pandas库
- 使用pandas.query()选择记录时,查询文本中的逻辑运算符"and"和"or"必须使用小写。否则会报错SyntaxError: invalid syntax。