easyexcle处理复杂动态单元格合并问题,合并动态行列

@GetMapping("getAddDelSummaryExport")
@ApiOperation("新增删除比例报表--导出")
@ApiImplicitParams({@ApiImplicitParam(name = "season", value = "季节", paramType = "query", dataType = "String"),@ApiImplicitParam(name = "brand", value = "品牌", paramType = "query", dataType = "String"),@ApiImplicitParam(name = "series", value = "系列", paramType = "query", dataType = "String"),@ApiImplicitParam(name = "stage", value = "阶段", paramType = "query", dataType = "String")
})
public void getAddDelSummaryExport(@ApiIgnore @RequestParam Map<String, Object> params, HttpServletResponse response) throws Exception {if(!ParamUtil.paramsIsNotNull(params,"limit") || !ParamUtil.paramsIsNotNull(params,"page")){params.put("limit", "1000");params.put("page", "1");}List<AddAndDelSummaryDTO> list = styleSummaryService.getAddAndDelReportPage(params).getList();//标记位AtomicInteger mergeLineIndex = new AtomicInteger(0);//合并的列List<Integer> merge = new ArrayList<>();//合并的行List<Integer> lines = new ArrayList<>();merge.add(mergeLineIndex.intValue());merge.add(mergeLineIndex.intValue() + 1);merge.add(mergeLineIndex.intValue() + 2);lines.add(mergeLineIndex.intValue());lines.add(mergeLineIndex.intValue() + 1);List<List<String>> dataList = new ArrayList<>();AtomicInteger seasonCount = new AtomicInteger();if(CollectionUtils.isNotEmpty(list)){Map<String, List<AddAndDelSummaryDTO>> collectMap = list.stream().collect(Collectors.groupingBy(AddAndDelSummaryDTO::getSeason, Collectors.toList()));Map<String, List<AddAndDelSummaryDTO>> treeMap = new TreeMap<>(collectMap);MapUtil.sort(treeMap);treeMap.forEach((season, fooListBySeason) -> {seasonCount.addAndGet(1);List<String> itemList = new ArrayList<>();itemList.add(season);itemList.add("头版");itemList.add("二选");itemList.add("二选");itemList.add("二选");itemList.add("二选");itemList.add("二选");itemList.add("二选");itemList.add("二选");itemList.add("销样");itemList.add("销样");itemList.add("销样");itemList.add("销样");itemList.add("销样");itemList.add("销样");itemList.add("销样");itemList.add("大货");itemList.add("大货");dataList.add(itemList);itemList = new ArrayList<>();itemList.add(season);itemList.add("合计款数");itemList.add("新增");itemList.add("新增");itemList.add("删除");itemList.add("删除");itemList.add("续存");itemList.add("续存");itemList.add("合计款数");itemList.add("新增");itemList.add("新增");itemList.add("删除");itemList.add("删除");itemList.add("续存");itemList.add("续存");itemList.add("合计款数");itemList.add("大货合计款数");itemList.add("大货数量");dataList.add(itemList);itemList = new ArrayList<>();itemList.add(season);itemList.add("合计款数");itemList.add("数量");itemList.add("新增比例");itemList.add("数量");itemList.add("删除比例");itemList.add("数量");itemList.add("续存比例");itemList.add("合计款数");itemList.add("数量");itemList.add("新增比例");itemList.add("数量");itemList.add("删除比例");itemList.add("数量");itemList.add("续存比例");itemList.add("合计款数");itemList.add("大货合计款数");itemList.add("大货数量");dataList.add(itemList);AtomicInteger seriesIndex = new AtomicInteger();fooListBySeason.stream().collect(Collectors.groupingBy(AddAndDelSummaryDTO::getSeries, Collectors.toList())).forEach((series, fooListBySeries) -> {seriesIndex.addAndGet(1);AddAndDelSummaryDTO dto = fooListBySeries.stream().filter(oo -> "头版".equals(oo.getStage())).findFirst().isPresent() ? fooListBySeries.stream().filter(oo -> "头版".equals(oo.getStage())).findFirst().get() : null;AddAndDelSummaryDTO dto2 = fooListBySeries.stream().filter(oo -> "二选".equals(oo.getStage())).findFirst().isPresent() ? fooListBySeries.stream().filter(oo -> "二选".equals(oo.getStage())).findFirst().get() : null;AddAndDelSummaryDTO dto3 = fooListBySeries.stream().filter(oo -> "销样".equals(oo.getStage())).findFirst().isPresent() ? fooListBySeries.stream().filter(oo -> "销样".equals(oo.getStage())).findFirst().get() : null;AddAndDelSummaryDTO dto4 = fooListBySeries.stream().filter(oo -> "大货".equals(oo.getStage())).findFirst().isPresent() ? fooListBySeries.stream().filter(oo -> "大货".equals(oo.getStage())).findFirst().get() : null;List<String> itemList1 = new ArrayList<>();itemList1.add(series);if(dto != null){itemList1.add(dto.getStyleCount() + "");}else {itemList1.add("");}if(dto2 != null){itemList1.add(dto2.getAddCount() + "");itemList1.add(dto2.getAddProportion() + "%");itemList1.add(dto2.getDelCount() + "");itemList1.add(dto2.getDelProportion() + "%");itemList1.add(dto2.getXcCount() + "");itemList1.add(dto2.getXcProportion() + "%");itemList1.add(dto2.getStyleCount() + "");}else {itemList1.add("");itemList1.add("");itemList1.add("");itemList1.add("");itemList1.add("");itemList1.add("");itemList1.add("");}if(dto3 != null){itemList1.add(dto3.getAddCount() + "");itemList1.add(dto3.getAddProportion() + "%");itemList1.add(dto3.getDelCount() + "");itemList1.add(dto3.getDelProportion() + "%");itemList1.add(dto3.getXcCount() + "");itemList1.add(dto3.getXcProportion() + "%");itemList1.add(dto3.getStyleCount() + "");}else {itemList1.add("");itemList1.add("");itemList1.add("");itemList1.add("");itemList1.add("");itemList1.add("");itemList1.add("");}if(dto4 != null){itemList1.add(dto4.getStyleCount() + "");itemList1.add("");}else {itemList1.add("");itemList1.add("");}dataList.add(itemList1);});//合计List itemList3 = new ArrayList<>();itemList3.add("合计");int aSum = fooListBySeason.stream().filter(oo -> "头版".equals(oo.getStage())).mapToInt(AddAndDelSummaryDTO::getStyleCount).sum();int bSum = fooListBySeason.stream().filter(oo -> "二选".equals(oo.getStage())).mapToInt(AddAndDelSummaryDTO::getStyleCount).sum();int bSum1 = fooListBySeason.stream().filter(oo -> "二选".equals(oo.getStage())).mapToInt(AddAndDelSummaryDTO::getAddCount).sum();int bSum2 = fooListBySeason.stream().filter(oo -> "二选".equals(oo.getStage())).mapToInt(AddAndDelSummaryDTO::getDelCount).sum();int bSum3 = fooListBySeason.stream().filter(oo -> "二选".equals(oo.getStage())).mapToInt(AddAndDelSummaryDTO::getXcCount).sum();int cSum = fooListBySeason.stream().filter(oo -> "销样".equals(oo.getStage())).mapToInt(AddAndDelSummaryDTO::getStyleCount).sum();int cSum1 = fooListBySeason.stream().filter(oo -> "销样".equals(oo.getStage())).mapToInt(AddAndDelSummaryDTO::getAddCount).sum();int cSum2 = fooListBySeason.stream().filter(oo -> "销样".equals(oo.getStage())).mapToInt(AddAndDelSummaryDTO::getDelCount).sum();int cSum3 = fooListBySeason.stream().filter(oo -> "销样".equals(oo.getStage())).mapToInt(AddAndDelSummaryDTO::getXcCount).sum();int dSum = fooListBySeason.stream().filter(oo -> "大货".equals(oo.getStage())).mapToInt(AddAndDelSummaryDTO::getStyleCount).sum();BigDecimal decimal = BigDecimal.valueOf(0.00);itemList3.add(aSum + "");itemList3.add(bSum1 + "");if(aSum > 0){decimal = BigDecimal.valueOf((float)  100 * bSum1 / aSum);}itemList3.add(decimal.setScale(2, BigDecimal.ROUND_HALF_UP) + "%");itemList3.add(bSum2 + "");if(aSum > 0){decimal = BigDecimal.valueOf((float)  100 * bSum2 / aSum);}itemList3.add(decimal.setScale(2, BigDecimal.ROUND_HALF_UP) + "%");itemList3.add(bSum3 + "");if(aSum > 0){decimal = BigDecimal.valueOf((float)  100 * bSum3 / aSum);}itemList3.add(decimal.setScale(2, BigDecimal.ROUND_HALF_UP) + "%");itemList3.add(bSum + "");itemList3.add(cSum1 + "");if(bSum > 0){decimal = BigDecimal.valueOf((float)  100 * cSum1 / bSum);}itemList3.add(decimal.setScale(2, BigDecimal.ROUND_HALF_UP) + "%");itemList3.add(cSum2 + "");if(bSum > 0){decimal = BigDecimal.valueOf((float)  100 * cSum2 / bSum);}itemList3.add(decimal.setScale(2, BigDecimal.ROUND_HALF_UP) + "%");itemList3.add(cSum3 + "");if(bSum > 0){decimal = BigDecimal.valueOf((float)  100 * cSum3 / bSum);}itemList3.add(decimal.setScale(2, BigDecimal.ROUND_HALF_UP) + "%");itemList3.add(cSum + "");itemList3.add(dSum + "");itemList3.add("");dataList.add(itemList3);//处理单元格合并逻辑if(1 < collectMap.size() && collectMap.size() > seasonCount.intValue()){List itemList2 = new ArrayList<>();for (int i = 0; i < 18; i++) {itemList2.add("");}dataList.add(itemList2);mergeLineIndex.addAndGet(5 + seriesIndex.intValue());merge.add(mergeLineIndex.intValue());merge.add(mergeLineIndex.intValue() + 1);merge.add(mergeLineIndex.intValue() + 2);lines.add(mergeLineIndex.intValue() - 1);lines.add(mergeLineIndex.intValue());lines.add(mergeLineIndex.intValue() + 1);}});}response.setContentType("application/json;charset=utf-8");response.setCharacterEncoding("UTF-8");String fileName = URLEncoder.encode("开发新增删除比例统计表-"+  DateUtils.format(new Date()), "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");ExcelWriter excelWriter = null;try{excelWriter = EasyExcel.write(response.getOutputStream()).build();//excelWriter = EasyExcel.write("D:\\2023\\test456.xlsx").build();if(null != excelWriter) {//需要合并的列int[] mergeColumeIndex = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17};// 从那一列开始合并int mergeRowIndex = 0;// 内容的策略WriteCellStyle contentWriteCellStyle = new WriteCellStyle();contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);contentWriteCellStyle.setBorderTop(BorderStyle.THIN);contentWriteCellStyle.setBorderRight(BorderStyle.THIN);contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);WriteCellStyle headWriteCellStyle = new WriteCellStyle();headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.index);HorizontalCellStyleStrategy horizontalCellStyleStrategy =new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);WriteSheet writeSheet = EasyExcel.writerSheet( "开发新增删除比例统计").registerWriteHandler(horizontalCellStyleStrategy).registerWriteHandler(new MergeSameRowsStrategy(mergeRowIndex, mergeColumeIndex, merge)).registerWriteHandler(new MergeSameLinesStrategy(lines)).build();excelWriter.write(dataList, writeSheet);}}finally {//关闭流if(excelWriter != null){excelWriter.finish();}}
}

