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

vik*_*iii 13 java excel xls apache-poi

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

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

由于该文件包含敏感数据,如用户名和密码,我想让它受密码保护.在论坛上,我发现了如何读取受密码保护的文件,而不是如何创建它们.那我怎么能做到这一点?

Sam*_*nes 15

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

根据POI网站上的"加密支持"页面, POI支持读取加密的XLS和XLSX文件.该页面上未提及加密,这意味着它不受支持.这通过在POI站点搜索"加密"来备份,该加密仅返回少数几个关于解密的结果.我还看了一下他们的加密实现的来源,它似乎只处理解密.这并不奇怪; POI专为数据提取和搜索索引而设计,而不是用于创建新的电子表格.

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

如果您愿意为商业软件付费,最新版本的ExtenXLS对Excel支持的所有加密格式都提供完全读写支持.只需构建一个EncryptedWorkBookHandle而不是正常的WorkBookHandle.这将使用未经修改的JRE支持的最强密码,用于XLS的RC4和用于XLSX的128位AES.如果您想在OOXML中使用256位AES,并且已经安装了JCE无限制策略,则可以使用MSOfficeEncrypter该类.

JExcelAPI是一种流行的开源Java电子表格API,似乎根本不支持加密.Aspose.Cells是一种商业产品,支持强加密.Actuate e.Spreadsheet的文档似乎已经从'net中消失了,所以我不知道它是否支持加密.

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

完全披露:我在ExtenXLS公司的Extentech公司工作.

  • 我最近为POI添加了对基于xml的文件的加密支持,所以如果你更新你的答案,那就太好了,即第一段已经过时了.关于提取设计:大多数POI-apis从功能的读取支持开始,但我不同意POI专门用于提取(这在2012年1月我的观点也是有效的) (3认同)

Saj*_*tta 8

创建受密码保护的Excel文件或使用现有模板并使其受密码保护.这将为用户提供"只读"访问权限.这是一个例子,我有一个密码为"秘密"的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());
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您应该能够编写或修改现有模板的方式相同.完成后,覆盖模板.如果您的模板应该多次使用,您可能希望将模板复制到其他位置,然后使用代码进行修改.