JAva Excel動的テンプレートファイル圧縮パッケージのダウンロード
6465 ワード
1プロジェクトによって必要とされ、ダイナミックテンプレート圧縮パッケージをダウンロードする機能が必要であり、実現過程はいくつかのステップに分かれている.
1)テンプレートファイルをロードし、テンプレートファイルをワークブックオブジェクトにカプセル化し、業務の必要に応じて関連データを相応の位置に書く
2)workbookオブジェクトのwriteメソッドを呼び出し,変更したExcelファイルを出力ストリームを介して一時的なExcelファイルに書き込む.
3)Java JDKが持参したZipoutputStreamは中国語が文字化けしてしまうので、apacheのZipoutputStreamを使って一時Excelファイルを圧縮する
4)Excel圧縮ファイルをバイトストリーム形式でクライアントに書き込む
5)各種流を閉じる
6)Excel一時ファイルおよび圧縮パッケージのクリア
実装コードは次のとおりです.
1)テンプレートファイルをロードし、テンプレートファイルをワークブックオブジェクトにカプセル化し、業務の必要に応じて関連データを相応の位置に書く
2)workbookオブジェクトのwriteメソッドを呼び出し,変更したExcelファイルを出力ストリームを介して一時的なExcelファイルに書き込む.
3)Java JDKが持参したZipoutputStreamは中国語が文字化けしてしまうので、apacheのZipoutputStreamを使って一時Excelファイルを圧縮する
4)Excel圧縮ファイルをバイトストリーム形式でクライアントに書き込む
5)各種流を閉じる
6)Excel一時ファイルおよび圧縮パッケージのクリア
実装コードは次のとおりです.
Workbook wb = null;
try {
List<DivisionMapDto> divisionMapList = divisionMapController.getDivisionMapInfo(memberId, taskId);
if(null == divisionMapList || divisionMapList.size() == 0){
throw new BadRequestException("400"," ");
}
String excelTemplateName = reportType + "ValidateTemplate.xlsx";
FileSystemConfigReaderImpl configReader = (FileSystemConfigReaderImpl) ConfigUtil.getConfigReader();
String basePath = configReader.getBasePath();
String separator = System.getProperty("file.separator");
basePath = basePath + separator;
String fileName = basePath + excelTemplateName;
wb = new XSSFWorkbook(new FileInputStream(fileName));
Sheet sheet = wb.getSheetAt(0);
if(sheet == null){
throw new BadRequestException("400"," sheet , ,reportType=" + reportType);
}
int[] divisionColumnIndexs = ExcelColumnMatchUtils.getDivsionInfoLocation(reportType);
if(divisionColumnIndexs[0] == -1 || divisionColumnIndexs[1] == -1){
throw new BadRequestException("400"," , , ,reportType=" + reportType);
}
//excel writingCount
DivisionMapDto divisionMapDto = null;
Cell cell = null;
Row row = null;
int rowNum = sheet.getLastRowNum();
for(int i = 0 ; i < divisionMapList.size(); i++){
divisionMapDto = divisionMapList.get(i);
if(null == divisionMapDto){
continue;
}
rowNum++;
row = sheet.createRow(rowNum);
//
cell = row.createCell(divisionColumnIndexs[0]);
cell.setCellValue(divisionMapDto.getLocalCode());
//
cell = row.createCell(divisionColumnIndexs[1]);
cell.setCellValue(divisionMapDto.getLocalName());
//
if(divisionColumnIndexs[2] != -1){
cell = row.createCell(divisionColumnIndexs[2]);
cell.setCellValue(divisionMapDto.getStandardCode());
}
//
if(divisionColumnIndexs[3] != -1){
cell = row.createCell(divisionColumnIndexs[3]);
cell.setCellValue(divisionMapDto.getStandardName());
}
}
String reportName = null;
try{
reportName = reportListController.getReportNameByReportType(reportType);
} catch (CarsmartException e){
logger.error(" ", e);
}
reportName = reportName == null ? " " : reportName;
String tempFileName = basePath + reportName + ".xlsx";
FileOutputStream fos = new FileOutputStream(new File(tempFileName));
wb.write(fos);
reportName += ".zip";
String zipFileName = basePath + reportName;
try{
zipFile(zipFileName, tempFileName);
} catch (Exception e){
logger.error(" ", e);
}
// IE
//URLEncoder.encode(reportName, "UTF-8")
response.addHeader("Content-Disposition", "attachment; filename=" + new String(reportName.getBytes("gb2312"), "iso-8859-1"));
response.setContentType("application/octet-stream");
OutputStream outputStream = response.getOutputStream();
BufferedInputStream bin = new BufferedInputStream(new FileInputStream(zipFileName));
byte[] buf = new byte[1024];
int len = 0;
while((len = bin.read(buf)) > 0){
outputStream.write(buf,0,len);
}
outputStream.flush();
outputStream.close();
bin.close();
//
File file = new File(zipFileName);
if(file.exists()){
file.delete();
}
//
file = new File(tempFileName);
if(file.exists()){
file.delete();
}
return null;
} catch (CarsmartException e) {
logger.error(" ", e);
return null;
} catch (IOException e){
logger.error(" IO ", e);
return null;
}
/**
* @Description
* @param out
* @param f
* @param base
* @param first
* @throws Exception
*/
private void zip(ZipOutputStream out, File f, String base,
boolean first) throws Exception {
if (first) {
if (f.isDirectory()) {
out.putNextEntry(new ZipEntry("/"));
base = base + f.getName();
first = false;
} else
base = f.getName();
}
if (f.isDirectory()) {
File[] fl = f.listFiles();
base = base + "/";
for (int i = 0; i < fl.length; i++) {
zip(out, fl[i], base + fl[i].getName(), first);
}
} else {
out.putNextEntry(new ZipEntry(base));
FileInputStream in = new FileInputStream(f);
int b;
while ((b = in.read()) != -1) {
out.write(b);
}
in.close();
}
}
/**
* @Description
* @param zipFileName
* @param inputFileName
* @throws Exception
*/
private void zipFile(String zipFileName, String inputFileName)
throws Exception {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
out.setEncoding("gbk");//
File inputFile = new File(inputFileName);
zip(out, inputFile, "", true);
out.close();
}