Excel表格打开方式频繁被WPS修改,如何彻底解决

楔子
大家好,我是张桃狮。
最近我电脑上的Excel表格打开方式又一次被更改为用WPS打开。
虽然我知道如何恢复,可是还是想彻底解决这个问题。
先叠甲,我不是不支持WPS,而是使用习惯和电脑性能导致我不得不用微软Office。
一方面我已经用微软Office二十多年了,早已经习惯了Office软件的界面。
另外一方面,我的电脑还是七八年前的配置,如果用WPS打开Excel表格,会卡顿。
取消Excel表格的WPS默认打开方式很简单,只需要在开始菜单中找到WPS Office的文件夹,找到配置工具。

WPS Office 配置工具-高级-兼容设置,取消勾选下面这些选项。

以下各复选框:若被选中,则将以 WPS Office 为您打开指定文件;若未被选中,则继续保持原有方式打开对应文件。
☐ Microsoft Word文档(W)(.doc,.dot,.docx文件)、RTF文档、WPS文档(.wps,*.wpt)
☐ Microsoft Excel文档(E)(.xls,.xlt,.xlsx,.xlsm文件)、WPS表格(.et,.ett)
☐ Microsoft PowerPoint文档(P)(.ppt,.pot,.pps,.pptx文件)、WPS演示(.dps,.dpt)
☐ PDF文档(*.pdf)(E)
☐ 图片文件(*.jpg, *.png, *.gif 等)(U)
……

这个时候点击确认就可以将Excel的打开方式恢复为微软Office了,可是还是治标不治本。
WPS Office 配置工具-高级-升级设置,取消勾选下面两个选项。 这才是彻底解决问题的关键。
升级时关联设置:
□ 升级时检查文件关联,自动修复为默认用 WPS 打开
□ 升级时检查图片关联,自动修复为默认用WPS图片打开
原来每次WPS自动升级都会自动修复Excel的打开方式,这可是一把双刃剑。
对于习惯用WPS且电脑配置还不错的人来说,可以优先体验最新版本的软件。
对于我这样还在用老电脑的人,更新的版本往往意味着更加卡顿。
升级时检查文件关联,自动修复为默认用 WPS 打开 ,这种行为往往会被人误认为流氓了。
对于很多刚接触电脑的人来说,WPS的下载安装可比微软Office方便太多了。
事实上,我日常虽然习惯使用微软Office软件办公,但是同事和客户用WPS的更多,我也没办法不安装WPS。
我希望WPS和Office能够和平共处,愿世界和平。
闲话少说,咱们继续力扣刷题学编程。
力扣405. 数字转换为十六进制数
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。
答案字符串中的所有字母都应该是小写字符,并且除了 0 本身之外,答案中不应该有任何前置零。
注意: 不允许使用任何由库提供的将数字直接转换或格式化为十六进制的方法来解决这个问题。
示例 1:
输入:num = 26
输出:”1a”
示例 2:
输入:num = -1
输出:”ffffffff”
提示:
我的思路
求余数
正整数可以用求余数方法转换为十六进制。
负整数取绝对值计算补码,再用求余数方法转换位十六进制。
class Solution: def toHex(self, num: int) -> str: d={0: '0', 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9', 10: 'a', 11: 'b', 12: 'c', 13: 'd', 14: 'e', 15: 'f'} if num < 0: num = abs(num) num = ~num + 1 res="" while num > 0 : res = d[num%16] + res num = num // 16 return res
力扣提交失败,输入正整数可以得到正确的结果,输入负整数,输出的是空字符串。
检查后发现,我用的负数取绝对值,再按位取反+1,得到的结果保持不变,还是负数,后面的while循环根本就不会执行。
问了豆包才知道,Python int 是无限长整数,没有 32 位限制,计算负数补码需要num & 0xFFFFFFFF,强制保留32位大整数。
改完了以后是这样的。
class Solution: def toHex(self, num: int) -> str: if num == 0: return "0" mask = 0xFFFFFFFF num = num & mask d={0: '0', 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9', 10: 'a', 11: 'b', 12: 'c', 13: 'd', 14: 'e', 15: 'f'} res="" while num > 0 : res = d[num%16] + res num = num // 16 return res
力扣提交通过,时间复杂度O(logN),空间复杂度O(1)。
N最大为,每次除以 16(),最多需要8次循环就可以得到结果。
logN上限为常数,等价O(1)。
位运算
尝试用位运算解决。
32位二进制数,每4位恰好对应十六进制的一位数。
可以写一个循环,让掩码0xF0000000每次向右移动4位,将num中的每4位二进制数都转为十六进制数并拼接。
class Solution: def toHex(self, num: int) -> str: if num == 0: return "0" mask = 0xFFFFFFFF num = num & mask d={0: '0', 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9', 10: 'a', 11: 'b', 12: 'c', 13: 'd', 14: 'e', 15: 'f'} res="" mask = 0xF0000000 for i in range(8) : num1 = num & mask res += d[num1 >> (4*(7-i))] mask >>= 4 return res.lstrip('0')
力扣提交通过,时间复杂度O(1),空间复杂度O(1)。
最开始我没有去除前置0,不过Python对于文本的处理真的很强大,.lstrip()可以轻松去除左侧前置0。
如果使用Excel公式去除前置0,还是很麻烦的。
我想不出更多的解法了,咱们还是看官方题解吧。
力扣官方题解
方法一:位运算
class Solution: def toHex(self, num: int) -> str: if num == 0: return "0" res = [] n = num & 0xFFFFFFFF for i in range(7, -1, -1): val = (n >> (4 * i)) & 0xF if res or val > 0: if val < 10: c = chr(ord('0') + val) else: c = chr(ord('a') + val - 10) res.append(c) return ''.join(res)
力扣提交通过,时间复杂度O(1),空间复杂度O(1)。
这个代码跟我的位运算思路基本一样。
不同之处主要是十进制转十六进制的方法,我用了字典,力扣用了ASICII码。
我的循环是升序的,力扣的循环是降序的。
我最后才处理前置0,力扣使用if判断规避前置0产生。
我是个编程爱好者,小白级别的,如果你跟我一样希望通过力扣刷题,学习各种奇妙的算法,可以关注我,大家一起学习。
夜雨聆风