package com.jack.modules.dsr.common.utils;import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import lombok.Data;
import org.apache.commons.collections.CollectionUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;import java.util.List;@Data
public class MergeSameRowsStrategy implements CellWriteHandler{private int[] mergeColumnIndex;private int mergeRowIndex;private List<Integer> merge;public MergeSameRowsStrategy() {}public MergeSameRowsStrategy(int mergeRowIndex, int[] mergeColumnIndex, List<Integer> merge) {this.mergeRowIndex = mergeRowIndex;this.mergeColumnIndex = mergeColumnIndex;this.merge = merge;}@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {if (CollectionUtils.isNotEmpty(merge)){// 当前行int curRowIndex = cell.getRowIndex();if (merge.contains(curRowIndex)){// 当前列int curColIndex = cell.getColumnIndex();if (curRowIndex > mergeRowIndex) {for (int i = 0; i < mergeColumnIndex.length; i++) {if (curColIndex == mergeColumnIndex[i]) {mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);break;}}}}}}/*** 当前单元格向上合并** @param writeSheetHolder sheet保持对象* @param cell             当前单元格* @param curRowIndex      当前行* @param curColIndex      当前列*/private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {// 获取当前行的当前列的数据和上一行的当前列列数据,通过上一行数据是否相同进行合并Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue();if (cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex) == null){return;}Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue();// 比较当前行的第一列的单元格与上一行是否相同,相同合并当前单元格与上一行if (curData.equals(preData) || ("0.0".equals(preData.toString()) && "".equals(curData))) {Sheet sheet = writeSheetHolder.getSheet();List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();boolean isMerged = false;for (int i = 0; i < mergedRegions.size() && !isMerged; i++) {CellRangeAddress cellRangeAddr = mergedRegions.get(i);// 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {sheet.removeMergedRegion(i);cellRangeAddr.setLastRow(curRowIndex);sheet.addMergedRegion(cellRangeAddr);isMerged = true;}}// 若上一个单元格未被合并,则新增合并单元if (!isMerged) {CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex);sheet.addMergedRegion(cellRangeAddress);}}}@Overridepublic void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {}@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {}}

package com.jack.modules.dsr.common.utils;import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import lombok.Data;
import org.apache.commons.collections.CollectionUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;import java.util.List;@Data
public class MergeSameLinesStrategy implements CellWriteHandler{/*** 要合并的行*/private List<Integer> mergeRowsIndex;/*** 开始合并的行*/private int mergeRowIndex;/*** 无参构造*/public MergeSameLinesStrategy() {}/*** 有参构造** @param mergeRowIndex    开始合并的行*/public MergeSameLinesStrategy(int mergeRowIndex) {this.mergeRowIndex = mergeRowIndex;}/*** 有参构造** @param mergeRowIndex    开始合并的行* @param mergeRowsIndex   合并的行*/
//    public MergeSameLinesStrategy(int mergeRowIndex, List<Integer> mergeRowsIndex) {
//        this.mergeRowIndex = mergeRowIndex;
//        this.mergeRowsIndex = mergeRowsIndex;
//    }public MergeSameLinesStrategy(List<Integer> mergeRowsIndex) {this.mergeRowsIndex = mergeRowsIndex;}@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {//合并行(从第一列开始)//当前行final int curRowIndex = cell.getRowIndex();//当前列final int curColIndex = cell.getColumnIndex();if (curColIndex > 0) {if (!ObjectUtils.isEmpty(mergeRowsIndex)) {for (int i = 0; i < mergeRowsIndex.size(); i++) {if (curRowIndex == mergeRowsIndex.get(i)) {mergeWithPrevCol(writeSheetHolder, cell, curRowIndex, curColIndex);break;}}}}}/*** 当前单元格向左合并** @param writeSheetHolder writeSheetHolder* @param cell             当前单元格* @param curRowIndex      当前行* @param curColIndex      当前列*/private void mergeWithPrevCol(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {//获取当前行的当前列的数据和上一列的当前行行数据,通过上一列数据是否相同进行合并final Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue();final Cell preCell = cell.getSheet().getRow(curRowIndex).getCell(curColIndex - 1);final Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue();// 比较当前行的单元格与上一列是否相同,相同合并当前单元格与上一列if (curData.equals(preData)) {final Sheet sheet = writeSheetHolder.getSheet();final List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();boolean isMerged = false;for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {final CellRangeAddress cellRangeAddr = mergeRegions.get(i);// 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元if (cellRangeAddr.isInRange(curRowIndex, curColIndex - 1)) {sheet.removeMergedRegion(i);cellRangeAddr.setLastColumn(curColIndex);sheet.addMergedRegion(cellRangeAddr);isMerged = true;}}// 若上一个单元格未被合并,则新增合并单元if (!isMerged) {final CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex, curRowIndex, curColIndex - 1, curColIndex);sheet.addMergedRegion(cellRangeAddress);}}}@Overridepublic void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {}@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {}}

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

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

相关文章

Electron Vite打包后,部分图标未显示的解决方案

背景 这个问题&#xff0c;弄了一晚上&#xff0c;头都大了&#xff0c;找了一堆博客也没解决。主要参考这个&#xff1a;https://blog.csdn.net/m0_73845616/article/details/129741099。 下面讲一下我的解决方案。 解决方案 上面链接里的方法&#xff0c;我采用第二、三个都…

C# Onnx Yolov8 Detect 物体检测 多张图片同时推理

目录 效果 模型信息 项目 代码 下载 C# Onnx Yolov8 Detect 物体检测 多张图片同时推理 效果 模型信息 Model Properties ------------------------- date&#xff1a;2023-12-18T11:47:29.332397 description&#xff1a;Ultralytics YOLOv8n-detect model trained on …

Istio 社区周报(第一期):2023.12.11 - 12.17

欢迎来到 Istio 社区周报 Istio 社区朋友们&#xff0c;你们好&#xff01; 我很高兴呈现第一期 Istio 社区周报。作为 Istio 社区的一员&#xff0c;每周我将为您带来 Istio 的最新发展、有见地的社区讨论、专业提示和重要安全新闻内容。 祝你阅读愉快&#xff0c;并在下一期中…

第二十二章 : Spring Boot 集成定时任务(一)

第二十二章 &#xff1a; Spring Boot 集成定时任务&#xff08;一&#xff09; 前言 本章知识点&#xff1a; 介绍使用Spring Boot内置的Scheduled注解来实现定时任务-单线程和多线程&#xff1b;以及介绍Quartz定时任务调度框架&#xff1a;简单定时调度器&#xff08;Simp…

ubuntu 18.04 共享屏幕

用于windows远程ubuntu 1. sudo apt install xrdp 2. 配置 sudo vim /etc/xrdp/startwm.sh 把最下面的test和exec两行注释掉&#xff0c;添加一行 gnome-session 3.安装dconf-editor : sudo apt-get install dconf-editor 关闭require encrytion org->gnome->desktop…

TransXNet实战:使用TransXNet实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 论文提出了一种名为D-Mixer的轻量级双动态TokenMixer&#xff0c;旨在解决传统卷积的静态性质导致的表示差异和特征融合问题。D-Mixer通过应用高效的全局注意力和输入依赖的深度卷…

Py之tensorflow-addons:tensorflow-addons的简介、安装、使用方法之详细攻略

Py之tensorflow-addons&#xff1a;tensorflow-addons的简介、安装、使用方法之详细攻略 目录 tensorflow-addons的简介 tensorflow-addons的安装 tensorflow-addons的使用方法 1、使用 TensorFlow Addons 中的功能&#xff1a; tensorflow-addons的简介 TensorFlow Addon…

【SpringBoot快速入门】(4)SpringBoot项目案例代码示例

目录 1 创建工程3 配置文件4 静态资源 之前我们已经学习的Spring、SpringMVC、Mabatis、Maven&#xff0c;详细讲解了Spring、SpringMVC、Mabatis整合SSM的方案和案例&#xff0c;上一节我们学习了SpringBoot的开发步骤、工程构建方法以及工程的快速启动&#xff0c;从这一节开…

Python---TCP 客户端程序开发

1. 开发 TCP 客户端程序开发步骤回顾 创建客户端套接字对象和服务端套接字建立连接发送数据接收数据关闭客户端套接字 2. socket 类的介绍 导入 socket 模块 import socket 创建客户端 socket 对象 socket.socket(AddressFamily, Type) 参数说明: AddressFamily 表示IP地…

JavaScript:函数

JavaScript&#xff1a;函数 函数的作用函数的声明和调用函数声明函数调用函数重复声明 函数传参传参语法参数默认值与参数数量问题传参数量过多传参数量太少参数默认值 函数的返回值函数表达式匿名函数立即执行函数 函数的作用 在我们编程过程中&#xff0c;会出现一种情况&a…

[软件] Image2LCD v4.0

介绍 通过打开图片, 可以提取图片的像素特征, 生成.c文件, 或者二进制文件等, 提供人们根据需要选择. 16位真彩色 每一个像素点需要用16位来表示, 分别是RGB, R: 5位 G: 6位, B: 5位, 共两个字节. 配置 tftLCD180显示屏, 官方给的参考代码, 需要如下所示设置.

【Spring Security】认证密码加密Token令牌CSRF的使用详解

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Spring Security》。&#x1f3af;&#x1f3af; …

频谱论文:RadioUNet:使用卷积神经网络的快速无线电地图估计

#频谱# R. Levie, . Yapar, G. Kutyniok and G. Caire, "RadioUNet: Fast Radio Map Estimation With Convolutional Neural Networks," in IEEE Transactions on Wireless Communications, vol. 20, no. 6, pp. 4001-4015, June 2021, doi: 10.1109/TWC.2021.305497…

【hadoop】解决浏览器不能访问Hadoop的50070、8088等端口?!

【hadoop】解决浏览器不能访问Hadoop的50070、8088等端口&#xff1f;&#xff01;&#x1f60e; 前言&#x1f64c;【hadoop】解决浏览器不能访问Hadoop的50070、8088等端口&#xff1f;&#xff01;查看自己的配置文件&#xff1a;最终成功访问如图所示&#xff1a; 总结撒花…

10 个顶级免费 Android 数据恢复软件可帮助恢复已删除的文件

不小心删除了手机上的一些重要数据或文件&#xff1f;这很不幸&#xff0c;但不要悲伤或放弃希望&#xff0c;因为仍有机会恢复它们。 10 个顶级免费 Android 数据恢复软件 虽然 Android 手机没有像 Windows 那样的回收站可以自动存储您删除的数据&#xff0c;但是有很多功能强…

【Java中的负数取绝对值结果为什么不一定是正数?】

Java中的负数取绝对值结果为什么不一定是正数&#xff1f; ✅典型解析✅扩展知识仓✅整型的取值范围✅超出范围怎么办 ✅典型解析 假如&#xff0c;我们要用Math.abs对一个nteger取绝对值的时候&#xff0c;如果用如下方式: Math .abs(orderId.hashCode());得到的结果可能是个负…

在Java Web开发中,Servlet功能与jsp功能可以相互转换吗

在Java Web开发中&#xff0c;Servlet和JSP是两种常用的Web组件&#xff0c;它们可以相互协作&#xff0c;也可以相互转换。 具体来说&#xff0c;Servlet可以实现所有JSP的功能&#xff0c;而JSP也可以调用Servlet中的方法。Servlet可以通过Java代码生成HTML页面&#xff0c;而…

一键转换,将HTML智能转换为PDF,轻松解决文档转换需求

在数字时代&#xff0c;HTML网页是我们获取信息的主要来源之一。然而&#xff0c;有时候我们可能需要将网页内容以PDF格式保存&#xff0c;以便于离线阅读、打印或分享。这时&#xff0c;将HTML转换为PDF就变得尤为重要。 首先&#xff0c;我们要进入首助编辑高手主页面&#x…

[CVPR-23] Instant Volumetric Head Avatars

[paper | code | proj] 本文提出INSTA。INSTA是一种backward mapping方法。该方法基于NeRF建立标准空间&#xff0c;形变空间&#xff08;任意表情&#xff09;通过映射回标准空间&#xff0c;实现渲染。为实现形变空间中任意点向标准空间的映射&#xff0c;对形变空间中的任意…

C++ Qt开发:TabWidget实现多窗体功能

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍TabWidget标签组件的常用方法及灵活运用。 Q…