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);
    }
    
     @Override
    public 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
在这里插入图片描述

     @Override
    public 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(); // 清空response
        response.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,并建一个sheet
        book = 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 {

   /**
    * 资源加载器.
    */
   @Autowired
   private ResourceLoader resourceLoader;

   @Override
   public 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. 解析数据ObjectMapper
        for (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/*");

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详解Java ThreadLocal

个人博客 详解Java ThreadLocal | iwts’s blog Java ThreadLocal ThreadLocal提供了线程内存储变量的能力&#xff0c;这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。通过get和set方法就可以得到当前线程对应的值。 TreadLocal存储模型 ThreadLocal的静态…

使用WebStorm如何调试Vue代码

大家好&#xff0c;我是咕噜铁蛋。今天&#xff0c;我想和大家分享一下如何使用WebStorm这款强大的IDE&#xff08;集成开发环境&#xff09;来调试Vue代码。Vue.js作为现代前端开发的利器&#xff0c;其强大的组件化开发能力和简洁的API深受开发者喜爱。然而&#xff0c;随着项…

D2Admin:企业中后台产品前端集成方案的探索与实践

D2Admin&#xff1a;企业中后台产品前端集成方案的探索与实践 摘要&#xff1a;随着企业信息化建设的不断深入&#xff0c;中后台管理系统的前端技术选型与集成方案成为了关键。D2Admin作为一款完全开源免费的前端集成方案&#xff0c;通过采用最新的前端技术栈&#xff0c;提…

pdf编辑器推荐,这三款软件十分好用!

在数字化时代&#xff0c;PDF文档因其跨平台、易阅读的特性&#xff0c;成为了我们工作、学习、生活中不可或缺的一部分。然而&#xff0c;如何高效、便捷地编辑PDF文档&#xff0c;却成为许多人面临的难题。今天&#xff0c;就为大家推荐三款十分好用的PDF编辑器&#xff0c;让…

C++学习---string模拟实现(2)

1.随机插入一个字符串 &#xff08;1&#xff09;insert函数插入一个字符的方法我们在之前的模拟实现里面已经搞过了&#xff0c;那个里面要注意的是这个全体向后挪动的循环过程&#xff0c;这个里面我们要实现的是插入字符串的模拟实现&#xff1b; &#xff08;2&#xff0…

【算法】前缀和——前缀和

本题主要用一个模板题目来说明前缀和的基本思想&#xff0c;有需要借鉴即可。 目录 1.题目2.前缀和2.1题目分析2.2前缀和算法第一步&#xff0c;先预处理一个前缀数组第二步&#xff0c;由题计算得结果 3.代码示例4.总结 1.题目 题目链接&#xff1a;LINK 这个题目可以用暴力…

c 的库函数有哪些

C语言的库函数非常丰富&#xff0c;涵盖了多种功能&#xff0c;为程序员提供了大量的工具来完成各种任务。以下是一些主要的C语言库函数及其分类&#xff1a; 标准输入输出函数&#xff1a; printf()&#xff1a;用于输出格式化的数据到标准输出设备。scanf()&#xff1a;用于…

数字化农业新时代:图扑农林牧综合监控平台

利用图扑自研 HT for Web GIS 产品&#xff0c;结合遥感技术&#xff0c;构建可交互式的农林牧数据分析平台。该平台围绕地块总览、播种分析、牛只管理、设备查询四个维度&#xff0c;对地区的全貌、农场、村集体分布以及相应的环境进行多样化的可视化展示和进行数据支持&#…

网站报价明细

随着互联网的快速发展和普及&#xff0c;网站建设已经成为越来越多企事业单位必备的基础设施之一。作为企业展示形象和运营业务的重要平台&#xff0c;网站对于企业发展起着举足轻重的作用。因此&#xff0c;网站报价明细在企业进行网站建设时尤为重要。 网站报价明细是指在网站…

Java多线程(02)

一、如何终止线程 终止线程就是要让 run 方法尽快执行结束 1. 手动创建标志位 可以通过在代码中手动创建标志位的方式&#xff0c;来作为 run 方法的执行结束条件&#xff1b; public static void main(String[] args) throws InterruptedException {boolean flag true;Thr…

邦注科技三机一体除湿干燥机在工业中的应用

三机一体除湿干燥机在工业中的应用广泛且重要&#xff0c;其结合了传统除湿机、冷凝器和加热器的功能&#xff0c;具有节能、环保、方便等特点。以下是关于三机一体除湿干燥机在工业中应用的详细解析&#xff1a; 一、应用领域 电子制造行业&#xff1a;在半导体、集成电路和…

超清高帧,成像升级 | SWIR短波红外相机500万像素992芯片

博图光电5MP短波红外相机&#xff0c;搭载了索尼IMX992 SenSWIR传感器&#xff0c;支持5.2MP分辨率&#xff0c;适合探测波长在400nm-1700nm波段的可见光和短波红外光&#xff0c;有效面积和透光率得到提升&#xff0c;内置TEC制冷片&#xff0c;实现了像素尺寸和图像均匀性方面…

重学java 49 增强for

知之俞明&#xff0c;则行之越笃&#xff1b;行之愈笃&#xff0c;则知之愈益&#xff1b; —— 24.5.28 一、基本使用 1.作用: 遍历集合或者数组 2.格式: for(元素类型 变量名:要遍历的集合名或者数组名) 变量名就是代表的每一个元素 3.快捷键: 集合名或者数组名.for package …

AI大模型如何“开窍”?算法、数据与架构的三重奏

一、算法创新 1. 探索新的学习范式 自监督学习&#xff1a;利用未标注数据让模型自我学习&#xff0c;提高模型的泛化能力。元学习&#xff1a;让模型学会如何学习&#xff0c;以便在不同任务之间快速迁移。强化学习&#xff1a;通过试错与奖励机制&#xff0c;使模型在与环境…

外贸仓库管理软件:海外仓效率大幅度提升、避免劳动力积压

随着外贸业务的不断发展&#xff0c;如何高效管理外贸仓库&#xff0c;确保货物顺利流转&#xff0c;订单顺利处理&#xff0c;就变得非常重要。 现在通常的解决方案都是通过引入外贸仓库管理软件&#xff0c;也就是我们常说的海外仓WMS系统来解决。 今天我们就系统的探讨一下…

langchian进阶二:LCEL表达式,轻松进行chain的组装

LangChain表达式语言-LCEL&#xff0c;是一种声明式的方式&#xff0c;可以轻松地将链条组合在一起。 你会在这些情况下使用到LCEL表达式: 流式支持 当你用LCEL构建你的链时&#xff0c;你可以得到最佳的首次到令牌的时间(输出的第一块内容出来之前的时间)。对于一些链&#…

Rust最新版安装(v1.78.0+)

系统&#xff1a;Windows 11 专业版 23H2rustc&#xff1a;1.78.0 配置环境变量和设置配置文件 新建文件夹“C:\Rust\Rustup”和“C:\Rust\Cargo”。【以管理员身份运行】打开CMD 设置系统环境变量&#xff0c;如下设置RUSTUP_DIST_SERVER&#xff0c;其余同理 C:\Windows\S…

钡铼PLC集成BL121PO协议网关优化电子制造产线的生产效率

PLC转OPC UA协议转换网关BL121PO在电子制造产线中的优化应用&#xff0c;可以显著提高生产效率&#xff0c;促进生产线的智能化和信息化发展。本文将从以下几个方面进行阐述&#xff1a; 提高设备间通信效率&#xff1a;PLC转OPC UA协议转换网关BL121PO通过高效的协议转换&…

Keras深度学习框架第十九讲:在 KerasCV 中使用CutMix、MixUp 和 RandAugment 图像增强技术

1、绪论 1.1 图像增强的主流方法 CutMix CutMix 是一种图像增强技术&#xff0c;它通过从另一幅图像中随机裁剪一个区域并粘贴到当前图像上来创建新的训练样本。同时&#xff0c;标签也会按照两个图像中裁剪区域的比例进行混合。这种方法有助于模型学习如何处理部分遮挡的情…

VScode代码片段自动转图标

注&#xff1a;在VScode编辑器中&#xff0c;编辑html、vue等文件时&#xff0c;特定代码片段&#xff08;token/xxx’等&#xff09;自动转图标显示&#xff0c;按住“ctrl鼠标左键”还可跳转“https://icones.js.org/collections”&#xff0c;个人感觉干扰代码编写&#xff…