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;更是在全球半导体行业中占据了一席之地。…

死锁的四个必要条件

死锁的四个必要条件如下&#xff1a; 互斥条件&#xff08;Mutual Exclusion&#xff09;&#xff1a;资源是独占的&#xff0c;即在同一时间内一个资源只能被一个进程或线程所使用&#xff0c;其他进程或线程无法访问该资源。 请求与保持条件&#xff08;Hold and Wait&#…

钢丝绳输送带详细介绍

钢丝绳输送带&#xff1a;工业巨无霸&#xff0c;助力物流新篇章 在现代化的物流运输领域&#xff0c;钢丝绳输送带以其独特的优势&#xff0c;成为了工业界的巨无霸。它以其强大的承载能力、稳定的运行性能&#xff0c;以及长寿命的特点&#xff0c;赢得了众多行业的青睐。今…

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

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

双例集合(一)——Map接口

双例集合简介 在JDK中&#xff0c;容器可以分为单例集合和双例集合两大类&#xff0c;单例集合用接口Collection来定义其存储特征&#xff0c;而双例集合采用的是Map接口来定义它的存储特征&#xff0c;Map接口与Collection接口是并行的关系。 在具体说明Map接口的作用之前我们…

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…

RedisTemplate的Long类型使用increment自增报错

问题描述 代码如下 Resourceprivate RedisTemplate<String,String > redisTemplate;redisTemplate.opsForValue().set("testKey", 0L); redisTemplate.opsForValue().increment("testKey");工作里用Long类型存储评论数&#xff0c;在使用increment自…

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

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

基础面试题:在数据库中存储密码?

效率工具 推荐一个程序员的常用工具网站&#xff0c;效率加倍嘎嘎好用&#xff1a;程序员常用工具 云服务器 云服务器限时免费领&#xff1a;轻量服务器2核4G腾讯云&#xff1a;2核2G4M云服务器新老同享99元/年&#xff0c;续费同价阿里云&#xff1a;2核2G3M的ECS服务器只需99…

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…

日用百货元宇宙 以科技创新培育产业新质生产力

当前&#xff0c;我国乳品工业的科技创新进入深水区&#xff0c;不仅对科技的需求加大&#xff0c;还具有跨学科、多领域交叉的显著特征&#xff0c;在引领我国乳制品行业现代化产业体系建设过程中&#xff0c;不断催生新产业、新模式、新动能&#xff0c;面向行业未来的新质生…

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

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

BP神经网络反向传播原理【数学原理、举例说明】

反向传播的基本原理 基本概念什么是链式法则&#xff1f;反向传播的过程反向传播步骤举例&#xff1a;具体计算梯度1. 前向传播&#xff1a;2. 计算损失&#xff1a;3. 反向传播&#xff1a; 为什么梯度的方向是函数值增加最快的方向&#xff1f;1. 梯度的直观理解2. 梯度的定义…

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. 利用列表切片…