代码编织梦想

浏览器下载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/*");
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_21880261/article/details/139098283

java读取excel文件汇总-爱代码爱编程

相信很多程序猿朋友碰到上传、读取Excel文件的问题,做个小结,权当是笔记收着吧。          之前做金融报表,是把Excel内嵌到页面中的,技术上采用ZK结合POI读取和插入Excel数据,后台方法比较死,比较程式化。          目前新需求是把Excel表格上传到服务器,读取到里边的数据做处理。    一、首先上传Excel    

web项目,网页上传excel文件并解析实战示例-爱代码爱编程

最近写了一个基于poi解析excel文件的工具类,所以想在web项目中测试一下,就做了这个简单的项目。本项目主要使用了 SpringMVC+RESTful+Maven的风格。适合有一定基础的人员。 源码地址:Web项目,网

poi-excel导入导出工具_mr_hellon的博客-爱代码爱编程

目录 1.添加依赖 2.基本框架准备 3.Application代码 4.ExcelClassField类 5.ExcelUtils类 6.ExcelImport注解 7.ExcelExport注解 8.User类 9.UserController类 1.添加依赖 <!--Excel相关的依赖-->

ssm+vue实现excel表的录入如导出和csv文件的录入_阿珍与阿强的博客-爱代码爱编程

目录 需求需要的依赖后端实现导入excel导入CSV导入 excel导出 前端实现 需求 将excel文件和csv文件进行导入数据库,然后再网页上进行增删改查,然后导出新的excel表 需要的依

【excel导入、导出】pom、实体类、工具类、例子-爱代码爱编程

目录 一、环境搭建: pom: 实体类(ExcelClassField ): 工具类:  二、【示例】导入 controller: service 实体类: 注意:  三、【示例】导出 controller: service 实体类: 动态导出(导出图片) 动态导出(实现下拉列表) 动态导出(横向合并) 动态导出(纵向

将excel文件一键解析为list对象集合-爱代码爱编程

调用代码: @Override public List<VirtualSettleAccountExcelData> importExcel(String accountNo, MultipartFile file) { List<VirtualSettleAccountExcelData> virtualSettle

ubuntu22.04本地部署qwen模型、jupyterlab开发环境、lora微调全流程-爱代码爱编程

接上一篇博客。现在开始准备数据,进行Qwen模型的LoRA微调。 准备微调环境及微调数据 准备微调环境 Qwen微调环境要求为: 降级pydantic为2.0以下 先查看版本: pip show pydantic 可以通过试错的方式验证当前这个包有哪些版本: pip install pydantic== 这里选择1.10.10

用python提取json数据到excel文件中_python json to excel-爱代码爱编程

本文介绍基于Python,读取JSON文件数据,并将JSON文件中指定的键值对数据转换为.csv格式文件的方法。 在之前的文章疯狂学习GIS:Python读取JSON数据并存储为CSV表格中,我们就介绍过将JSON文件数据

uni-爱代码爱编程

一、创建项目         在HbuilderX中点击创建项目,选择uni-starter模板,选择阿里云、Vue3,填写项目名称后点击创建。如果没有下载过uni-starter会自动下载该插件,如下图: 二、 创建云服务器并关联项目         如果是第一次使用,鼠标右击uniCloud(该目录下存储云函数和云对象) ,然后点击关联云服务空间

python中的requests.post的参数json与参数data有什么区别-爱代码爱编程

前言 在我们自己搭建web或者爬虫的时候, 都需要用到requests这个第三方模块, 大部分时候我们使用的都是其中的data参数, 但是偶尔也需要用到json参数. 一般使用都是这样使用: import request

uni-爱代码爱编程

目录 环境变量 配置 页面使用 动态配置manifest.json 创建env文件 创建 vue.config.js  总结 环境变量 uni-app 通过在package.json文件中增加uni-app扩展节点,可实现自定义条件编译平台。 扩展新的平台后,有3点影响: 可以在代码里编写自定义的条件编译,为这个新平台编写