当前位置: 首页 > news >正文

太原做网站的工作室个人静态网页制作

太原做网站的工作室,个人静态网页制作,h5网站建设代理,普陀区网站建设#x1f49d;#x1f49d;#x1f49d;欢迎来到我的博客#xff0c;很高兴能够在这里和您见面#xff01;希望您在这里可以感受到一份轻松愉快的氛围#xff0c;不仅可以获得有趣的内容和知识#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学… 欢迎来到我的博客很高兴能够在这里和您见面希望您在这里可以感受到一份轻松愉快的氛围不仅可以获得有趣的内容和知识也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 java 核心技术点,如集合,jvm,并发编程 redis,kafka,Spring,微服务,Netty 等常用开发工具系列:罗列常用的开发工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂 非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。 ✨✨ 欢迎订阅本专栏 ✨✨ 博客目录 一.简单介绍1.需求背景2.常见情形 二.基础使用1.Apache POI2.pom 依赖3.具体实现 三.EasyExcel1. EasyExcel2.相关特性3.简单示例 四.进阶使用1. EasyExcelUtil2.EasyExcelWriterFactory3.ExcelUtil4.使用方式5.如何处理不确定的字段?6.需要注意的点 一.简单介绍 1.需求背景 在项目开发过程中很多时候需要用到导出功能将表格中的数据通过导出到 excel 的方式给到业务方核对数据在模版不固定的情况下如何快速的导出数据到 excel 显得尤为关键本文将介绍导出 excel 的方式。 2.常见情形 报表生成 在业务应用中经常需要生成各种形式的报表以便对数据进行汇总、分析和可视化展示。将数据导出到 Excel 文件可以让用户方便地使用 Excel 等工具进行进一步的数据处理和分析。数据备份 导出数据到 Excel 文件是一种常见的备份手段。用户可以定期将系统中的关键数据导出到 Excel以便在需要时进行恢复或迁移。数据交换 在与其他系统或应用程序进行数据交换时导出数据到 Excel 是一种通用的方式。Excel 文件格式是广泛支持的易于在不同系统之间进行数据传递。用户下载 提供给用户下载其个人或业务数据的功能。这对于在线服务、电子商务平台等应用程序是很常见的需求用户可以将其数据保存到本地以备查阅。批量操作 在某些情况下用户可能需要对大量数据进行批量操作例如批量更新、删除或进行其他处理。将数据导出到 Excel用户可以在本地应用程序中更轻松地执行这些操作。报价单、发票等业务文档 在销售和财务领域导出 Excel 可以用于生成报价单、发票和其他业务文档这些文档通常需要以表格形式呈现。数据分享 有时用户可能希望分享特定数据的快照或分析结果。将数据导出到 Excel 文件可以方便地与其他人共享数据。 二.基础使用 1.Apache POI 在 Java 中使用 POI 库Apache POI可以方便地操作 Excel 文件包括导出数据和设置单元格的样式其中包括背景颜色。下面是一个简单的例子演示如何在 Java 中使用 POI 库导出带有背景颜色的 Excel 文件。 2.pom 依赖 首先确保你的项目中包含了 Apache POI 库的依赖。如果使用 Maven可以在 pom.xml 文件中添加以下依赖 dependencies!-- Apache POI --dependencygroupIdorg.apache.poi/groupIdartifactIdpoi/artifactIdversion5.0.0/version/dependency /dependencies3.具体实现 import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileOutputStream; import java.io.IOException;public class ExcelExporter {public static void main(String[] args) {try {// 创建工作簿Workbook workbook new XSSFWorkbook();// 创建工作表Sheet sheet workbook.createSheet(Sheet1);// 创建样式CellStyle style workbook.createCellStyle();style.setFillForegroundColor(IndexedColors.LIGHT_YELLOW.getIndex());style.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 创建行和单元格并设置背景颜色Row row sheet.createRow(0);Cell cell row.createCell(0);cell.setCellValue(内容);cell.setCellStyle(style);// 导出文件try (FileOutputStream fileOut new FileOutputStream(workbook.xlsx)) {workbook.write(fileOut);}// 关闭工作簿workbook.close();} catch (IOException e) {e.printStackTrace();}} }三.EasyExcel 1. EasyExcel 上述使用的原生的 Apache POI 通用性不够强,在某些方面使用起来还是不够方便,接下来将介绍阿里的 EasyExcel 的使用,在 POI 的基础上进行了封装,方便开发者直接使用。 EasyExcel 是阿里巴巴开源的一款基于 Java 的简单、高效的 Excel 文件读写工具。它可以帮助开发者更方便地进行 Excel 文件的读写操作支持读取大数据量的 Excel 文件并且性能较好。 2.相关特性 简单易用 EasyExcel 提供了简单的 API易于上手使用起来相对轻松。高性能 EasyExcel 使用了基于注解的对象模型采用零反射、零异常的设计因此性能较好。在处理大量数据时相比于一些其他库EasyExcel 通常表现更出色。支持读写 Excel 提供了读写 Excel 文件的功能可以实现从 Excel 文件中读取数据也可以将数据写入 Excel 文件。支持多种数据模型 可以支持 Java 普通对象、Map、List 等多种数据模型便于适应不同的数据结构。支持复杂报表 可以实现复杂报表的导入导出包括多表头、合并单元格等。支持自定义样式 可以自定义 Excel 单元格样式包括字体、颜色、边框等。支持多种 Excel 格式 可以读写多种 Excel 格式包括 xls 和 xlsx。 3.简单示例 读取 Excel // 读取 Excel 文件 String fileName example.xlsx; EasyExcel.read(fileName, UserData.class, new UserDataListener()).sheet().doRead();写入 Excel // 写入 Excel 文件 String fileName example.xlsx; ListUserData data initData(); // 初始化数据 EasyExcel.write(fileName, UserData.class).sheet(Sheet1).doWrite(data);监听器示例 public class UserDataListener extends AnalysisEventListenerUserData {// 处理每一行的数据Overridepublic void invoke(UserData data, AnalysisContext context) {System.out.println(Read data: data);}// 所有数据解析完成后调用Overridepublic void doAfterAllAnalysed(AnalysisContext context) {System.out.println(All data parsed successfully.);} }这只是一个简单的示例实际使用中可以根据需求进行更灵活和复杂的配置。EasyExcel 提供了更多的 API 和功能以满足不同场景下的需求。可以通过 EasyExcel 的官方文档和示例代码深入了解其更多功能和用法EasyExcel GitHub 仓库。 四.进阶使用 1. EasyExcelUtil import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcelFactory; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.write.handler.WriteHandler; import org.apache.poi.ss.formula.functions.T;import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.util.List; import java.util.Map; import java.util.Set;public class EasyExcelUtil {/*** 同步无模型读默认读取sheet0,从第2行开始读** param filePath excel文件的绝对路径*/public static ListMapInteger, String syncRead(String filePath) {return EasyExcelFactory.read(filePath).sheet().doReadSync();}/*** 同步无模型读自定义读取sheetX从第2行开始读** param filePath excel文件的绝对路径* param sheetNo sheet页号从0开始*/public static ListMapInteger, String syncRead(String filePath, Integer sheetNo) {return EasyExcelFactory.read(filePath).sheet(sheetNo).doReadSync();}/*** 同步无模型读指定sheet和表头占的行数** param filePath* param sheetNo sheet页号从0开始* param headRowNum 表头占的行数从0开始如果要连表头一起读出来则传0*/public static ListMapInteger, String syncRead(String filePath, Integer sheetNo, Integer headRowNum) {return EasyExcelFactory.read(filePath).sheet(sheetNo).headRowNumber(headRowNum).doReadSync();}/*** 同步无模型读指定sheet和表头占的行数** param inputStream* param sheetNo sheet页号从0开始* param headRowNum 表头占的行数从0开始如果要连表头一起读出来则传0*/public static ListMapInteger, String syncRead(InputStream inputStream, Integer sheetNo, Integer headRowNum) {return EasyExcelFactory.read(inputStream).sheet(sheetNo).headRowNumber(headRowNum).doReadSync();}/*** 同步无模型读指定sheet和表头占的行数** param file* param sheetNo sheet页号从0开始* param headRowNum 表头占的行数从0开始如果要连表头一起读出来则传0*/public static ListMapInteger, String syncRead(File file, Integer sheetNo, Integer headRowNum) {return EasyExcelFactory.read(file).sheet(sheetNo).headRowNumber(headRowNum).doReadSync();} //无JAVA模型读取excel数据//将excel数据同步到JAVA模型属性里/*** 同步按模型读默认读取sheet0,从第2行开始读** param filePath* param clazz 模型的类类型excel数据会按该类型转换成对象*/public static ListT syncReadModel(String filePath, Class clazz) {return EasyExcelFactory.read(filePath).sheet().head(clazz).doReadSync();}/*** 同步按模型读默认表头占一行从第2行开始读** param filePath* param clazz 模型的类类型excel数据会按该类型转换成对象* param sheetNo sheet页号从0开始*/public static ListT syncReadModel(String filePath, Class clazz, Integer sheetNo) {return EasyExcelFactory.read(filePath).sheet(sheetNo).head(clazz).doReadSync();}/*** 同步按模型读指定sheet和表头占的行数** param inputStream* param clazz 模型的类类型excel数据会按该类型转换成对象* param sheetNo sheet页号从0开始* param headRowNum 表头占的行数从0开始如果要连表头一起读出来则传0*/public static ListT syncReadModel(InputStream inputStream, Class clazz, Integer sheetNo, Integer headRowNum) {return EasyExcelFactory.read(inputStream).sheet(sheetNo).headRowNumber(headRowNum).head(clazz).doReadSync();}/*** 同步按模型读指定sheet和表头占的行数** param file* param clazz 模型的类类型excel数据会按该类型转换成对象* param sheetNo sheet页号从0开始* param headRowNum 表头占的行数从0开始如果要连表头一起读出来则传0*/public static ListT syncReadModel(File file, Class clazz, Integer sheetNo, Integer headRowNum) {return EasyExcelFactory.read(file).sheet(sheetNo).headRowNumber(headRowNum).head(clazz).doReadSync();}/*** 同步按模型读指定sheet和表头占的行数** param filePath* param clazz 模型的类类型excel数据会按该类型转换成对象* param sheetNo sheet页号从0开始* param headRowNum 表头占的行数从0开始如果要连表头一起读出来则传0*/public static ListT syncReadModel(String filePath, Class clazz, Integer sheetNo, Integer headRowNum) {return EasyExcelFactory.read(filePath).sheet(sheetNo).headRowNumber(headRowNum).head(clazz).doReadSync();}/*** 异步无模型读默认读取sheet0,从第2行开始读** param excelListener 监听器在监听器中可以处理行数据LinkedHashMap表头数据异常处理等* param filePath 表头占的行数从0开始如果要连表头一起读出来则传0*/public static void asyncRead(String filePath, AnalysisEventListenerT excelListener) {EasyExcelFactory.read(filePath, excelListener).sheet().doRead();}/*** 异步无模型读默认表头占一行从第2行开始读** param filePath 表头占的行数从0开始如果要连表头一起读出来则传0* param excelListener 监听器在监听器中可以处理行数据LinkedHashMap表头数据异常处理等* param sheetNo sheet页号从0开始*/public static void asyncRead(String filePath, AnalysisEventListenerT excelListener, Integer sheetNo) {EasyExcelFactory.read(filePath, excelListener).sheet(sheetNo).doRead();}/*** 异步无模型读指定sheet和表头占的行数** param inputStream* param excelListener 监听器在监听器中可以处理行数据LinkedHashMap表头数据异常处理等* param sheetNo sheet页号从0开始* param headRowNum 表头占的行数从0开始如果要连表头一起读出来则传0*/public static void asyncRead(InputStream inputStream, AnalysisEventListenerT excelListener, Integer sheetNo, Integer headRowNum) {EasyExcelFactory.read(inputStream, excelListener).sheet(sheetNo).headRowNumber(headRowNum).doRead();}/*** 异步无模型读指定sheet和表头占的行数** param file* param excelListener 监听器在监听器中可以处理行数据LinkedHashMap表头数据异常处理等* param sheetNo sheet页号从0开始* param headRowNum 表头占的行数从0开始如果要连表头一起读出来则传0*/public static void asyncRead(File file, AnalysisEventListenerT excelListener, Integer sheetNo, Integer headRowNum) {EasyExcelFactory.read(file, excelListener).sheet(sheetNo).headRowNumber(headRowNum).doRead();}/*** 异步无模型读指定sheet和表头占的行数** param filePath* param excelListener 监听器在监听器中可以处理行数据LinkedHashMap表头数据异常处理等* param sheetNo sheet页号从0开始* param headRowNum 表头占的行数从0开始如果要连表头一起读出来则传0* return*/public static void asyncRead(String filePath, AnalysisEventListenerT excelListener, Integer sheetNo, Integer headRowNum) {EasyExcelFactory.read(filePath, excelListener).sheet(sheetNo).headRowNumber(headRowNum).doRead();}/*** 异步按模型读取默认读取sheet0,从第2行开始读** param filePath* param excelListener 监听器在监听器中可以处理行数据LinkedHashMap表头数据异常处理等* param clazz 模型的类类型excel数据会按该类型转换成对象*/public static void asyncReadModel(String filePath, AnalysisEventListenerT excelListener, Class clazz) {EasyExcelFactory.read(filePath, clazz, excelListener).sheet().doRead();}/*** 异步按模型读取默认表头占一行从第2行开始读** param filePath* param excelListener 监听器在监听器中可以处理行数据LinkedHashMap表头数据异常处理等* param clazz 模型的类类型excel数据会按该类型转换成对象* param sheetNo sheet页号从0开始*/public static void asyncReadModel(String filePath, AnalysisEventListenerT excelListener, Class clazz, Integer sheetNo) {EasyExcelFactory.read(filePath, clazz, excelListener).sheet(sheetNo).doRead();}/*** 异步按模型读取** param inputStream* param excelListener 监听器在监听器中可以处理行数据LinkedHashMap表头数据异常处理等* param clazz 模型的类类型excel数据会按该类型转换成对象* param sheetNo sheet页号从0开始* param headRowNum 表头占的行数从0开始如果要连表头一起读出来则传0*/public static void asyncReadModel(InputStream inputStream, AnalysisEventListenerT excelListener, Class clazz, Integer sheetNo, Integer headRowNum) {EasyExcelFactory.read(inputStream, clazz, excelListener).sheet(sheetNo).headRowNumber(headRowNum).doRead();}/*** 异步按模型读取** param file* param excelListener 监听器在监听器中可以处理行数据LinkedHashMap表头数据异常处理等* param clazz 模型的类类型excel数据会按该类型转换成对象* param sheetNo sheet页号从0开始* param headRowNum 表头占的行数从0开始如果要连表头一起读出来则传0*/public static void asyncReadModel(File file, AnalysisEventListenerT excelListener, Class clazz, Integer sheetNo, Integer headRowNum) {EasyExcelFactory.read(file, clazz, excelListener).sheet(sheetNo).headRowNumber(headRowNum).doRead();}/*** 异步按模型读取** param filePath* param excelListener 监听器在监听器中可以处理行数据LinkedHashMap表头数据异常处理等* param clazz 模型的类类型excel数据会按该类型转换成对象* param sheetNo sheet页号从0开始* param headRowNum 表头占的行数从0开始如果要连表头一起读出来则传0*/public static void asyncReadModel(String filePath, AnalysisEventListenerT excelListener, Class clazz, Integer sheetNo, Integer headRowNum) {EasyExcelFactory.read(filePath, clazz, excelListener).sheet(sheetNo).headRowNumber(headRowNum).doRead();}/*** 无模板写文件** param filePath* param head 表头数据* param data 表内容数据*/public static void write(String filePath, ListListString head, ListListObject data) {EasyExcel.write(filePath).head(head).sheet().doWrite(data);}/*** 无模板写文件** param filePath* param head 表头数据* param data 表内容数据* param sheetNo sheet页号从0开始* param sheetName sheet名称*/public static void write(String filePath, ListListString head, ListListObject data, Integer sheetNo, String sheetName) {EasyExcel.write(filePath).head(head).sheet(sheetNo, sheetName).doWrite(data);}/*** 根据excel模板文件写入文件** param filePath* param templateFileName* param headClazz* param data*/public static void writeTemplate(String filePath, String templateFileName, Class headClazz, List data) {EasyExcel.write(filePath, headClazz).withTemplate(templateFileName).sheet().doWrite(data);}/*** 根据excel模板文件写入文件** param filePath* param templateFileName* param data*/public static void writeTemplate(String filePath, String templateFileName, List data) {EasyExcel.write(filePath).withTemplate(templateFileName).sheet().doWrite(data);}/*** 按模板写文件** param filePath* param headClazz 表头模板* param data 数据*/public static void write(String filePath, Class headClazz, List data) {EasyExcel.write(filePath, headClazz).sheet().doWrite(data);}/*** 按模板写文件** param filePath* param headClazz 表头模板* param data 数据* param sheetNo sheet页号从0开始* param sheetName sheet名称*/public static void write(String filePath, Class headClazz, List data, Integer sheetNo, String sheetName) {EasyExcel.write(filePath, headClazz).sheet(sheetNo, sheetName).doWrite(data);}/*** 按模板写文件** param filePath* param headClazz 表头模板* param data 数据* param writeHandler 自定义的处理器比如设置table样式设置超链接、单元格下拉框等等功能都可以通过这个实现需要注册多个则自己通过链式去调用* param sheetNo sheet页号从0开始* param sheetName sheet名称*/public static void write(String filePath, Class headClazz, List data, WriteHandler writeHandler, Integer sheetNo, String sheetName) {EasyExcel.write(filePath, headClazz).registerWriteHandler(writeHandler).sheet(sheetNo, sheetName).doWrite(data);}/*** 按模板写文件包含某些字段** param filePath* param headClazz 表头模板* param data 数据* param includeCols 包含字段集合根据字段名称显示* param sheetNo sheet页号从0开始* param sheetName sheet名称*/public static void writeInclude(String filePath, Class headClazz, List data, SetString includeCols, Integer sheetNo, String sheetName) {EasyExcel.write(filePath, headClazz).includeColumnFiledNames(includeCols).sheet(sheetNo, sheetName).doWrite(data);}/*** 按模板写文件排除某些字段** param filePath* param headClazz 表头模板* param data 数据* param excludeCols 过滤排除的字段根据字段名称过滤* param sheetNo sheet页号从0开始* param sheetName sheet名称*/public static void writeExclude(String filePath, Class headClazz, List data, SetString excludeCols, Integer sheetNo, String sheetName) {EasyExcel.write(filePath, headClazz).excludeColumnFiledNames(excludeCols).sheet(sheetNo, sheetName).doWrite(data);}/*** 多个sheet页的数据链式写入* ExcelUtil.writeWithSheets(outputStream)* .writeModel(ExcelModel.class, excelModelList, sheetName1)* .write(headData, data,sheetName2)* .finish();** param outputStream*/public static EasyExcelWriterFactory writeWithSheets(OutputStream outputStream) {EasyExcelWriterFactory excelWriter new EasyExcelWriterFactory(outputStream);return excelWriter;}/*** 多个sheet页的数据链式写入* ExcelUtil.writeWithSheets(file)* .writeModel(ExcelModel.class, excelModelList, sheetName1)* .write(headData, data,sheetName2)* .finish();** param file*/public static EasyExcelWriterFactory writeWithSheets(File file) {EasyExcelWriterFactory excelWriter new EasyExcelWriterFactory(file);return excelWriter;}/*** 多个sheet页的数据链式写入* ExcelUtil.writeWithSheets(filePath)* .writeModel(ExcelModel.class, excelModelList, sheetName1)* .write(headData, data,sheetName2)* .finish();** param filePath*/public static EasyExcelWriterFactory writeWithSheets(String filePath) {EasyExcelWriterFactory excelWriter new EasyExcelWriterFactory(filePath);return excelWriter;}/*** 多个sheet页的数据链式写入失败了会返回一个有部分数据的Excel* ExcelUtil.writeWithSheets(response, exportFileName)* .writeModel(ExcelModel.class, excelModelList, sheetName1)* .write(headData, data,sheetName2)* .finish();** param response* param exportFileName 导出的文件名称*/public static EasyExcelWriterFactory writeWithSheetsWeb(HttpServletResponse response, String exportFileName) throws IOException {response.setContentType(application/vnd.ms-excel);response.setCharacterEncoding(utf-8);// 这里URLEncoder.encode可以防止中文乱码String fileName URLEncoder.encode(exportFileName, UTF-8);response.setHeader(Content-disposition, attachment;filename fileName .xlsx);EasyExcelWriterFactory excelWriter new EasyExcelWriterFactory(response.getOutputStream());return excelWriter;} }2.EasyExcelWriterFactory import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter;import java.io.File; import java.io.OutputStream; import java.util.List;public class EasyExcelWriterFactory {private int sheetNo 0;private ExcelWriter excelWriter null;public EasyExcelWriterFactory(OutputStream outputStream) {excelWriter EasyExcel.write(outputStream).build();}public EasyExcelWriterFactory(File file) {excelWriter EasyExcel.write(file).build();}public EasyExcelWriterFactory(String filePath) {excelWriter EasyExcel.write(filePath).build();}/*** 链式模板表头写入** param headClazz 表头格式* param data 数据 ListExcelModel 或者ListListObject* return*/public EasyExcelWriterFactory writeModel(Class headClazz, List data, String sheetName) {excelWriter.write(data, EasyExcel.writerSheet(this.sheetNo, sheetName).head(headClazz).build());return this;}/*** 链式自定义表头写入** param head* param data 数据 ListExcelModel 或者ListListObject* param sheetName* return*/public EasyExcelWriterFactory write(ListListString head, List data, String sheetName) {excelWriter.write(data, EasyExcel.writerSheet(this.sheetNo, sheetName).head(head).build());return this;}/*** 使用此类结束后一定要关闭流*/public void finish() {excelWriter.finish();} }3.ExcelUtil import lombok.extern.slf4j.Slf4j;import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder;/*** className com.yq.common.utils.ExcelUtil* author: yangjie* description: ExcelUtil*/ Slf4j public class ExcelUtil {/*** 下载Excel** param response 请求response* param fileName 下载文件名称 xxx.xlsx* param filePath 下载文件路径 D://xxx/xxx*/public static void downExcel(HttpServletResponse response, String fileName, String filePath) {// path是指想要下载的文件的路径File file new File(filePath);ExcelUtil.downExcel(response, fileName, file);}/*** 下载Excel** param response 请求response* param fileName 下载文件名称 xxx.xlsx* param file 下载文件流*/public static void downExcel(HttpServletResponse response, String fileName, File file) {FileInputStream fileInputStream null;InputStream fis null;OutputStream outputStream null;try {// 将文件写入输入流fileInputStream new FileInputStream(file);fis new BufferedInputStream(fileInputStream);byte[] buffer new byte[fis.available()];fis.read(buffer);fis.close();// 清空responseresponse.reset();// 设置response的Header// 解决跨域问题这句话是关键对任意的域都可以如果需要安全可以设置成安前的域名response.addHeader(Access-Control-Allow-Origin, *);response.addHeader(Access-Control-Allow-Methods, GET, POST, PUT, DELETE);response.setHeader(FileName, URLEncoder.encode(fileName, UTF-8));response.setHeader(Access-Control-Expose-Headers, FileName);response.setCharacterEncoding(UTF-8);//Content-Disposition的作用告知浏览器以何种方式显示响应返回的文件用浏览器打开还是以附件的形式下载到本地保存//attachment表示以附件方式下载 inline表示在线打开 Content-Disposition: inline; filename文件名.mp3// filename表示文件的默认名称因为网络传输只支持URL编码的相关支付因此需要将文件名URL编码后进行传输,前端收到后需要反编码才能获取到真正的名称response.addHeader(Content-Disposition, attachment;filename URLEncoder.encode(fileName, UTF-8));// 告知浏览器文件的大小response.addHeader(Content-Length, file.length());outputStream new BufferedOutputStream(response.getOutputStream());response.setContentType(application/octet-stream);outputStream.write(buffer);outputStream.flush();} catch (IOException e) {e.printStackTrace();log.error(文件下载异常{}, e);} finally {if (fileInputStream ! null) {try {fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}if (fis ! null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}if (outputStream ! null) {try {outputStream.close();} catch (IOException e) {e.printStackTrace();}}}} }4.使用方式 实体类: Data AllArgsConstructor NoArgsConstructor public class AiAssistantForecastVo implements Serializable {private static final long serialVersionUID -2986024804753822180L;ExcelProperty(value 细分品类, index 0)private String presentName;ExcelProperty(value 大区, index 1)private String regionNo;ExcelProperty(value 管理城市, index 2)private String managingCityNo;ExcelProperty(value 店铺, index 3)private String organKey;ExcelProperty(value 指标, index 4)private String indicator;ExcelProperty(value 202336, index 5)private String naturalYearWeek202336; }调用: String fileName xxxx_ System.currentTimeMillis() .xlsx; String tempPath /home/uploads/; String filePath tempPath fileName; EasyExcelWriterFactory res EasyExcelUtil.writeWithSheets(filePath) .writeModel(AiAssistantForecastVo.class, aiAssistantForecastVoList, 报表数据); res.finish(); ExcelUtil.downExcel(response, fileName, filePath);5.如何处理不确定的字段? 通过反射拿到字段。拿到字段后可以拿字段的注解。根据字段注解的属性值可以确定需要填充的是哪个动态的字段。通过使用 Reflect 反射工具类,很好的动态的填充了属性值。 //判断,周数相等的时候,才能塞进去 final Integer naturalYear forecast.getNaturalYear(); final Integer naturalYearWeek forecast.getNaturalYearWeek(); // 获取类的所有字段 Field[] fields aiAssistantForecastVo.getClass().getDeclaredFields(); // 遍历字段 for (Field field : fields) {field.setAccessible(true);// 判断字段上是否有指定的注解if (field.isAnnotationPresent(ExcelProperty.class)) {// 获取字段上的注解ExcelProperty annotation field.getAnnotation(ExcelProperty.class);// 获取注解的属性值final String[] value annotation.value();final String property value[0];if (StringUtils.equals(property, naturalYear.toString() naturalYearWeek.toString())) {try {field.set(aiAssistantForecastVo, Objects.nonNull(Reflect.on(forecast).field(mapValue).get()) ? Reflect.on(forecast).field(mapValue).get().toString() : );} catch (IllegalAccessException e) {e.printStackTrace();}}} }6.需要注意的点 如果是 docker 部署,记得设置挂载地址/home/uploads/ #docker run的时候设置挂载地址 -v /home/uploads:/home/uploads下载时间过长,可能需要设置 nginx 的超时时间 http {proxy_connect_timeout 300; #单位秒proxy_send_timeout 300; #单位秒proxy_read_timeout 300; #单位秒proxy_buffer_size 16k;proxy_buffers 4 64k;proxy_busy_buffers_size 128k;proxy_temp_file_write_size 128k;}觉得有用的话点个赞 呗。 ❤️❤️❤️本人水平有限如有纰漏欢迎各位大佬评论批评指正 如果觉得这篇文对你有帮助的话也请给个点赞、收藏下吧非常感谢! Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧
http://www.dnsts.com.cn/news/53728.html

