json/excel文件上传下载工具方法汇总

文章目录

  • 浏览器下载json文件
  • 浏览器下载excel文件【Workbook】
  • 浏览器导入json文件【ObjectMapper】
  • 浏览器导入excel文件【Workbook】
  • ResourceLoader读取类路径下单个json
  • ResourceLoader读取类路径下所有json文件

浏览器下载json文件

    @Operation(summary = "设备模型导出(带分组)")@PostMapping("/export")public void exportWithGroup(HttpServletRequest request, HttpServletResponse response) {var user = SecurityUtils.getCurrentUser();bizTypeService.exportWithGroup(request, response, user);}@Overridepublic void exportWithGroup(HttpServletRequest request, HttpServletResponse response, SecurityUser user) {// 1. 导出的数据ExportDto exportDto = new ExportDto();exportDto.setTypes(types);exportDto.setGroups(groups);// 2. 下载PrintWriter writer = null;try {response.setContentType("application/octet-stream");response.setCharacterEncoding("utf-8");response.setHeader("content-disposition", "download;filename*=utf-8''" + URLEncoder.encode("device_model_type.json", "UTF-8"));writer = response.getWriter();writer.write(JacksonUtils.writeValueAsString(exportDto)); // 转成string} catch (Exception e) {throw new RuntimeException(e);} finally {writer.close();}}

浏览器下载excel文件【Workbook】

详见ExcelUtils
在这里插入图片描述

     @Overridepublic void exportRunningRecords(HttpServletRequest request, HttpServletResponse response) {// 1.  查询数据     List<RunningRecordsDto> data = resultDto.getItems();// 2. 导出数据List<String> headers = new ArrayList<>();headers.add("设备名称");headers.add("设备编号");headers.add("所属模型");headers.add("安装位置");headers.add("服务范围");headers.add("运行次数");headers.add("运行时长");List<List<Object>> dataList = new ArrayList<>();for (RunningRecordsDto item : data) {List<Object> list = new ArrayList<>();list.add(item.getName());list.add(item.getCode());list.add(item.getTypeName());list.add(item.getLocationName());list.add(item.getServiceArea());list.add(item.getCounts());list.add(item.getDuration());dataList.add(list);}try {// 最后一个参数说明// false: 普通excel文件,无任何格式// true: excel文件第一行为黄色背景,最后一列字体为红色ExcelUtils.generateCreateExcel(headers, dataList, "设备运行记录.xlsx", request, response, true);} catch (Exception e) {log.error("设备运行记录导出异常", e);}}
public class ExcelUtils {/*** 导出最精简的excel.** @param headers       (不是必填) excel头列 比如: 姓名  年龄  性别 ..* @param datas         (必填) 数据列(请确保和列的顺序保持一致)* @param fileName      生成excel的文件名称,如果不传则默认为随机生成* @param request       HttpServletRequest* @param response      HttpServletResponse* @param isCustomStyle 是否自定义样式* @throws IOException io异常*/public static void generateCreateExcel(List<String> headers, List<List<Object>> datas, String fileName,HttpServletRequest request, HttpServletResponse response, Boolean isCustomStyle) throws Exception {Workbook workbook = generateWorkBook(headers, datas, isCustomStyle);// 文件名处理一下//设置编码fileName = new String(((StringUtils.isBlank(fileName) ? UUID.randomUUID().toString() : fileName) + "."+ XSSFWorkbookType.XLSX.getExtension()).getBytes("UTF-8"), "ISO-8859-1");String userAgent = request.getHeader("User-Agent");if (userAgent.toUpperCase().contains("MSIE") || userAgent.toUpperCase().contains("RV:11")) {fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.displayName());} else {fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);}response.reset(); // 清空responseresponse.setContentType(HttpHeaderEnum.FILE_DOWNLOAD_XLSL.getValue());response.setHeader("content-disposition", "attachment;filename=" + fileName);response.setCharacterEncoding("UTF-8");// 文件流输出try {workbook.write(response.getOutputStream());} catch (IOException e) {throw new IOException("could not write to response. cause: ", e);} finally {if (workbook != null) {workbook.close();}}}/*** 生成一个workbook.** @param headers       (不是必填) excel头列 比如: 姓名  年龄  性别 ..* @param data          数据列(请确保和列的顺序保持一致)* @param isCustomStyle 是否自定义样式* @return workbook对象*/public static Workbook generateWorkBook(List<String> headers, List<List<Object>> data, Boolean isCustomStyle) {XSSFWorkbook book = null;// 先创建一发book,并建一个sheetbook = new XSSFWorkbook();XSSFSheet sheet = book.createSheet();CellStyle cellStyle1 = book.createCellStyle();CellStyle cellStyle2 = book.createCellStyle();if (isCustomStyle) {// 设置第一行背景颜色为黄色cellStyle1.setFillForegroundColor(IndexedColors.YELLOW.getIndex());cellStyle1.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 设置最后一列字体为红色Font font = book.createFont();font.setColor(IndexedColors.RED.getIndex());cellStyle2.setFont(font);cellStyle2.setAlignment(HorizontalAlignment.LEFT);cellStyle2.setVerticalAlignment(VerticalAlignment.CENTER);}// 设置自适应列宽List<Integer> maxCalls = getMaxCall(headers, data);for (int i = 0, j = maxCalls.size(); i < j; i++) {// 最大列宽设置if (maxCalls.get(i) > 30) {sheet.setColumnWidth(i, 30 * 256);} else {sheet.setColumnWidth(i, maxCalls.get(i) * 256);}}// 是否有头,如果有则先把表头建好if (CollectionUtils.isNotEmpty(headers)) {// 创建第一行,表头行XSSFRow titleRow = sheet.createRow(0);XSSFCell titleCell = null;XSSFRichTextString titleText = null;// 把表头放到第一个行里面for (int i = 0; i < headers.size(); i++) {titleCell = titleRow.createCell(i);// 给创建的单元格里面设值titleText = new XSSFRichTextString(headers.get(i));titleCell.setCellValue(titleText);if (isCustomStyle) {titleRow.getCell(i).setCellStyle(cellStyle1);}}}// 处理内容if (CollectionUtils.isNotEmpty(data)) {// 如果有列表头则row重1开始。否则重0开始int dataRowIdx = CollectionUtils.isNotEmpty(headers) ? 1 : 0;XSSFRow dataRow = null;XSSFCell dataCell = null;List<Object> dataList = null;// 开始处理行和单元格for (int i = 0; i < data.size(); i++) {// 创建内容的行dataRow = sheet.createRow(i + dataRowIdx);dataList = data.get(i);// 将内容放到对应的行中for (int j = 0; j < dataList.size(); j++) {// 有多少个内容就有多少个单元格dataCell = dataRow.createCell(j);// 设值单元格的值setValue(book, sheet, dataCell, dataList.get(j));}}}if (isCustomStyle) {int lastColumnIndex = headers.size() - 1;for (int i = 0; i <= sheet.getLastRowNum(); i++) {XSSFRow row = sheet.getRow(i);if (row != null) {XSSFCell cell = row.getCell(lastColumnIndex);if (cell != null) {cell.setCellStyle(cellStyle2);}}}}return book;}

浏览器导入json文件【ObjectMapper】

   @Operation(summary = "设备模型导入(带分组)")@PostMapping("/import")public ApiResultDto<BizTypeImportResDto> importWithGroup(MultipartFile file) {var user = SecurityUtils.getCurrentUser();return bizTypeService.importWithGroup(file, user);}@Override@Transactional(rollbackFor = Exception.class)public ApiResultDto<BizTypeImportResDto> importWithGroup(MultipartFile file, SecurityUser user) {// 1. 读取文件内容ObjectMapper objectMapper = new ObjectMapper();ExportModelDto exportModelDto = null;try {exportModelDto = objectMapper.readValue(file.getInputStream(), ExportModelDto.class);} catch (IOException e) {return PagingResultDto.failed(ApiErrorCode.DATA_CORRUPTION, "json数据格式不正确");}}

浏览器导入excel文件【Workbook】

	 @Operation(summary = "批量新增-导入excel")@PostMapping("/batchAdd")public ApiResultDto<?> batchAdd(MultipartFile file) {SecurityUser user = SecurityUtils.getCurrentUser();return locationService.batchAdd(file, user);}// 具体实现@Transactional(rollbackFor = Exception.class)public ApiResultDto<?> batchAdd(MultipartFile file, SecurityUser user) {UUID projectId = SecurityUtils.getCurrentUser().getProjectId();// 1. EXCEL文件校验Workbook workbook;try {String originalFilename = file.getOriginalFilename();if (StringUtils.isBlank(originalFilename)) {return ApiResultDto.failed(ApiErrorCode.VALID_FAILED, "文件名称有误");}String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));if (StringUtils.equals(ModelConstants.EXCEL_POSTFIX, suffix)) {workbook = new XSSFWorkbook(file.getInputStream());} else if (StringUtils.equals(ModelConstants.EXCEL_POSTFIX_XLS, suffix)) {workbook = new HSSFWorkbook(file.getInputStream());} else {return ApiResultDto.failed(ApiErrorCode.BAD_REQUEST, "文件格式错误,支持xls和xlsx格式文件");}} catch (Exception e) {log.error("errMsg", e);return ApiResultDto.failed(ApiErrorCode.BUSINESS_FAILURE, "文件读取失败");}// 2. 获取EXCEL文件内容Sheet sheet = workbook.getSheetAt(workbook.getActiveSheetIndex());List<LocationDto> dtos = new ArrayList<>();for (int i = 1; i <= sheet.getLastRowNum(); i++) {Row row = sheet.getRow(i);final String type = ExcelUtils.getStringCellValue(workbook, row.getCell(0));String bName = ExcelUtils.getStringCellValue(workbook, row.getCell(1));String bSerialNum = ExcelUtils.getStringCellValue(workbook, row.getCell(2));String fName = ExcelUtils.getStringCellValue(workbook, row.getCell(3));String fSerialNum = ExcelUtils.getStringCellValue(workbook, row.getCell(4));      LocationDto dto = new LocationDto();dto.setRemark(remark);dto.setSort(StringUtils.isNotBlank(sort) ? Integer.valueOf(sort) : null);dto.setArea(Objects.nonNull(area) ? Double.valueOf(area) : null);dtos.add(dto);}// 3. 具体业务return ApiResultDto.success();}

ResourceLoader读取类路径下单个json

@Slf4j
@Component
public class ProjectDataBaseInitTask implements ApplicationRunner {/*** 资源加载器.*/@Autowiredprivate ResourceLoader resourceLoader;@Overridepublic void run(ApplicationArguments args) {// 1. 读取json文件InitDbDataDto initDbData = getInitDbDataFromPath("classpath:init/init_property.json");if (Objects.isNull(initDbData)) {return;}}/*** 读取json文件.** @param path 文件路径.* @return 初始化数据类.*/private InitDbDataDto getInitDbDataFromPath(String path) {if (StringUtils.isEmpty(path)) {return null;}Resource resource = resourceLoader.getResource(path);if (!resource.exists()) {log.error("初始化数据不存在");return null;}InitDbDataDto initDbData = null;try {InputStream inputStream = resource.getInputStream();// 判断当前可读取的字节数if (inputStream.available() == 0) {continue;}ObjectMapper objectMapper = new ObjectMapper();initDbData = objectMapper.readValue(inputStream, InitDbDataDto.class);} catch (IOException e) {log.error("读取json文件错误");throw new RuntimeException(e);}return initDbData;}
}

ResourceLoader读取类路径下所有json文件

	/*** 读取classpath:init文件夹下所有json文件.** @param path 文件路径.* @return 初始化数据类.*/private List<InitDbDataDto> getInitDataFromPath(String path) {List<InitDbDataDto> initDbDataDtos = new ArrayList<>();// 1. 读取类路径指定文件夹下所有文件PathMatchingResourcePatternResolver resourceLoader = new PathMatchingResourcePatternResolver();Resource[] resources;try {resources = resourceLoader.getResources(path);} catch (IOException e) {throw new RuntimeException(e);}if (Objects.isNull(resources)) {return initDbDataDtos;}// 2. 解析数据ObjectMapperfor (Resource resource : resources) {InitDbDataDto initDbData = null;try {InputStream inputStream = resource.getInputStream();// 判断当前可读取的字节数if (inputStream.available() == 0) {continue;}ObjectMapper objectMapper = new ObjectMapper();initDbData = objectMapper.readValue(inputStream, InitDbDataDto.class);initDbDataDtos.add(initDbData);} catch (IOException e) {log.error("读取json文件错误");throw new RuntimeException(e);}}return initDbDataDtos;}List<InitDbDataDto> initDbDatas = getInitDataFromPath("classpath:init/*");

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/18186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java源码,MES系统源码,企业生产过程执行系统源码,计划排产管理、生产调度管理、库存管理、质量管理

企业级MES系统源码&#xff0c;生产管理系统源码 MES制造企业生产过程执行系统&#xff0c;是一套面向制造企业车间执行层的生产信息化管理系统。MES可以为企业提供包括制造数据管理、计划排产管理、生产调度管理、库存管理、质量管理、工作中心、设备管理、工具工装管理、采购…

国内半导体龙头企业的自动化转型之旅

在当今高速发展的科技时代&#xff0c;半导体行业正迎来前所未有的挑战与机遇。位于此浪潮前端的&#xff0c;是国内一家领先的半导体集成电路封装测试企业。凭借其规模和创新实力&#xff0c;该公司不仅在国内市场名列前茅&#xff0c;更是在全球半导体行业中占据了一席之地。…

ArcGIS基本操作-常用的空间分析工具梳理

ArcGIS空间分析工具使用 如果我们在进行科研时需要将研究区地形地貌作为一项指标的话&#xff0c;将可能遇到坡度、坡向、地形起伏度、地表切割深度等因子计算&#xff0c;下面我向大家介绍如何利于ArcGIS软件的空间分析工具&#xff0c;基于高程数据&#xff0c;分析重庆市的…

Javascript--词法作用域

词法作用域 词法阶段 大部分标准化语言编辑器的第一个工作阶段叫做词法化&#xff0c;词法化会对源代码中的字符进行检查&#xff0c;如果是有状态的解析过程&#xff0c;还会赋予单词语义。 简单来说&#xff0c;词法作用域就是在词法阶段的作用域&#xff0c; function fo…

错误模块路径: ...\v4.0.30319\clr.dll,v4.0.30319 .NET 运行时中出现内部错误,进程终止,退出代码为 80131506。

全网唯一解决此BUG的文章&#xff01;&#xff01;&#xff01; 你是否碰到了以下几种问题&#xff1f;先说原因解决思路具体操作1、首先将你C:\Windows\Microsoft.NET\文件夹的所有者修改为你当前用户&#xff0c;我的是administrator。2、修改当前用户权限。3、重启电脑4、删…

前端Vue小兔鲜儿电商项目实战Day01

一、项目介绍 1. 项目技术栈 2. 项目规模 3. 项目亮点 4. 课程安排 5. 适合人群 二、Vue3组合式API体验 1. 通过一个Counter案例体验Vue3新引入的组合式API ①Vue2的代码 <template><button click"addCount"> {{ count }}</button> </templ…

GPT-4o和GPT-4有什么区别?我们还需要付费开通GPT-4?

GPT-4o 是 OpenAI 最新推出的大模型&#xff0c;有它的独特之处。那么GPT-4o 与 GPT-4 之间的主要区别具体有哪些呢&#xff1f;今天我们就来聊聊这个问题。 目前来看&#xff0c;主要是下面几个差异。 响应速度 GPT-4o 的一个显著优势是其处理速度。它能够更快地回应用户的查…

SCI一区 | Matlab实现PSO-TCN-LSTM-Attention粒子群算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现PSO-TCN-LSTM-Attention粒子群算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现PSO-TCN-LSTM-Attention粒子群算法优化时间卷积长短期记忆神经网络融合注意力机制多变量时间序列预测预测效果基本介绍程序设…

双指针技巧,链表

双指针链表 虚拟头节点双指针&#xff0c;都要用虚拟1头节点 合并两个有序链表 设置双指针&#xff0c;都指向虚拟头节点 ListNode list1 代表的是头节点 class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode dummynew ListNode(-1…

windows帐户自动被锁定解决方法

处理方法方法一&#xff1a; 运行-gpedit.msc&#xff0c;打开组策略&#xff0c; 处理方法方法二&#xff1a; 运行-gpedit.msc&#xff0c;打开组策略&#xff0c; 在本地组策略编辑器页面中&#xff0c;选择计算机配置 > Windows设置 > 安全设置 > 账户策略 > 账…

C语言学习笔记之结构篇

C语言是一门结构化程序设计语言。在C语言看来&#xff0c;现实生活中的任何事情都可看作是三大结构或者三大结构的组合的抽象&#xff0c;即顺序&#xff0c;分支&#xff08;选择&#xff09;&#xff0c;循环。 所谓顺序就是一条路走到黑&#xff1b;生活中在很多事情上我们都…

寒冬来了,字节跳动开启裁员新模式。。

大家好&#xff0c;我是白露啊。 不得不说&#xff0c;字节跳动还是真的会搞事啊。 最近一段时间&#xff0c;字节搞出了一个裁员新模式&#xff1a;“细水长流”。这个寓意和“财&#xff08;裁&#xff09;源&#xff08;员&#xff09;广进”计划差不多了&#xff0c;只不…

python如何巧妙地利用内置函数与列表切片组织舞会派对

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、问题分析 三、解决方案 1. 利用内置函数创建参会人员名单 2. 利用列表切片…

Redis 事件机制 - AE 抽象层

Redis 服务器是一个事件驱动程序&#xff0c;它主要处理如下两种事件&#xff1a; 文件事件&#xff1a;利用 I/O 复用机制&#xff0c;监听 Socket 等文件描述符上发生的事件。这类事件主要由客户端&#xff08;或其他Redis 服务器&#xff09;发送网络请求触发。时间事件&am…

YashanDB携手慧点科技完成产品兼容认证 助力国产信创生态建设

近日&#xff0c;深圳计算科学研究院崖山数据库系统YashanDB与慧点科技顺利完成兼容性互认证。经严格测试&#xff0c;双方产品完全兼容&#xff0c;稳定运行&#xff0c;共同支撑政府、企业、金融等办公应用场景下的数字化转型升级&#xff0c;为企业的信息技术应用创新提供坚…

【计算机视觉(4)】

基于Python的OpenCV基础入门——色彩空间转换 色彩空间简介HSV色彩空间GRAY色彩空间色彩空间转换 色彩空间转换代码实现: 色彩空间简介 色彩空间是人们为了表示不同频率的光线的色彩而建立的多种色彩模型。常见的色彩空间有RGB、HSV、HIS、YCrCb、YUV、GRAY&#xff0c;其中最…

基于Matlab的车道线检测系统 (文末有代码获取链接)【含Matlab源码 MX_001期】

运行环境&#xff1a;Matlab2014b 部分代码&#xff1a; %% 视频流循环处理 % 创建一个循环过程来对给定视频进行车道线检测 % 该循环使用之前初始化的系统对象 warningTextColors {[1 0 0], [1 0 0], [0 0 0], [0 0 0]}; while ~isDone(hVideoSrc) RGB step(hVideoSrc);% …

SpringBoot使用redis结合mysql数据库(黑名单)渲染商品详情界面

目录 一、界面效果 二、前端代码 三、后端代码&#xff08;redisblacklist&#xff09; 3.1 ProducatController 3.2 ProductService 3.3 ProductDao 3.4 映射文件 一、界面效果 二、前端代码 商品详情前端代码 <template><van-nav-bartitle"商品详情&quo…

【FixBug】超级大Json转POJO失败

今天遇到了一个问题&#xff1a;使用Jackson将一个超级大的JSON字符串转换POJO失败&#xff0c;debug看没问题&#xff0c;将JSON字符串粘贴到main方法中测试&#xff0c;提示错误信息如下&#xff1a; 自己猜测是因为字符串超长导致转换时先截断字符串导致JSON格式不正确&…

微服务架构-分支微服务设计模式

微服务架构-分支微服务设计模式 这种模式是聚合器模式的扩展&#xff0c;允许同时调用两个微服务链 分支微服务设计模式是一种用于构建大型系统的微服务架构模式&#xff0c;其核心思想是 将复杂的业务逻辑拆解为多个小的、相互独立的子系统&#xff0c;每个子系统由一个或多…