从地图创建动态excel文件的Java代码<;标题,值>;并同时对其进行密码保护?
我正在使用rest服务,我想在运行时借助map创建一个动态excel文件,其中map的键是标题,值是列的值。此外,我想使其密码保护也,一旦我下载它,该文件是密码保护。我将密码应用到它,密码也可以正常工作,但文件已损坏 我做了很多研究,但没有得到相关的解决方案。请帮忙从地图创建动态excel文件的Java代码<;标题,值>;并同时对其进行密码保护?,java,apache-poi,xlsx,password-protection,password-encryption,Java,Apache Poi,Xlsx,Password Protection,Password Encryption,我正在使用rest服务,我想在运行时借助map创建一个动态excel文件,其中map的键是标题,值是列的值。此外,我想使其密码保护也,一旦我下载它,该文件是密码保护。我将密码应用到它,密码也可以正常工作,但文件已损坏 我做了很多研究,但没有得到相关的解决方案。请帮忙 import java.io.IOException; import java.io.OutputStream; import java.security.GeneralSecurityException; import java
import java.io.IOException;
import java.io.OutputStream;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import javax.ws.rs.core.StreamingOutput;
`import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.poifs.crypt.EncryptionInfo;
import org.apache.poi.poifs.crypt.EncryptionMode;
import org.apache.poi.poifs.crypt.Encryptor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.vems.util.VEMSUtil;
@Path("/ajaxReport")
public class ReportController {
public static Logger logger = LoggerFactory.getLogger(ReportController.class);
private static final String password = "foobar1";
@GET
@Path("{attribute1}/{attribute2}")
@Produces("application/vnd.ms-excel")
public Response getExcelDownload(@PathParam("attribute1") String attribute1,
@PathParam("attribute2") String attribute2)
throws IOException, InvalidFormatException, GeneralSecurityException {
HashMap<String, Object> map = new HashMap<>();
List<String> headers = new ArrayList<>();
headers.add("Header 1");
headers.add("Header 2");
headers.add("Header 3");
Map map1 = VEMSUtil.getValueMapSMS("1~2~3", "Value 1", "Value 2", "Value 3");
List<Map<String, String>> valueList = new ArrayList<>();
valueList.add(map1);
map.put("header", headers);
map.put("values", valueList);
final XSSFWorkbook workbook = new XSSFWorkbook();
final OPCPackage opc = workbook.getPackage();
exportExcel(workbook, map);
StreamingOutput fileStream = new StreamingOutput() {
@Override
public void write(java.io.OutputStream output) throws IOException, WebApplicationException {
try {
// For enc
createAndWriteEncryptedWorkbook(workbook, opc, output);
workbook.write(output);
} catch (Exception e) {
}
}
};
ResponseBuilder response = Response.ok(fileStream,
"application/vnd.ms-excelformats-officedocument.spreadsheetml.sheet");
response.header("content-disposition", "attachment; filename=" + System.currentTimeMillis() + ".xlsx");
return response.build();
}
private XSSFWorkbook exportExcel(XSSFWorkbook workbook, HashMap<String, Object> map) throws IOException {
XSSFSheet sheet = workbook.createSheet("Report Sheet");
List<String> headers = (List<String>) map.get("header");
List<Map<String, String>> valueList = (List<Map<String, String>>) map.get("values");
// Create a blank sheet
XSSFRow rowHead = sheet.createRow((short) 0);
for (int i = 0; i < headers.size(); i++) {
rowHead.createCell((short) i).setCellValue(headers.get(i));
}
int rownum = 0;
for (int j = 0; j < valueList.size(); j++) {
rownum = j + 1;
XSSFRow row = sheet.createRow(rownum);
Map<String, String> valueMap = valueList.get(j);
Set<Map.Entry<String, String>> entrySet = valueMap.entrySet();
int colNum = 0;
for (Entry<String, String> entry : entrySet) {
Cell cellFName = row.createCell(colNum, Cell.CELL_TYPE_STRING);
cellFName.setCellValue(entry.getValue());
colNum++;
}
}
sheet.protectSheet(password);
return workbook;
}
private void createAndWriteEncryptedWorkbook(XSSFWorkbook workbook, OPCPackage opc,
OutputStream requestOutputStream) throws IOException {
// populateWorkbook(workbook);
try {
// Add password protection and encrypt the file
POIFSFileSystem fileSystem = new POIFSFileSystem();
opc.save(getEncryptingOutputStream(fileSystem, password));
fileSystem.writeFilesystem(requestOutputStream);
} finally {
// workbook.close();
}
}
private OutputStream getEncryptingOutputStream(POIFSFileSystem fileSystem, String password) throws IOException {
EncryptionInfo encryptionInfo = new EncryptionInfo(EncryptionMode.agile);
Encryptor encryptor = encryptionInfo.getEncryptor();
encryptor.confirmPassword(password);
try {
return encryptor.getDataStream(fileSystem);
} catch (GeneralSecurityException e) {
// TODO handle this better
throw new RuntimeException(e);
}
}
}
import java.io.IOException;
导入java.io.OutputStream;
导入java.security.GeneralSecurityException;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入java.util.Map.Entry;
导入java.util.Set;
导入javax.ws.rs.GET;
导入javax.ws.rs.Path;
导入javax.ws.rs.PathParam;
导入javax.ws.rs.products;
导入javax.ws.rs.WebApplicationException;
导入javax.ws.rs.core.Response;
导入javax.ws.rs.core.Response.ResponseBuilder;
导入javax.ws.rs.core.StreamingOutput;
`导入org.apache.poi.openxml4j.exceptions.InvalidFormatException;
导入org.apache.poi.openxml4j.opc.OPCPackage;
导入org.apache.poi.poifs.crypt.EncryptionInfo;
导入org.apache.poi.poifs.crypt.EncryptionMode;
导入org.apache.poi.poifs.crypt.Encryptor;
导入org.apache.poi.poifs.filesystem.poifsfsystem;
导入org.apache.poi.ss.usermodel.Cell;
导入org.apache.poi.xssf.usermodel.XSSFRow;
导入org.apache.poi.xssf.usermodel.xssfheet;
导入org.apache.poi.xssf.usermodel.xssf工作簿;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
导入com.vems.util.VEMSUtil;
@路径(“/ajaxReport”)
公共类报表控制器{
公共静态记录器Logger=LoggerFactory.getLogger(ReportController.class);
私有静态最终字符串password=“foobar1”;
@得到
@路径(“{attribute1}/{attribute2}”)
@生成(“应用程序/vnd.ms excel”)
公共响应getExcelDownload(@PathParam(“attribute1”)字符串attribute1,
@PathParam(“attribute2”)字符串(attribute2)
抛出IOException、InvalidFormatException、GeneralSecurityException{
HashMap=newHashMap();
列表标题=新建ArrayList();
标题。添加(“标题1”);
标题。添加(“标题2”);
标题。添加(“标题3”);
Map map1=VEMSUtil.getValueMapSMS(“1~2~3”、“值1”、“值2”、“值3”);
List valueList=新的ArrayList();
价值清单。添加(地图1);
地图放置(“标题”,标题);
映射放置(“值”,值列表);
最终XSSF工作簿=新XSSF工作簿();
最终OPCPackage opc=workbook.getPackage();
导出Excel(工作簿、地图);
StreamingOutput fileStream=新的StreamingOutput(){
@凌驾
public void write(java.io.OutputStream output)抛出IOException、WebApplicationException{
试一试{
//对于enc
创建并写入加密工作簿(工作簿、opc、输出);
工作簿。编写(输出);
}捕获(例外e){
}
}
};
ResponseBuilder response=response.ok(文件流,
“application/vnd.ms excelformats officedocument.spreadsheetml.sheet”);
header(“内容处置”、“附件;文件名=“+System.currentTimeMillis()+”.xlsx”);
返回response.build();
}
私有XSSFWorkbook exportExcel(XSSFWorkbook工作簿、HashMap映射)引发IOException{
XSSFSheet sheet=workbook.createSheet(“报告表”);
List headers=(List)map.get(“header”);
List valueList=(List)map.get(“值”);
//创建空白工作表
XSSFRow rowHead=sheet.createRow((短)0);
对于(int i=0;i
那么,如果没有密码保护,它还能工作吗?您是否刚刚尝试将文件保存到生成该文件的本地帖子上的某个路径,以查看它是否打开。我无法测试您的代码,但奇怪的是,createAndWriteEncryptedWorkbook(工作簿、opc、输出)
将加密文件写入OutputStream
,然后写入(输出)代码>写入