相关文章:

  • 明星网站开发项目介绍手机网站设计
  • 做高仿网站有哪些广州外贸公司排名前十
  • 学校网站源码html网站建设要什么知识
  • 眼科医院网站做竞价带来的询盘量外贸如何推广
  • 网站建设教程 第十课 cf战队网站制作教程和源码杭州全案设计公司
  • 有哪些做排球比赛视频网站幸福人寿保险公司官方网站
  • 公司网站数媒设计制作做产品类网站
  • 邢台做网站的那好做网站自学
  • 用html制作购物网站wordpress 付费剧集网站
  • 青岛网站制作公司订货商城小程序源码
  • 洛龙区网站制作建设费用海南网站定制
  • 怎么建设一个淘宝客网站谁知道wordpress移动端不显示图片
  • 住房和城乡建设部网站行标建网站签合同
  • 渭南网站建设wordpress 归档页显示文章缩略图
  • 家居定制类网站建设ui设计的基本流程
  • 山西科技网站建设黄冈app下载推广平台官网
  • 重庆网站营销网易企业邮箱服务器怎么设置
  • 优化方案电子版百度seo外包
  • 淘宝推广平台有哪些seo推广优化
  • 万网网站模板下载长沙做彩票网站公司
  • 怎样在设计网站做图赚钱福州seo建站
  • 济南网站建设_美叶网络优秀的公司网站
  • 网站建设亇金手指专业网站建设优化服务渠道
  • 是用cms还是直接用语言写网站网站开发软件有哪
  • 行唐网站建设权威发布公众号封面图片
  • 可以做招商的网站网站建设论文500字
  • 最新站群网络舆情分析案例
  • wordpress网站怎么进入后台门户网站如何制作
  • 玉田住房和建设局网站jsp网站开发难吗
  • 手机网站制作费用多少wordpress图片放大滑动