java 加密 excel

新手上路,请多包涵

java对excel文件进行加密?

打开文件后就提示输入密码,否则不能打开文件

org.apache.poi.hssf.usermodel.HSSFWorkbook
public void writeProtectWorkbook(@NotNull java.lang.String password,
                             @NotNull java.lang.String username)

这个api只能对文件进行写保护。

阅读 7.5k
3 个回答

有点好奇,找了一下,的确如题主所说,poi的支持不太好,加密只能是改成只读的没办法完全拦截
poi源码:

    public void writeProtectWorkbook(String password, String username) {
        FileSharingRecord frec = getFileSharing();
        WriteAccessRecord waccess = getWriteAccess();
        /* WriteProtectRecord wprotect = */getWriteProtect();
        frec.setReadOnly((short) 1);
        frec.setPassword(FileSharingRecord.hashPassword(password));
        frec.setUsername(username);
        waccess.setUsername(username);
    }

然后又找了下,很多人问没有被解决的,找到了个替代的方法见poi-security

        WorksheetEncryptor.encrypt(excelFile, new FileOutputStream("file.xlsx"), "111");
        Workbook decrypt = WorksheetDecryptor.decrypt(new File("file.xlsx"), "111");

下来大概试了一下,只能修改xlsx的文件,是用加密把xlsx本身包装了一下,之后再用解密的方法来得到excel对象,加密后的文件excel软件没办法正常读取了

新手上路,请多包涵

加密Excel通常有三种方式:保护文档、仅加密其中某个工作表、锁定某些单元格不能编辑。我使用了Spire.XLS for Java类库分别实现了以上三种加密方式。提供以下代码供参考。
保护文档

import com.spire.xls.*;
public class EncryptWorkbook {
    public static void main(String[] args) {
        //加载示例文档
        Workbook workbook = new Workbook();
        workbook.loadFromFile("Sample.xlsx");

        //使用密码加密保护
        workbook.protect("eiceblue");

        //保存文档
        workbook.saveToFile("output/EncryptWorkbook.xlsx", ExcelVersion.Version2010);
    }
}

仅加密第一个工作表

import com.spire.xls.*;
import java.util.EnumSet;
public class ProtectWorksheet {
    public static void main(String[] args) {
        //加载示例文档
        Workbook workbook = new Workbook();
        workbook.loadFromFile("Sample.xlsx");

        //获取第一个工作表
        Worksheet sheet = workbook.getWorksheets().get(0);

        //使用密码加密保护
        sheet.protect("TestPassword", EnumSet.of(SheetProtectionType.All));

        //保存文档
        workbook.saveToFile("output/ProtectWorksheet.xlsx", ExcelVersion.Version2010);
    }
}

锁定某些区域不可编辑

import com.spire.xls.*;
import java.util.EnumSet;
public class ProtectCell {
    public static void main(String[] args) {
        //加载示例文档
        Workbook workbook = new Workbook();
        workbook.loadFromFile("Sample.xlsx");

        //获取第一个工作表
        Worksheet sheet = workbook.getWorksheets().get(0);

        //保护行与列
        sheet.getCellRange("B3").getCellStyle().setLocked(true);
        sheet.getCellRange("C3").getCellStyle().setLocked(false);

        //密码加密保护工作表
        sheet.protect("TestPassword", EnumSet.of(SheetProtectionType.All));

        //保存文档
        workbook.saveToFile("output/ProtectCell.xlsx", ExcelVersion.Version2010);
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题