解决poi读出来的sheet个数和实际看到个数不一致
背景业务那边给了个 excel,用 office 软件打开只显示一个 Sheet,但是使用 poi 读可以读出来 3 个 sheet,并且看了这个 excel 确实没有隐藏 sheet。
解决过程一开始用了一些关键字并没有找到相应的结果。并且使用 poi 查看这个看不到的 sheet 的 isHidden 也确实都是 fasle。后来快要放弃的时候,发现了 poi 接口有个方法
1org.apache.poi.ss.usermodel.Workbook#getSheetVisibility
这个方法和 isHidden 是同一个层级的,只是因为在找 isHidden 的时候 ide 自动提示出来的。然后我就调用了一下这个方法,发现看不到的 excel 使用这个方法返回的是VERY_HIDDEN这个枚举值。
有了这个关键字,然后去搜索这个关键字就比较容易了。找到了一个比较好的解释,链接我放到参考里面去了。大概意思 excel 有一种 very hidden 模式,这个模式默认情况下不会漏出来,需要在开发者模式下,或者像我这样用 poi 才能看到。
参考https://theexcelc ...
Windows远程唤醒
因为需要可能偶尔会需要远程一下家里的电脑,但是太穷了电脑不能一直开机。
通电唤醒这是之前用的方案,在电源上接一个智能插座,bios 设置通电自动开机。
网络唤醒可以参考一下这篇文章https://sspai.com/post/67003,说的比较详细了,设置网卡唤醒,然后使用 App 发送请求达到唤醒的目的。
开机卡这是我现在用的方案。比起网络唤醒更省电。而且现在的开机卡都比较智能了。可以直连家里的智能家居,可以受到小爱同学或者 siri 的控制。淘宝一搜就有。
开机卡一般使用 PCIE 供电,当然也有 USB 供电的。这里要额外说一下 PCIE 供电的,一般的主板都会有 PCIE 供电口,但是可能是消费级别的主板这个口一般用的不多,网上看到很多人都在吐槽显卡会挡住这个口,刚好我的主板的 PCIE 口就被显卡挡住了,而且是两个都被挡住了。没办法只要接了一个 PCIE 扩展线,把口接出来才能用。
岛屿的数量
原题连接 https://leetcode.cn/problems/number-of-islands/description/
方法 1 并查集这是一个很典型的并查集问题。初始化并查集,把全部的陆地分别设置成单独的集合,然后遍历,如果有陆地相连则把集合合并,最后计算最后剩余的集合个数
12345678910111213141516171819202122232425262728293031323334353637383940414243class Solution: def numIslands(self, grid: List[List[str]]) -> int: union_find = UnionFind(grid) l1,l2 = len(grid),len(grid[0]) for i in range(l1): for j in range(l2): if grid[i][j] == '1': # 这里做不做 ...
常用python3刷题语法
因为主编程语言不是 python,很多语法容易忘,特意记录一下。
循环普通循环range 是左闭右开区间
12for i in range(0, 10): print(i)
逆序12for i in range(10, 0, -1): print(i)
循环变量在循环体外面依然可以用
1234for i in range(0, 10): pass# 这里输出的是9,并不等价于类c语言里面的 for(i = 0;i < 10; i++)print(i)
enumerate返回的元组第一个参数是 index
123s = "abcd"for i,c in enumerate(s):
数组切片12345678910# 复制数组b = a[:]# 取前四个数b = a[:4]b = a[0:4]b = a[0:4:1]# 取前四个没隔两个一取b = a[:4:2]
数组比较直接比就可以了
1list1 == list2
字符串按照字典序排序12a = "dcba"b = "".join(sorted ...
pdfbox实现pdf合并
目前 Java 的 pdf 文档合并方案常见的有 spire.doc.free、itextpdf、pdfbox 三种。spire.doc.free 的免费版本有页数限制,这里就不考虑了。而性能最好的 itext 的开源协议是AGPL,为了避免以后可能出现的麻烦我放弃了他,选择了可以商用比较友好的 pdfbox。
pdfboxApache pdfbox 是一个开源 Java 库,可用于创建,渲染,打印,拆分,合并,更改,验证和提取 pdf 文件的文本和元数据。
maven 依赖12345<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.24</version></dependency>
pdf 合并12345678910public void mergePdf(String... path) throws IOException { ...
Java字符串split、replaceAll忽略全半角和大小写
replaceAll忽略大小写很简,使用正则就可以实现
1String s = "Hello word".replaceAll("(?i)hello","你好");
忽略全角半角就需要自己实现了,实现思路是把原字符串、要匹配的字符串全部转换成半角(全角),然后对转换后的字符串做 indexOf,得到 index 之后替换原字符串。
1234567891011public static String replaceAllIgnoreHalfFull(String source, String toReplace, String replacement) { StringBuilder sbSource = new StringBuilder(source); StringBuilder sbSourceHalf = new StringBuilder(StringUtils.fullToHalf(source)); String searchString = StringUtils.fullToHa ...
Java word转pdf方案
方案调研xdocreporthttps://github.com/opensagres/xdocreport我测试的最新版本(2.0.3 )使用图片会报错,默认不是识别汉子(大概因为字体原因?),不支持批注。网上了解到的可能 word 格式要求较大。
Asposehttps://www.aspose.com/应该是最完美的方案,但是收费,不便宜
WPS 云服务定价未知,文档上没有明确出来。需要注册认证成为服务商需要服务暴露到公网上,因为 wps 会回掉服务。格式没有测试,应该会和 office 有细微的差距。
阿里云服务接口八分钱一次,必须使用阿里云 oss。网上资料很少,个人感觉效果不错,口碑未知。应该是最佳方案。
Libreoffice需要安装 Libreoffice可以使用程序去调用他自带的 soffice 工具来转或者通过 UNO 的方式排版会有差异,而且也涉及到字体问题,涉及到字体版权问题。
Jacob仅支持 windows,大致原理就是调用 Microsoft Office / WPS 来实现转换,当然需要安装对应的软件,因为我们生产系统肯定部署在 linux 上 ...
Excel设置最小行高
问题有个需求,导出导出的 Excel 需要设置最小高度,比如最小高度是 56px,当内容的高度低于 56 的时候,行高设置为 56,当内容高度大于 56 的时候,根据内容高度自适应。
因为 excel 的行高只能设置固定大小,或者设置自适应,而没办法设置上述最小行高,所以普通的办法是做不到这个需求的。
解决可以通过设置字体大小来解决这个最小行高问题。也不知道这是 excel 的 feat 还是 bug。
设置单元格格式——对齐——自动换行——确定
选中一列不使用的列(空白列),把字体设置一下,这样就有了一个最小行高,比如如果字体大小是 18,那么最小行高就是 22.5。
这样可以解决问题,但是相当于废了一个 cell,不过可以接受。
如果换成代码实现的话,可以用 poi 去按照上述步骤设置,当然也可以自己提前编辑好一个模版文件,然后使用 poi 直接 copy 模版文件的格式。
解决poi插入的换行符无法被复制的问题
问题背景在 word 中有两种换行,一种是直接按下回车的”段落换行”而另一种换行符是按下 shift + 回车打出来的换行符
12345## 第一种换行符org.apache.poi.xwpf.usermodel.XWPFRun#addCarriageReturn()## 第二种换行符org.apache.poi.xwpf.usermodel.XWPFRun#addBreak()
第一种换行符比较符合我们日常的使用习惯,但是使用上述 api 打出来的换行符可以在 word 中被正常识别,但是无法通过复制的方式把这个换行符复制到一段文本中。举个例子,如下 word 内容
123第一行第二行第三行
复制到文本文件中变成
1第一行 第二行 第三行
而我们直接在 word 中敲出来的回车换行符可以被正确复制。
解决思路因为直接使用 poi 的 api 无法解决这个问题,所以只能另辟蹊径。最后参考https://stackoverflow.com/questions/14830667/insert-a-line-break-inside-a-paragraph-in-xwpfdocume ...
Ubuntu20.04修改静态ip
给自己瞎折腾的服务器配置一个固定的静态 ip,虽然这玩意对内网穿透没啥用,但是总不能在内网中也从外网走一圈吧,在内网中直接用 ip 访问就好了。
1sudo vi /etc/netplan/00-installer-config.yaml
修改文件内容为
12345678910network: ethernets: ens160: addresses: [192.168.50.8/24] #要修改的ip地址 dhcp4: no #no为静态 yes为自动获取 optional: true gateway4: 192.168.50.4 #网关地址 nameservers: addresses: [192.168.50.4] #dns服务器,多个之间逗号分隔 version: 2
静态 ip 下一定要配置 dns 服务器,否则无法访问外网
使设置生效
1sudo netplan apply