Python给excel加密(linux可用版)
之前找到了用win32com加密,后来才发现,win32只能在windows上才能使用,没有linux适配的模块,方法失败,搜了半天也没找到答案,后来尝试用java中的jar包来解决问题,使用到的jar包就是:jecell.jar。
环境准备
本地环境是 python3.6,jdk1.8,另外需要 python 的模块 JPype,来调用 jar 包
# 直接下载的话现在是1.3.0了,有一些方法已经变了,我现在使用的是 0.6.3
pip3 install jpype1==0.6.3
附上下载地址:
https://mirrors.aliyun.com/pypi/packages/c4/4b/60a3e63d51714d4d7ef1b1efdf84315d118a0a80a5b085bb52a7e2428cdc/JPype1-0.6.3.tar.gz
使用
JPype 提供的 startJVM()
函数的作用是启动 JAVA 虚拟机,所以在后续的任何 JAVA 代码被调用前,必须先调用此方法启动 JAVA 虚拟机。get_default_jvm_path
方法可以获取当前系统中JVM的所在路径。
import jpype
jpype.startJVM(jpype.get_default_jvm_path(), *args)
第三方包的引用
很多时候,在 Python 项目中需要调用第三方的 Java 扩展包,这也是 JPype 的一个重要用途。
- 通过在 JVM 启动参数增加:
-Djava.class.path = ext_classpath
,实现在 Python 代码中调用已有的 Java 扩展包。 - 通过在 JVM 启动参数增加:
-Djava.ext.dirs = ext_dirs
, 实现在Python 代码中引入 Java 扩展包的其他依赖包。
关闭JVM
当使用完 JVM 后,可以通过jpype.shutdownJVM()
来关闭 JVM,该函数没有输入参数。
当 Python 程序退出时,JVM 也会自动关闭。
注:jpype本身无法多次启动和关闭JVM,在使用是,可以不关闭JVM,在需要启动的地方时进行JVM是否已经启动的判断:
> if not jpype.isJVMStarted(): > jpype.startJVM()
示例
这里演示一个最简单的Java示例:
import jpype
if not jpype.isJVMStarted():
jpype.startJVM(jpype.get_default_jvm_path())
System = jpype.JClass('java.lang.System')
System.out.println('hello word!')
调用测试
文件路径:
- files/
- jxcell.jar
- test.xls
- test.py
import jpype
import os
def set_password_file(url, passwd):
"""
将文件加密
:param url: 文件路径 + 文件名
:param passwd: 密码
:return:
"""
project_dir = os.path.dirname(os.path.abspath(__file__))
jvm_path = jpype.get_default_jvm_path()
print(jvm_path)
# 这里根据实际的jxcell.jar路径进行配置,我这里的放的位置是本文件同级目录的lib/jxcell.jar
jxcell_path = os.path.join(project_dir, 'files/jxcell.jar')
jpype.startJVM(jvm_path, '-ea', '-Djava.class.path=' + jxcell_path)
view = jpype.JClass('com.jxcell.View')
m_view = view()
m_view.read(url) # 这里默认要打算加密的文件没有密码,先将文件读取出来
m_view.write(url, passwd) # 将读取的文件文件加密
if __name__ == '__main__':
# 在当前目录下创建一个test.xls表格,随便输入一些数据,供测试
encrypt('files/test.xls', '123456')
补充说明:
- 本文中 jpype 安装用的0.6.3,高版本的方法不一样。
- 只能给 xls 文件加密,高版本的貌似也不行。