Python或LibreOffice保存使用密码

时间:2016-09-15 11:17:00

标签: python excel encryption ubuntu-14.04 libreoffice-calc

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

我看过man libreoffice,但我找不到任何东西。

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

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

1 个答案:

答案 0 :(得分:2)

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

  1. 我假设您安装了Java JRE / JDK
  2. 使用Excel / Calc创建非加密 xlsx文件,或使用xlsxwriteropenpyxl并将其另存为 test1.xlsx
  3. 下载独立的Jython
  4. 下载Apache POI
  5. 在同一dir中提取Apache POI,其中是独立的Jython jar
  6. 将以下Jython脚本保存为 encrypt.py
  7. 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)
    
    1. 从控制台调用它:
    2. 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