使用Apache POI创建受密码保护的Excel文件?

2022-09-04 07:14:29

我正在开发一个简单的Java程序,以使用(Apache POI)API创建Excel文件。我正在使用Oracle 10g作为数据库,并使用ojdbc14 JAR文件。

我有一个名为USERINFO的表,有三列,即,现在使用Apache POI,我已经能够将所有行放在Excel文件中。USERNAMEPASSWORDNAME.

由于该文件包含用户名和密码等敏感数据,因此我想使其受密码保护。在论坛上,我发现了如何读取受密码保护的文件,但不知道如何创建它们。那么我该如何做到这一点呢?


答案 1

更新:从版本3.10开始,POI支持XLSX文件的加密和解密。请参阅 POI 网站上的“加密支持”页面。以下内容仍然与 XLS 二进制工作簿相关。

根据POI网站上的“加密支持”页面,POI支持读取加密的XLS和XLSX文件。该页面上未提及加密,这意味着它不受支持。这是通过在POI站点中搜索“加密”来备份的,该站点仅返回少量结果,所有这些结果都与解密有关。我还查看了其加密实现的源代码,该实现似乎只处理解密。这并不奇怪。POI 是为数据提取和搜索索引而设计的,而不是为创建新的电子表格而设计的。

正如其他人所建议的那样,通常可以通过在Excel中创建模板,然后使用POI用数据填充它来解决POI中缺少的功能。不幸的是,这不适用于加密,因为加密电子表格的文件格式完全不同。

如果您愿意为商业软件付费,最新版本的ExtenXLS对Excel支持的所有加密格式具有完整的读写支持。只需构造 一个而不是普通的 .这将使用由未经修改的JRE,XLS的RC4和XLSX的128位AES支持的最强密码。如果要将 256 位 AES 与 OOXML 结合使用,并且已安装 JCE 无限制策略,则可以对该类执行此操作。EncryptedWorkBookHandleWorkBookHandleMSOfficeEncrypter

JExcelAPI是一个流行的开源Java电子表格API,似乎根本不支持加密。Aspose.Cells是一种商业产品,支持stong加密。Actuate的e.Spreadsheet的文档似乎已经从“网络”中消失了,所以我无法判断它是否支持加密。

由于没有一个免费提供的Java电子表格API似乎都不支持编写加密电子表格,因此如果您不愿意使用商业软件,则需要提出解决方法。例如,您可以将电子表格写入加密的 ZIP 文件中。 不支持加密,但看起来像Zip4jjava.util.zip

完全披露:我在ExtenXLS背后的公司Deplicateech工作。


答案 2

创建受密码保护的 Excel 文件或使用现有模板并使其受密码保护。不过,这将为用户提供“只读”访问权限。下面是一个示例,其中我有一个包含密码“secret”的Excel文件:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.record.crypto.Biff8EncryptionKey;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;

public class ProtectedExcelFile {

    public static void main(final String... args) throws Exception {

        String fname = "C:\\Documents and Settings\\sadutta\\Desktop\\sample.xls";

        FileInputStream fileInput = null;
        BufferedInputStream bufferInput = null;
        POIFSFileSystem poiFileSystem = null;
        FileOutputStream fileOut = null;

        try {
            fileInput = new FileInputStream(fname);
            bufferInput = new BufferedInputStream(fileInput);
            poiFileSystem = new POIFSFileSystem(bufferInput);

            Biff8EncryptionKey.setCurrentUserPassword("secret");
            HSSFWorkbook workbook = new HSSFWorkbook(poiFileSystem, true);
            HSSFSheet sheet = workbook.getSheetAt(0);

            HSSFRow row = sheet.createRow(0);
            Cell cell = row.createCell(0);

            cell.setCellValue("THIS WORKS!");

            fileOut = new FileOutputStream(fname);
            workbook.writeProtectWorkbook(Biff8EncryptionKey.getCurrentUserPassword(), "");
            workbook.write(fileOut);
        }
        catch (Exception ex) {

            System.out.println(ex.getMessage());
        }
        finally {
            try {

                bufferInput.close();
            }
            catch (IOException ex) {

                System.out.println(ex.getMessage());
            }

            try {

                fileOut.close();
            }
            catch (IOException ex) {

                System.out.println(ex.getMessage());
            }
        }
    }
}

同样,您应该能够编写或修改现有的模板。完成后,覆盖模板。如果模板应多次使用,则可能需要将模板复制到其他某个位置,然后使用代码对其进行修改。


推荐