我创建了一个用于使用java发送邮件的jar。我必须附上一个带邮件的excel文件。使用HSSF创建工作表。但我需要用密码加密附件。我成功了。但是,当我通过Outlook直接从邮件打开附件时,它不会询问密码。当我复制到任何文件夹,然后如果我尝试打开,它可以正常工作。有人可以帮忙吗?
public static void main(final String... args) throws Exception {
String fname = "D:\\Mail\\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);
File file = new File("D:\\Mail\\Sample.xls");
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
try {
for (int readNum; (readNum = fis.read(buf)) != -1;) {
bos.write(buf, 0, readNum);
System.out.println("read " + readNum + " bytes,");
}
} catch (IOException ex) {
}
byte[] bytes = bos.toByteArray();
// Code for sending mail
} 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());
}
}
}
答案 0 :(得分:1)
方法HSSFWorkbook.writeProtectWorkbook(...)
仅用于保护工作簿不被写入/修改
如果您尝试以读取+写入模式(Windows文件夹中的默认模式)打开它,它将询问您密码
但是,如果你以只读模式打开它,这是Outlook对附件的作用,它会让你查看内容,因为你不能写它们,因此你不需要写密码。登记/>
这就是你可以在Outlook中查看(但不能编辑)它的原因,但是当你从文件夹中打开它时却没有。
我不知道最新版本的Apache POI是否支持HSSFWorkBook的完全密码保护(快速Google搜索说它不是,但谁知道)。
如果没有,您可以通过制作带有excel的受密码保护的ZIP文件并附加ZIP文件来解决此问题。