序文
ファイルのダウンロードには多くのシナリオがあります(需要が豊富ではありません〜)。したがって、動的に生成されるファイル、つまりユーザーがファイルのコンテンツを選択すると、サーバーは選択されたデータに従って特定の形式でファイルを生成します、次にそれをクライアントにダウンロードします。1つのコードを直接ダウンロードし、複数のパッケージをダウンロードしてください。
プロジェクトシーン
プロジェクトで優れたデータをエクスポートする必要があり、データはバッチであるため、パッケージ化する必要があります。
解決手順
基本的な実装は次のとおりです。
- makefile
- 一時ディレクトリに保存||メモリにキャッシュ
- ファイルをパッケージとしてダウンロードする
私はナンセンスを話したくありません、ここにコードがあります:
ファイル出力ストリームを直接圧縮ストリームZipOutputStreamに入れます
List<String> fields = new ArrayList<>();
fields.add("字段1");
fields.add("字段2");
fields.add("字段3");
HSSFWorkbook workbook = excelUtil.getNewExcel("压缩文件测试", fields);
try {
response.setContentType("application/zip; charset=UTF-8");
//返回客户端浏览器的版本号、类型
String agent = request.getHeader("USER-AGENT");
String downloadName = "压缩文件测试.zip";
//针对IE或者以IE为内核的浏览器:
if (agent.contains("MSIE") || agent.contains("Trident")) {
downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8");
} else {
downloadName = new String(downloadName.getBytes("UTF-8"), "ISO-8859-1");
}
response.setHeader("Content-disposition", "attachment;filename=" + downloadName);
ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());
//多个从这里就可遍历了
// --start
ZipEntry entry = new ZipEntry("第一个文件名.xls");
zipOutputStream.putNextEntry(entry);
ByteOutputStream byteOutputStream = new ByteOutputStream();
workbook.write(byteOutputStream);
byteOutputStream.writeTo(zipOutputStream);
// zipOutputStream.write(workbook.getBytes());
byteOutputStream.close();
zipOutputStream.closeEntry();
// --end
zipOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
Excelファイルを生成し、次のように貼り付けます。
public static HSSFWorkbook getNewExcel(String formName, List<String> fields) {
//新建excel对象
HSSFWorkbook workbook = new HSSFWorkbook();
//新建工作表
HSSFSheet sheet = workbook.createSheet(formName);
// 设置表格默认列宽度为20个字节
sheet.setDefaultColumnWidth((short) 20);
// 生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
// 生成一个字体
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 12);
//字体应用到当前样式
style.setFont(font);
//创建表格行
HSSFRow row = sheet.createRow(0);
//设置表单名称
row.createCell(0).setCellValue(formName);
if (fields.size() - 1 > 0) {
//合并单元格
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, fields.size() - 1));
}
HSSFRow row1 = sheet.createRow(sheet.getLastRowNum() + 1);
//设置列标题行
for (int i = 0; i < fields.size(); i++) {
row1.createCell(i).setCellValue(fields.get(i));
}
return workbook;
}
いくつかの実用的な要約、訂正することを歓迎します!