Python 或 LibreOffice 保存使用密码加密的 xlsx 文件

标签 python excel encryption ubuntu-14.04 libreoffice-calc

我正在尝试使用密码加密保存 Excel 文件。我尝试按照 https://help.libreoffice.org/Common/Protecting_Content_in 上的指南进行操作- 并且工作完美。然而,这是在 GUI 中,但我正在寻找在 headless 模式下使用命令行界面的解决方案。

我查看了 man libreoffice,但我在其中找不到任何内容。

同样,我也查看了 Python 3 库 openpyxl 的文档,但我也没有找到任何有用的东西。

是否可以使用命令行(或 Python 库)在 Ubuntu 14.04/16.04 上使用密码保存 Excel 2007+ 文件,并且不需要任何用户交互或 X session ?加密/p>

最佳答案

有使用 JythonApache POI 的解决方案。如果您想从 CPython/PyPy 使用它,可以使用 subprocess 模块调用外部 Jython 脚本。

  1. 我假设您已经安装了 Java JRE/JDK
  2. 使用 Excel/Calc 创建非加密 xlsx 文件,或使用 xlsxwriteropenpyxl 并将其另存为test1.xlsx
  3. 下载独立的 Jython
  4. 下载 Apache POI
  5. 在独立 Jython jar 所在的同一目录中提取 Apache POI
  6. 将以下 Jython 脚本保存为 encrypt.py:
import os
import sys
from java.io import BufferedInputStream
from java.io import FileInputStream
from java.io import FileOutputStream
from java.io import File
from java.io import IOException
from org.apache.poi.poifs.crypt import EncryptionInfo, EncryptionMode
from org.apache.poi.poifs.crypt import CipherAlgorithm, HashAlgorithm
from org.apache.poi.poifs.crypt.agile import AgileEncryptionInfoBuilder
from org.apache.poi.openxml4j.opc import OPCPackage, PackageAccess
from org.apache.poi.poifs.filesystem import POIFSFileSystem
from org.apache.poi.ss.usermodel import WorkbookFactory

def encrypt_xlsx(in_fname, out_fname, password):
    # read
    in_f = File(in_fname)
    in_wb = WorkbookFactory.create(in_f, password)
    in_fis = FileInputStream(in_fname)
    in_wb.close()

    # encryption
    out_poi_fs = POIFSFileSystem()
    info = EncryptionInfo(EncryptionMode.agile)
    enc = info.getEncryptor()
    enc.confirmPassword(password)
    opc = OPCPackage.open(in_f, PackageAccess.READ_WRITE)
    out_os = enc.getDataStream(out_poi_fs)
    opc.save(out_os)
    opc.close()

    # write
    out_fos = FileOutputStream(out_fname)
    out_poi_fs.writeFilesystem(out_fos)
    out_fos.close()

if __name__ == '__main__':
    in_fname = sys.argv[1]
    out_fname = sys.argv[2]
    password = sys.argv[3]
    encrypt_xlsx(in_fname, out_fname, password)
  • 从控制台调用它:
  • java -cp "jython-standalone-2.7.0.jar:poi-3.15/lib/commons-codec-1.10.jar:poi-3.15/lib/commons-collections4-4.1.jar:poi-3.15/poi-3.15.jar:poi-3.15/poi-ooxml-3.15.jar:poi-3.15/poi-ooxml-schemas-3.15.jar:poi-3.15/ooxml-lib/curvesapi-1.04.jar:poi-3.15/ooxml-lib/xmlbeans-2.6.0.jar" org.python.util.jython -B encrypt.py test1.xlsx test1enc.xlsx 12345678
    

    地点:

    • encrypt.py - 脚本名称
    • test1.xlsx - 输入文件名
    • test1enc.xlsx - 输出文件名
    • 12345678 - 密码

    最终的加密 xslx 应位于test1enc.xlsx 中。

    关于Python 或 LibreOffice 保存使用密码加密的 xlsx 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39509741/

    相关文章:

    python - 如何遍历链表 Python

    excel - VBA 数据从一个工作簿传输到另一个工作簿,数据类型不匹配错误

    vba - 处理某些内容时是否可以卡住 Excel?

    java - 使用 BouncyCaSTLe 创建 key 对证书并使用外部 CA 对其进行签名

    python - 当一个对象可以等于不同类型的对象时,如何定义 __hash__ ?

    Pythonic方式封装和实例化N个离散对象实例

    c++ - 使用 ASCII 的凯撒密码返回 C-cedilla

    python - 在python中解密ssl加密数据

    python - 当参数为零时,带参数的 SymPy dsolve 给出错误答案

    excel - 向 Excel 中单元格中的每个单词添加一个字符,并带有跳过某些单词的选项