iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java怎么用EasyExcel解析动态表头并导出
  • 283
分享到

Java怎么用EasyExcel解析动态表头并导出

2023-07-04 18:07:47 283人浏览 八月长安
摘要

本文小编为大家详细介绍“Java怎么用Easyexcel解析动态表头并导出”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么用EasyExcel解析动态表头并导出”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知

本文小编为大家详细介绍“Java怎么用Easyexcel解析动态表头并导出”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么用EasyExcel解析动态表头并导出”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

前端下载

  const download = () => {    axiOS({      method: 'GET',      url: config.Http.baseUrl + '/templateDownload',      responseType: 'blob',    })      .then(function (res) {      const content = res.data      const blob = new Blob([content], { type: "application/application/vnd.openxmlfORMats-officedocument.spreadsheetml.sheet" })      const downloadElement = document.createElement("a");      const href = window.URL.createObjectURL(blob);      downloadElement.href = href;      downloadElement.download = decodeURI(res.headers['filename']);      document.body.appendChild(downloadElement);      downloadElement.click();      document.body.removeChild(downloadElement); // 下载完成移除元素      window.URL.revokeObjectURL(href); // 释放掉blob对象    })  }

模板下载

excel文件导入功能,常常需要进行模板下载,在SpringBoot项目中,程序是以jar包的形式运行的,所以有很多小伙伴常常

遇到在本地开发中能够实现下载功能,但部署到服务器的时候,找不到模板文件的问题。

@Overridepublic void templateDownload(httpservletResponse response, HttpServletRequest request) {    //获取要下载的模板名称    String fileName = "批量导入模板.xlsx";    //获取文件下载路径    String filePath = "/template/template.xlsx";    TemplateDownloadUtil.download(response, request, fileName, filePath);}
import lombok.extern.slf4j.Slf4j;import org.springframework.core.io.ClassPathResource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.InputStream;import java.io.OutputStream;import java.net.URLEncoder;@Slf4jpublic class TemplateDownloadUtil {    public static void download(HttpServletResponse response, HttpServletRequest request,String fileName,String filePath){        try {            response.setContentType("application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");            response.setCharacterEncoding("utf-8");            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));            response.setHeader("filename", URLEncoder.encode(fileName, "UTF-8"));            response.setHeader("Access-Control-Expose-Headers", "filename,Content-Disposition");                      //获取文件的路径,此方式本地开发可以运行,服务器无法获取文件//            String filePath = getClass().getResource("/template/template.xlsx").getPath();//            FileInputStream input = new FileInputStream(filePath);                    //在服务器中能够读取到模板文件            ClassPathResource resource = new ClassPathResource(filePath);            InputStream input = resource.getInputStream();            OutputStream out = response.getOutputStream();            byte[] b = new byte[2048];            int len;            while ((len = input.read(b)) != -1) {                out.write(b, 0, len);            }            //修正 Excel在“xxx.xlsx”中发现不可读取的内容。是否恢复此工作薄的内容?如果信任此工作簿的来源,请点击"是"//            response.setHeader("Content-Length", String.valueOf(input.getChannel().size()));            input.close();        } catch (Exception e) {            log.error("下载模板失败 :", e);        }    }}

EasyExcel动态表头解析

EasyExcel简单的读文件,官网中已经有详细的说明,本文不再赘述。

本文主要针对笔者遇到的复杂表头及动态表头进行讲解。

模板示例

Java怎么用EasyExcel解析动态表头并导出

解析

import com.alibaba.excel.context.AnalysisContext;import com.alibaba.excel.event.AnalysisEventListener;import com.alibaba.fastJSON.jsON;import com.alibaba.fastjson.JSONObject;import lombok.Data;import lombok.extern.slf4j.Slf4j;import java.time.LocalDateTime;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.stream.Collectors;@Slf4j@Datapublic class BatchReadListener extends AnalysisEventListener<Map<Integer, String>> {        private static final int BATCH_COUNT = 500;    //Excel数据缓存结构    private List<Map<Integer, Map<Integer, String>>> list = new ArrayList<>();    //Excel表头(列名)数据缓存结构    private Map<Integer, String> headTitleMap = new HashMap<>();        private DbFileBatchService dbFileBatchService;    private DbFileContentService dbFileContentService;    private FileBatch fileBatch;    private int total = 0;        public BatchReadListener(DbFileBatchService dbFileBatchService, DbFileContentService dbFileContentService, FileBatch fileBatch) {        this.dbFileBatchService = dbFileBatchService;        this.dbFileContentService = dbFileContentService;        this.fileBatch = fileBatch;    }        @Override    public void invoke(Map<Integer, String> data, AnalysisContext context) {        log.info("解析到一条数据:{}", JSON.toJSONString(data));        total++;        Map<Integer, Map<Integer, String>> map = new HashMap<>();        map.put(context.readRowHolder().getRowIndex(), data);        list.add(map);        // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM        if (list.size() >= BATCH_COUNT) {            saveData();            // 存储完成清理 list            list.clear();        }    }        @Override    public void doAfterAllAnalysed(AnalysisContext context) {        // 这里也要保存数据,确保最后遗留的数据也存储到数据库        saveData();        log.info("所有数据解析完成!");    }        @Override    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {        log.info("表头数据:{}", JSONObject.toJSONString(headMap));        headTitleMap = headMap;    }        private void saveData() {        log.info("{}条数据,开始存储数据库!", list.size());        FileContent fileContent = null;        List<FileContent> fileContentList = list.stream().flatMap(            integerMap -> integerMap.entrySet().stream().map(entrySet -> {                //entrySet.geTKEy()获取的是内容的RowIndex,实际的行数需要根据表头数进行处理                Integer rowIndex = entrySet.getKey();                Map<Integer, String> value = entrySet.getValue();                log.info(JSONObject.toJSONString(value));                fileContent = new FileContent();                fileContent.setBatchId(fileBatch.getId());                fileContent.setBatchNo(fileBatch.getBatchNo());                //固定字段入库                fileContent.setName(value.get(0) != null ? value.get(0).trim() : "");                fileContent.setCertNo(value.get(1) != null ? value.get(1).trim() : "");                fileContent.setRealAmount(value.get(2) != null ? value.get(2).trim() : "");                //所有动态表头数据转为JSON串入库                fileContent.setFieldsValue(JSONObject.toJSONString(value));                //取实际的内容rowIndex                fileContent.setRowNum(rowIndex + 1);                fileContent.setCreateTime(LocalDateTime.now());                return xcSalaryFileContent;        }        )).collect(Collectors.toList());        log.info(JSONObject.toJSONString(fileContentList));        dbFileContentService.saveBatch(fileContentList);        log.info("存储数据库成功!");    }}
    BatchReadListener listener = new BatchReadListener(dbFileBatchService, dbFileContentService, fileBatch);    try {        //注:headRowNumber默认为1,现赋值为2,即从第三行开始读取内容        EasyExcel.read(fileInputStream, listener).headRowNumber(2).sheet().doRead();    } catch (Exception e) {        log.info("EasyExcel解析文件失败,{}", e);        throw new CustomException("文件解析失败,请重新上传");    }    //获取表头信息进行处理    Map<Integer, String> headTitleMap = listener.getHeadTitleMap();    //获取动态表头信息    List<String> headList = headTitleMap.keySet().stream().map(key -> {        String head = headTitleMap.get(key);        log.info(head);        return head == null ? "" : head.replace("*", "");    }).collect(Collectors.toList());    //可以对表头进行入库保存,方便后续导出

综上,动态表头即可完成解析。

EasyExcel动态表头导出

导出示例

Java怎么用EasyExcel解析动态表头并导出

获取动态头

     private List<List<String>> getFileHeadList( FileBatch fileBatch) {         String head = fileBatch.getFileHead();         List<String> headList = Arrays.asList(head.split(","));         List<List<String>> fileHead = headList.stream().map(item -> concatHead(Lists.newArrayList(item))).collect(Collectors.toList());         fileHead.add(concatHead(Lists.newArrayList("备注")));         return fileHead;     }
    private List<String> concatHead(List<String> headContent) {        String remake = "填写须知:                                                                                                \n" +                "1.系统自动识别Excel表格,表头必须含有“企业账户号”、“企业账户名”、“实发金额”;\n" +                "2.带 “*” 为必填字段,填写后才能上传成功;\n" +                "3.若需上传其他表头,可自行在“实发金额”后添加表头,表头最多可添加20个,表头名称请控制在8个字以内;\n" +                "4.填写的表头内容不可超过30个字;\n" +                "5.实发金额支持填写到2位小数;\n" +                "6.每次导入数据不超过5000条。\n" +                "\n" +                "注:请勿删除填写须知,删除后将导致文件上传失败\n" +                "\n" +                "表头示例:";        headContent.add(0, remake);        return headContent;    }

获取数据

    List<FileContent> fileContentList = dbFileContentService.list(        Wrappers.<FileContent>lambdaQuery()        .eq(FileContent::getBatchId, fileBatch.getId())        .orderByAsc(FileContent::getRowNum)    );    List<List<Object>> contentList = fileContentList.stream().map(fileContent -> {        List<Object> rowList = new ArrayList<>();        String fieldsValue = fileContent.getFieldsValue();        JSONObject contentObj = JSONObject.parseObject(fieldsValue);        for (int columnIndex = 0 , length = headList.size(); columnIndex < length; columnIndex++) {            Object content = contentObj.get(columnIndex);            rowList.add(content == null ? "" : content);        }        rowList.add(fileContent.getCheckMessage());        return rowList;    }).collect(Collectors.toList());

单元格格式设置

import com.alibaba.excel.metadata.data.DataFormatData;import com.alibaba.excel.metadata.data.WriteCellData;import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;import com.alibaba.excel.write.metadata.style.WriteCellStyle;import com.alibaba.excel.write.metadata.style.WriteFont;import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;import org.apache.poi.ss.usermodel.BorderStyle;import org.apache.poi.ss.usermodel.HorizontalAlignment;import org.apache.poi.ss.usermodel.IndexedColors;import java.util.List;public class CellStyleStrategy extends HorizontalCellStyleStrategy {    private final WriteCellStyle headWriteCellStyle;    private final WriteCellStyle contentWriteCellStyle;        private final List<Integer> columnIndexes;    public CellStyleStrategy(List<Integer> columnIndexes,WriteCellStyle headWriteCellStyle, WriteCellStyle contentWriteCellStyle) {        this.columnIndexes = columnIndexes;        this.headWriteCellStyle = headWriteCellStyle;        this.contentWriteCellStyle = contentWriteCellStyle;    }    //设置头样式    @Override    protected void setHeadCellStyle( CellWriteHandlerContext context) {        // 获取字体实例        WriteFont headWriteFont = new WriteFont();        headWriteFont.setFontName("宋体");        //表头不同处理        if (columnIndexes.get(0).equals(context.getRowIndex())) {            headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());            headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);            headWriteFont.setFontHeightInPoints((short) 12);            headWriteFont.setBold(false);            headWriteFont.setFontName("宋体");        }else{            headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());            headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);            headWriteFont.setFontHeightInPoints((short) 11);            headWriteFont.setBold(false);            headWriteFont.setFontName("微软雅黑");        }        headWriteCellStyle.setWriteFont(headWriteFont);        DataFormatData dataFormatData = new DataFormatData();        dataFormatData.setIndex((short)49);        headWriteCellStyle.setDataFormatData(dataFormatData);        if (stopProcessing(context)) {            return;        }        WriteCellData<?> cellData = context.getFirstCellData();        WriteCellStyle.merge(headWriteCellStyle, cellData.getOrCreateStyle());    }    //设置填充数据样式    @Override    protected void setContentCellStyle(CellWriteHandlerContext context) {        WriteFont contentWriteFont = new WriteFont();        contentWriteFont.setFontName("宋体");        contentWriteFont.setFontHeightInPoints((short) 11);        //设置数据填充后的实线边框        contentWriteCellStyle.setWriteFont(contentWriteFont);        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);        DataFormatData dataFormatData = new DataFormatData();        dataFormatData.setIndex((short)49);        contentWriteCellStyle.setDataFormatData(dataFormatData);        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);        WriteCellData<?> cellData = context.getFirstCellData();        WriteCellStyle.merge(contentWriteCellStyle, cellData.getOrCreateStyle());    }}

行高设置

import com.alibaba.excel.write.style.row.AbstractRowHeightStyleStrategy;import org.apache.poi.ss.usermodel.Row;public class CellRowHeightStyleStrategy extends AbstractRowHeightStyleStrategy {    @Override    protected void setHeadColumnHeight(Row row, int relativeRowIndex) {        //设置主标题行高为17.7        if(relativeRowIndex == 0){            //如果excel需要显示行高为15,那这里就要设置为15*20=300            row.setHeight((short) 3240);        }    }    @Override    protected void setContentColumnHeight(Row row, int relativeRowIndex) {    }}

列宽度自适应

如果是简单表头,可以使用EasyExcel中的LongestMatchColumnWidthStyleStrategy()来实现。

EasyExcel.write(fileName, LongestMatchColumnWidthData.class)    .reGISterWriteHandler(new LongestMatchColumnWidthStyleStrategy()).sheet("模板").doWrite(dataLong());

如果是复杂表头,就需要自己来实现,代码如下:

import com.alibaba.excel.enums.CellDataTypeEnum;import com.alibaba.excel.metadata.Head;import com.alibaba.excel.metadata.data.CellData;import com.alibaba.excel.metadata.data.WriteCellData;import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;import lombok.extern.slf4j.Slf4j;import org.apache.commons.collections.CollectionUtils;import org.apache.poi.ss.usermodel.Cell;import java.util.HashMap;import java.util.List;import java.util.Map;@Slf4jpublic class CellWidthStyleStrategy extends AbstractColumnWidthStyleStrategy {    private Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<>();    @Override    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {        Map<Integer, Integer> maxColumnWidthMap = CACHE.get(writeSheetHolder.getSheetNo());        if (maxColumnWidthMap == null) {            maxColumnWidthMap = new HashMap<>();            CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);        }        if (isHead) {            if(relativeRowIndex.intValue() == 1){                Integer length = cell.getStrinGCellValue().getBytes().length;                Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex());                if (maxColumnWidth == null || length > maxColumnWidth) {                    maxColumnWidthMap.put(cell.getColumnIndex(), length);                    writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), length * 300);                }            }        }else{            Integer columnWidth = this.dataLength(cellDataList, cell, isHead);            if (columnWidth >= 0) {                if (columnWidth > 255) {                    columnWidth = 255;                }                Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex());                if (maxColumnWidth == null || columnWidth > maxColumnWidth) {                    maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth);                    writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256);                }            }        }    }    private Integer dataLength(List<WriteCellData<?>> cellDataList, Cell cell, Boolean isHead) {        if (isHead) {            return cell.getStringCellValue().getBytes().length;        } else {            CellData cellData = cellDataList.get(0);            CellDataTypeEnum type = cellData.getType();            if (type == null) {                return -1;            } else {                switch (type) {                    case STRING:                        return cellData.getStringValue().getBytes().length;                    case BOOLEAN:                        return cellData.getBooleanValue().toString().getBytes().length;                    case NUMBER:                        return cellData.getNumberValue().toString().getBytes().length;                    default:                        return -1;                }            }        }    }}

写入文件

EasyExcel.write(response.getOutputStream())    .head(head)    .registerWriteHandler(new CellRowHeightStyleStrategy())   //设置行高的策略    .registerWriteHandler(new CellStyleStrategy(Arrays.asList(0,1),new WriteCellStyle(), new WriteCellStyle()))    .registerWriteHandler(new CellWidthStyleStrategy())    .sheet(sheetName)    .doWrite(list);

读到这里,这篇“Java怎么用EasyExcel解析动态表头并导出”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Java怎么用EasyExcel解析动态表头并导出

本文链接: https://www.lsjlt.com/news/346719.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java怎么用EasyExcel解析动态表头并导出
    本文小编为大家详细介绍“Java怎么用EasyExcel解析动态表头并导出”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java怎么用EasyExcel解析动态表头并导出”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-07-04
  • Java利用EasyExcel解析动态表头及导出实现过程
    目录前言参考地址前端下载模板下载EasyExcel动态表头解析EasyExcel动态表头导出总结前言 excel文件导入及导出,是日常开发中经常遇到的需求。本次笔者以EasyExce...
    99+
    2022-12-08
    easyexcel导出表头格式 easyexcel解析动态表头 java easyexcel动态表头
  • Java——使用EasyExcel导出动态列的Excel
    有些时候列表的列可能是动态的,需要根据动态表头导出Excel文件,这时候可以使用下面的方法解决: public static void exportDynamicExcel(Set includeColumnFiledNam...
    99+
    2023-09-09
    java excel
  • Java easyExcel的多级表头怎么导入
    这篇文章主要介绍了Java easyExcel的多级表头怎么导入的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java easyExcel的多级表头怎么导入文章都会有所收获,下面我们一起来看...
    99+
    2023-07-02
  • JAVA(EasyExcel)通过远程调用模板 导出数据 复杂表头
    前言 最近接手一个需求,单组数据的显示,也有多组数据的显示,查了好多文章,都不是很明白.但是这篇文章和我的需求差不多非常相似(链接放在文末),根据这篇文章然后将自己的实现过程记录了下来,以防之后再用到. 这是我需要导出的excel格式开头是...
    99+
    2023-09-24
    java excel vue.js
  • poi+easypoi实现表头多层循环,多级动态表头、树形结构动态表头、纵向合并单元格、多个sheet导出
    前言 我前面也写过几篇关于easypoi复杂表格导出的文章,什么一对多纵向合并、多级表头、动态表头、多个sheet等,这些我写那几篇文章之前做项目都遇到过,并且都实现出来了。 感兴趣的可以看看: ea...
    99+
    2023-10-02
    java easypoi poi
  • MySQL数据库怎么用命令行导出带表头和不带表头的csv文件
    本篇内容介绍了“MySQL数据库怎么用命令行导出带表头和不带表头的csv文件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读...
    99+
    2024-04-02
  • JAVA利用Freemarker模版动态生成并导出word文档(全网最详细)
    文章目录 一、文章背景二、实现步骤1、需要的环境2、创建模板3、书写java类4、测试 三、freemarker技术点 一、文章背景 公司的某个需求,需要根据接口的信息生成一...
    99+
    2023-09-09
    java word 开发语言
  • Java中怎么利用注解导出Excel
    本篇文章给大家分享的是有关Java中怎么利用注解导出Excel,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Excel 导出-需求拆解在后台管理系统中,常常需要把数据导出 Ex...
    99+
    2023-06-15
  • 怎么使用Java方法调用解析静态分派和动态分派
    这篇“怎么使用Java方法调用解析静态分派和动态分派”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用Java方法调用解...
    99+
    2023-07-02
  • 使用Ajax怎么动态显示并操作表信息
    这篇文章将为大家详细讲解有关使用Ajax怎么动态显示并操作表信息,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。js文件内容如下:$(function () { ...
    99+
    2023-06-08
  • ExtJs怎么使用自定义插件动态保存表头配置
    这篇文章将为大家详细讲解有关ExtJs怎么使用自定义插件动态保存表头配置,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。关于保存列表表头的配置,一般我们不需要与后台交互,直...
    99+
    2024-04-02
  • Java怎么实现pdf和Excel的生成及数据动态插入、导出
    本篇内容介绍了“Java怎么实现pdf和Excel的生成及数据动态插入、导出”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读...
    99+
    2024-04-02
  • 利用java怎么从数据库中导出Excel表格
    这期内容当中小编将会给大家带来有关利用java怎么从数据库中导出Excel表格,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。基于maven jar包引入如下:  <dependency> ...
    99+
    2023-05-31
    java ava excel
  • Java怎么实现pdf和Excel的生成及数据动态插入与导出
    这篇文章主要介绍“Java怎么实现pdf和Excel的生成及数据动态插入与导出”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java怎么实现pdf和Excel的生成及数据动态插入与导出”文章能帮助大...
    99+
    2023-06-27
  • 如何解析Vue中动态组件怎么使用
    如何解析Vue中动态组件怎么使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。动态组件在开发的过程中大多数情况下都会用到,当我们需要在不同的组件之间进行状态切换时,动态组件...
    99+
    2023-06-25
  • 免费动态域名解析软件怎么使用
    免费动态域名解析软件可以帮助用户将动态IP地址映射到一个固定的域名上,使得用户可以通过域名访问自己的设备或服务器,而无需担心IP地址...
    99+
    2023-06-12
    动态域名解析软件 域名
  • vue3+vite:src使用require动态导入图片报错怎么解决
    vue3+vite:src使用require动态导入图片报错和解决方法vue3 + vite 动态的导入多张图片vue3 如果使用的是typescript开发,就会出现require引入图片报错,require is not defined...
    99+
    2023-05-21
    Vue3 vite require
  • Retrofit网络请求框架之注解解析和动态代理方法怎么使用
    本篇内容介绍了“Retrofit网络请求框架之注解解析和动态代理方法怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Retrofit是...
    99+
    2023-07-05
  • Java中的xml文件怎么利用正则表达式进行解析
    这篇文章将为大家详细讲解有关Java中的xml文件怎么利用正则表达式进行解析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、编写Node类Node对象是文档解析的基础,最终可以通过对象的不...
    99+
    2023-05-31
    java 正则表达式 xml
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作