POI实现Excel多行复杂表头导出

POI实现Excel多行复杂表头导出

1. pom文件添加POI相关依赖

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.10-FINAL</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.10-FINAL</version>
</dependency>

2. 代码实现

1. 定义表头标题

/*** home.php?mod=space&uid=686208 vvirster@163.com* home.php?mod=space&uid=686237 2022-11-24 15:28* @description 复杂表格表头单元格**/
public class CellModel {/*** 表头列名称*/private String cellName;/*** 起始行*/private Integer startRow;/*** 结束行*/private Integer endRow;/*** 起始列*/private Integer startColumn;/*** 结束列*/private Integer endColumn;/*** 设置单元格宽度*/private Integer width;// setter getter省略。。}

2. 编写导出/生成Excel工具类

/*** @author vvirster@163.com* @date 2022-11-24 15:29* @description POI导出Excel工具类**/
public class ExportExcelUtil {private static final Logger logger = LoggerFactory.getLogger(ExportExcelUtil.class);/*** 生成表格(用于生成复杂表头)** home.php?mod=space&uid=952169 sheetName   sheet名称* @param wb          表对象* @param cellListMap 表头数据 {key=cellRowNum}* @param cellRowNum  表头总占用行数* @param exportData  行数据* home.php?mod=space&uid=155549 HSSFWorkbook 数据表对象*/@SuppressWarnings({"rawtypes", "unchecked"})public static Workbook createCSVUtil(String sheetName, Workbook wb,Map<String, List<CellModel>> cellListMap,Integer cellRowNum, List<LinkedHashMap> exportData) throws Exception {//设置表格名称Sheet sheet = wb.createSheet(sheetName);// 设置打印参数PrintSetup printSetup = sheet.getPrintSetup();// 纸张大小printSetup.setPaperSize(PrintSetup.A4_PAPERSIZE);sheet.setDisplayGridlines(false);sheet.setPrintGridlines(false);// 上边距sheet.setMargin(Sheet.TopMargin, 0.5);// 下边距sheet.setMargin(Sheet.BottomMargin, 0.5);// 左边距sheet.setMargin(Sheet.LeftMargin, 0.5);// 右边距sheet.setMargin(Sheet.RightMargin, 0.5);sheet.setHorizontallyCenter(true);sheet.autoSizeColumn(1, true);// 定义title列cell样式CellStyle cellStyle = wb.createCellStyle();//设置单元格内容水平对齐// 文字居中cellStyle.setAlignment(CellStyle.ALIGN_CENTER);//设置单元格内容垂直对齐cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//设置自动换行cellStyle.setWrapText(true);cellStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index);//cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);//背景色cellStyle.setBorderBottom(CellStyle.BORDER_THIN);cellStyle.setBorderLeft(CellStyle.BORDER_THIN);cellStyle.setBorderRight(CellStyle.BORDER_THIN);cellStyle.setBorderTop(CellStyle.BORDER_THIN);// 定义title列cell字体Font font = wb.createFont();// font.setColor(HSSFColor.VIOLET.index);//字体颜色font.setFontHeightInPoints((short) 12);font.setBoldweight(Font.BOLDWEIGHT_BOLD);cellStyle.setFont(font);// 定义数据内容单元格样式CellStyle cellDataStyle = wb.createCellStyle();//设置单元格内容水平对齐// 文字居中cellDataStyle.setAlignment(CellStyle.ALIGN_CENTER);//设置单元格内容垂直对齐cellDataStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//设置自动换行cellDataStyle.setWrapText(true);cellDataStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index);cellDataStyle.setBorderBottom(CellStyle.BORDER_THIN);cellDataStyle.setBorderLeft(CellStyle.BORDER_THIN);cellDataStyle.setBorderRight(CellStyle.BORDER_THIN);cellDataStyle.setBorderTop(CellStyle.BORDER_THIN);for (int t = 0; t < cellRowNum; t++) {Row row = sheet.createRow(t);List<CellModel> cellNameList = cellListMap.get(String.valueOf(t));for (CellModel cellModel : cellNameList) {// 遍历插入表头if (cellModel.getStartColumn() != null) {Cell cell = row.createCell(cellModel.getStartColumn());cell.setCellValue(cellModel.getCellName());cell.setCellStyle(cellStyle);}}// 解决合并单元格后出现部分单元格没有边框的问题if (t != 0) {int lastCellNum = sheet.getRow(0).getLastCellNum();for (int cellIndex = 0; cellIndex < lastCellNum; cellIndex++) {Cell cell = sheet.getRow(t).getCell(cellIndex);if (cell == null) {cell = sheet.getRow(t).createCell(cellIndex);cell.setCellValue("");}cell.setCellStyle(cellStyle);}}// 合并单元格for (CellModel cellModel : cellNameList) {logger.info("cellModelInfo,{}", JSON.toJSONString(cellModel));if (cellModel.getStartRow() != null) {//合并单元格CellRangeAddress region = new CellRangeAddress(cellModel.getStartRow(),cellModel.getEndRow(), cellModel.getStartColumn(), cellModel.getEndColumn());//给定要合并的单元格范围sheet.addMergedRegion(region);}// 根据标题设置单元格宽度if (cellModel.getWidth() != null) {sheet.setColumnWidth(cellModel.getStartColumn(), cellModel.getWidth() * 256);} else {sheet.setColumnWidth(cellModel.getStartColumn(), cellModel.getCellName().getBytes().length * 256);}}}// 导出具体的数据for (LinkedHashMap hashMap : exportData) {Row rowValue = sheet.createRow(cellRowNum);for (Map.Entry entryRow : (Iterable<Map.Entry>) hashMap.entrySet()) {int key = Integer.parseInt(entryRow.getKey().toString());String value = "";if (entryRow.getValue() != null) {value = entryRow.getValue().toString();} else {value = "";}Cell cellValue = rowValue.createCell(key);cellValue.setCellValue(value);cellValue.setCellStyle(cellDataStyle);}cellRowNum++;}return wb;}/*** 通过HTTP请求下载Excel* @param cellListMap    表格标题* @param exportData     需要导出的数据* @param sheetName      表格名称* @param exportFileName 导出文件名称* @param response       servletResponse*/public static void downloadExcel(Map<String, List<CellModel>> cellListMap, List<LinkedHashMap> exportData,String sheetName, String exportFileName, HttpServletResponse response) throws Exception {OutputStream out = null;String fileType = ".xlsx";try {Workbook wb = createCSVUtil(sheetName, new HSSFWorkbook(), cellListMap, cellListMap.size(), exportData);String s_attachment = "attachment; filename=" + exportFileName + fileType;// 设置字符编码的格式s_attachment = new String(s_attachment.getBytes("gb2312"), "ISO8859-1");// 设定输出文件头response.setHeader("Content-disposition", s_attachment);// 定义输出类型response.setContentType("application/vnd.ms-excel");response.setContentType("text/plain;charset=UTF-8");out = response.getOutputStream();wb.write(out);out.flush();} catch (Exception e) {throw new RuntimeException("导出Excel失败!");} finally {if (out != null) {out.close();}}}}

3. 测试

public class ExcelUtilTest {/*** 生成Excel表头**/public static Map<String, List<CellModel>> genExcelTitleCel() {//表头数据Map<String, List<CellModel>> cellTitleMap = new HashMap<String, List<CellModel>>();// 第一行表头数据List<CellModel> firstRow = new ArrayList<CellModel>();CellModel first_cellModel1 = new CellModel();first_cellModel1.setCellName("项目名称");first_cellModel1.setStartRow(0);first_cellModel1.setWidth(20);first_cellModel1.setEndRow(1);first_cellModel1.setStartColumn(0);first_cellModel1.setEndColumn(0);CellModel first_cellModel2 = new CellModel();first_cellModel2.setCellName("计划类别");first_cellModel2.setStartRow(0);first_cellModel2.setEndRow(1);first_cellModel2.setStartColumn(1);first_cellModel2.setEndColumn(1);CellModel first_cellModel3 = new CellModel();first_cellModel3.setCellName("项目负责人");first_cellModel3.setStartRow(0);first_cellModel3.setEndRow(1);first_cellModel3.setStartColumn(2);first_cellModel3.setEndColumn(2);CellModel first_cellModel4 = new CellModel();first_cellModel4.setCellName("项目编号");first_cellModel4.setStartRow(0);first_cellModel4.setEndRow(1);first_cellModel4.setStartColumn(3);first_cellModel4.setEndColumn(3);CellModel first_cellModel5 = new CellModel();first_cellModel5.setCellName("2022年度发表受本项目资助的论文(篇)");first_cellModel5.setStartRow(0);first_cellModel5.setEndRow(0);first_cellModel5.setStartColumn(4);first_cellModel5.setEndColumn(10);CellModel first_cellModel6 = new CellModel();first_cellModel6.setCellName("2022年专著出版(册)");first_cellModel6.setWidth(100);first_cellModel6.setStartRow(0);first_cellModel6.setEndRow(0);first_cellModel6.setStartColumn(11);first_cellModel6.setEndColumn(12);CellModel first_cellModel7 = new CellModel();first_cellModel7.setCellName("2022年申请专利(项)");first_cellModel7.setStartRow(0);first_cellModel7.setEndRow(0);first_cellModel7.setStartColumn(13);first_cellModel7.setEndColumn(14);CellModel first_cellModel8 = new CellModel();first_cellModel8.setCellName("2022年授权专利(项)");first_cellModel8.setStartRow(0);first_cellModel8.setEndRow(0);first_cellModel8.setStartColumn(15);first_cellModel8.setEndColumn(16);CellModel first_cellModel9 = new CellModel();first_cellModel9.setCellName("2022年学术交流(次)");first_cellModel9.setStartRow(0);first_cellModel9.setEndRow(0);first_cellModel9.setStartColumn(17);first_cellModel9.setEndColumn(18);CellModel first_cellModel10 = new CellModel();first_cellModel10.setCellName("2022年人才培养(人)");first_cellModel10.setStartRow(0);first_cellModel10.setEndRow(0);first_cellModel10.setStartColumn(19);first_cellModel10.setEndColumn(20);CellModel first_cellModel11 = new CellModel();first_cellModel11.setCellName("2022年培育新立项纵向项目(项)");first_cellModel11.setStartRow(0);first_cellModel11.setEndRow(1);first_cellModel11.setStartColumn(21);first_cellModel11.setEndColumn(21);CellModel first_cellModel12 = new CellModel();first_cellModel12.setCellName("2022年获得省部级及以上科技奖励(项)");first_cellModel12.setStartRow(0);first_cellModel12.setEndRow(1);first_cellModel12.setStartColumn(22);first_cellModel12.setEndColumn(22);firstRow.add(first_cellModel1);firstRow.add(first_cellModel2);firstRow.add(first_cellModel3);firstRow.add(first_cellModel4);firstRow.add(first_cellModel5);firstRow.add(first_cellModel6);firstRow.add(first_cellModel7);firstRow.add(first_cellModel8);firstRow.add(first_cellModel9);firstRow.add(first_cellModel10);firstRow.add(first_cellModel11);firstRow.add(first_cellModel12);//第二行表头数据List<CellModel> secondRow = new ArrayList<CellModel>();CellModel second_cellModel1 = new CellModel();second_cellModel1.setCellName("发表学术论文总计");second_cellModel1.setStartRow(1);second_cellModel1.setEndRow(1);second_cellModel1.setStartColumn(4);second_cellModel1.setEndColumn(4);CellModel second_cellModel2 = new CellModel();second_cellModel2.setCellName("英文论文");second_cellModel2.setStartRow(1);second_cellModel2.setEndRow(1);second_cellModel2.setStartColumn(5);second_cellModel2.setEndColumn(5);CellModel second_cellModel3 = new CellModel();second_cellModel3.setCellName("SCI");second_cellModel3.setStartRow(1);second_cellModel3.setWidth(10);second_cellModel3.setEndRow(1);second_cellModel3.setStartColumn(6);second_cellModel3.setEndColumn(6);CellModel second_cellModel4 = new CellModel();second_cellModel4.setCellName("EI");second_cellModel4.setStartRow(1);second_cellModel4.setEndRow(1);second_cellModel4.setWidth(10);second_cellModel4.setStartColumn(7);second_cellModel4.setEndColumn(7);CellModel second_cellModel5 = new CellModel();second_cellModel5.setCellName("国内核心");second_cellModel5.setStartRow(1);second_cellModel5.setEndRow(1);second_cellModel5.setStartColumn(8);second_cellModel5.setEndColumn(8);CellModel second_cellModel6 = new CellModel();second_cellModel6.setCellName("国外学术期刊");second_cellModel6.setStartRow(1);second_cellModel6.setEndRow(1);second_cellModel6.setStartColumn(9);second_cellModel6.setEndColumn(9);CellModel second_cellModel7 = new CellModel();second_cellModel7.setCellName("其他");second_cellModel7.setStartRow(1);second_cellModel7.setEndRow(1);second_cellModel7.setStartColumn(10);second_cellModel7.setEndColumn(10);CellModel second_cellModel8 = new CellModel();second_cellModel8.setCellName("主编");second_cellModel8.setStartRow(1);second_cellModel8.setEndRow(1);second_cellModel8.setStartColumn(11);second_cellModel8.setEndColumn(11);CellModel second_cellModel9 = new CellModel();second_cellModel9.setCellName("参编");second_cellModel9.setStartRow(1);second_cellModel9.setEndRow(1);second_cellModel9.setStartColumn(12);second_cellModel9.setEndColumn(12);CellModel second_cellModel10 = new CellModel();second_cellModel10.setCellName("发明专利");second_cellModel10.setStartRow(1);second_cellModel10.setEndRow(1);second_cellModel10.setStartColumn(13);second_cellModel10.setEndColumn(13);CellModel second_cellModel11 = new CellModel();second_cellModel11.setCellName("其他专利");second_cellModel11.setStartRow(1);second_cellModel11.setEndRow(1);second_cellModel11.setStartColumn(14);second_cellModel11.setEndColumn(14);CellModel second_cellModel12 = new CellModel();second_cellModel12.setCellName("发明专利");second_cellModel12.setStartRow(1);second_cellModel12.setEndRow(1);second_cellModel12.setStartColumn(15);second_cellModel12.setEndColumn(15);CellModel second_cellModel13 = new CellModel();second_cellModel13.setCellName("其他专利");second_cellModel13.setStartRow(1);second_cellModel13.setEndRow(1);second_cellModel13.setStartColumn(16);second_cellModel13.setEndColumn(16);CellModel second_cellModel14 = new CellModel();second_cellModel14.setCellName("举办学术会议");second_cellModel14.setStartRow(1);second_cellModel14.setEndRow(1);second_cellModel14.setStartColumn(17);second_cellModel14.setEndColumn(17);CellModel second_cellModel15 = new CellModel();second_cellModel15.setCellName("参加学术会议");second_cellModel15.setStartRow(1);second_cellModel15.setEndRow(1);second_cellModel15.setStartColumn(18);second_cellModel15.setEndColumn(18);CellModel second_cellModel16 = new CellModel();second_cellModel16.setCellName("博士");second_cellModel16.setStartRow(1);second_cellModel16.setEndRow(1);second_cellModel16.setStartColumn(19);second_cellModel16.setEndColumn(19);CellModel second_cellModel17 = new CellModel();second_cellModel17.setCellName("硕士");second_cellModel17.setStartRow(1);second_cellModel17.setEndRow(1);second_cellModel17.setStartColumn(20);second_cellModel17.setEndColumn(20);secondRow.add(second_cellModel1);secondRow.add(second_cellModel2);secondRow.add(second_cellModel3);secondRow.add(second_cellModel4);secondRow.add(second_cellModel5);secondRow.add(second_cellModel6);secondRow.add(second_cellModel7);secondRow.add(second_cellModel8);secondRow.add(second_cellModel9);secondRow.add(second_cellModel10);secondRow.add(second_cellModel11);secondRow.add(second_cellModel12);secondRow.add(second_cellModel13);secondRow.add(second_cellModel14);secondRow.add(second_cellModel15);secondRow.add(second_cellModel16);secondRow.add(second_cellModel17);// 组装第一行表头标题cellTitleMap.put("0", firstRow);// 组装第二行表头标题cellTitleMap.put("1", secondRow);return cellTitleMap;}public static void main(String[] args) {//向指定的Excel中写入数据OutputStream out = null;Workbook wb = null;try {String tabName = "test生成Excel";Map<String, List<CellModel>> excelTitleCel = genExcelTitleCel();System.out.println(JSONObject.toJSONString(excelTitleCel));List<LinkedHashMap> exportData = new ArrayList<LinkedHashMap>();//生成10条行记录for (int i = 0; i < 10; i++) {LinkedHashMap<String, String> rowPut = new LinkedHashMap<String, String>();// 根据实际列数生成数据for (int j = 0; j <= 22; j++) {rowPut.put(j + "", "数据11===" + i);}exportData.add(rowPut);}System.out.println(JSONObject.toJSONString(exportData));// 用于写入文件wb = ExportExcelUtil.createCSVUtil("生成Excel测试", new XSSFWorkbook(), excelTitleCel, excelTitleCel.size(),exportData);FileOutputStream fos = new FileOutputStream("D:\\tmp\\" + tabName+".xlsx");wb.write(fos);fos.flush();fos.close();//在servlet/web环境下测试此方法// ExportExcelUtil.downloadExcel(excelTitleCel,exportData,"生成Excel测试","生成Excel测试",response);} catch (Exception e) {e.printStackTrace();}}
  • 测试结果

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

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

相关文章

python代码练习:链表——分隔链表

参考知识&#xff1a; 什么是链表Optional有什么用 题目&#xff1a; 题目来源&#xff1a;力扣 代码&#xff1a; from typing import Optionalclass ListNode: 链表结点的数据类型 def __init__(self, val0,nextNone):self.val valself.next nextdef convert_to_linked…

index_jsp报错

今天跟着视频一模一样敲代码&#xff0c;一直报500 搜索了好几篇csdn&#xff0c;不断地修改添加的jstl.jar 和standard.jar&#xff0c;修改这两个jar包版本&#xff0c;还是报500 又看到说是因为tomcat10中存在jsp.jar&#xff0c;同时存在发生冲突&#xff0c;于是把tomcat…

字符型在内存中的存储

由于此字符型只占一个字节 所以它就不存在大端存储和小端存储。 字符型数据在内存中的存储的是ASCII码值转换成的二进制的补码&#xff08;有符号char的二进制也有原码&#xff0c;反码&#xff0c;补码之分&#xff09; 例 ↑的十进制的ASCII值为24 转换成二进制为00011000…

docker里Java服务执行ping命令模拟流式输出

文章目录 业务场景处理解决实现ping功能并实时返回输出实现长ping和中断请求docker容器找不到ping命令处理 业务场景 我们某市的客户&#xff0c;一直使用CS版本的信控平台&#xff0c;直接安装客户Windows server服务器上&#xff0c;主要对信号机设备进行在线管理、方案配时…

Peter:经济形势不好,一个最大的原因就是诚信道德的缺失 | 程客有话说002

《程客有话说》是我们最新推出的一个访谈栏目&#xff0c;邀请了一些国内外有趣的程序员来分享他们的经验、观点与成长故事&#xff0c;我们尝试建立一个程序员交流与学习的平台&#xff0c;也欢迎大家推荐朋友或自己来参加我们的节目&#xff0c;一起加油。本期我们邀请的程序…

实验一 安装和使用Oracle数据库

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…

基于人工蚁群、蚁群、遗传算法的多目标任务分配

matlab2020a可运行 基于人工蚁群、蚁群、遗传算法的多目标任务分配资源-CSDN文库

MAC磁盘空间不足怎么清理?MAC清理磁盘空间的五种方法

MAC磁盘空间不足怎么清理&#xff1f;当我们使用苹果MAC一段时间后&#xff0c;就会有大量的垃圾文件占用磁盘空间&#xff0c;例如系统缓存文件、应用程序缓存文件、备份和重复文件、旧版的应用程序及其部件等&#xff0c;为了不影响电脑的后续使用&#xff0c;我们需要经常清…

对java的interface的理解

一个例子来让我们理解更加深刻 这是我们的整体文件布局 ①A是接口 ②B和C是用来实现接口的类 ③show是我们的运行函数&#xff0c;用来展示 A接口 接口中定义的方法可以不用去实现,用其他类去实现(必须实现) 关键字:interface public interface A { // public static …

恭喜所有纺织人,你最想要的小程序来了

随着互联网的普及和电子商务的快速发展&#xff0c;越来越多的商家开始涉足线上销售。而小程序商城作为一种轻量级的应用程序&#xff0c;正逐渐成为商家们热衷选择的销售平台。本文将通过实用指南的形式&#xff0c;为商家们详细介绍如何通过乔拓云网后台&#xff0c;自助搭建…

C语言:预处理详解

创作不易&#xff0c;来个三连呗&#xff01; 一、预定义符号 C语⾔设置了⼀些预定义符号&#xff0c;可以直接使⽤&#xff0c;预定义符号也是在预处理期间处理的。 __FILE__ //进⾏编译的源⽂件 __LINE__ //⽂件当前的⾏号 __DATE__ //⽂件被编译的⽇期 __TIME__ //⽂件被编…

【前后端的那些事】评论功能实现

文章目录 聊天模块1. 数据库表2. 后端初始化2.1 controller2.2 service2.3 dao2.4 mapper 3. 前端初始化3.1 路由创建3.2 目录创建3.3 tailwindCSS安装 4. tailwindUI5. 前端代码编写 前言&#xff1a;最近写项目&#xff0c;发现了一些很有意思的功能&#xff0c;想写文章&…

最新 生成pdf文字和表格

生成pdf文字和表格 先看效果 介绍 java项目&#xff0c;使用apache的pdfbox工具&#xff0c;可分页&#xff0c;自定义列 依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.22<…

css 前端实现通过css动画实现进度条动态加载效果

效果图 代码 CommonProcess.vue 进度条动态加载组件代码 <!-- 进度条组件 --> <template><div class"common_process"><div v-for"(item, index) in dataList" :key"processType index" class"common_process_item…

SPI传感器接口设计与优化:基于STM32的实践

SPI&#xff08;串行外设接口&#xff09;是一种常用的串行通信协议&#xff0c;用于在微控制器和外部设备之间进行全双工的高速数据传输。在本文中&#xff0c;我们将探讨如何基于STM32微控制器设计和优化SPI传感器接口&#xff0c;并提供相应的代码示例。 1. SPI传感器接口设…

首届PolarDB开发者大会在京举办,阿里云李飞飞:云数据库加速迈向智能化

1月17日&#xff0c;阿里云PolarDB开发者大会在京举办&#xff0c;中国首款自研云原生数据库PolarDB发布“三层分离”新版本&#xff0c;基于智能决策实现查询性能10倍提升、节省50%成本。此外&#xff0c;阿里云全新推出数据库场景体验馆、训练营等系列新举措&#xff0c;广大…

【openwrt】【overlayfs】Openwrt系统overlayfs挂载流程

overlayfs是一种叠加文件系统&#xff0c;在openwrt和安卓系统中都有很广泛的应用&#xff0c;overlayfs通常用于将只读根文件系统(rootfs)和可写文件系统(jffs2)进行叠加后形成一个新的文件系统&#xff0c;这个新的文件系统“看起来”是可读写的&#xff0c;这种做法的好处是…

汽车美容行业研究:预计2029年将达到127亿美元

车体保养又习惯称汽车美容。主要目的是清除车体外和车体内的各种氧化和腐蚀&#xff0c;污染物等。然后加以保护&#xff0c;尽量突出车的“美”。它主要包括&#xff1a;车漆保养&#xff0c;内饰保养&#xff0c;电镀加工保养&#xff0c;皮革塑料保养&#xff0c;轮胎、轮毂…

UE C++打印文本的两种方式

UE C打印文本的两种方式 第一种方式UE_LOG打印打印出的内容在**输出日志**中显示 第二种方式GEngine->AddOnScreenDebugMessage打印&#xff08;常用&#xff09;打印出的内容在**控制台**中显示 第一种方式UE_LOG打印 官方文档&#xff1a; https://docs.unrealengine.com…

1、node.js安装

文章目录 node.js下载及安装node.js安装验证node执行js代码 node.js下载及安装 https://nodejs.org/en 访问官网&#xff0c;下载LTS版本 下载完成后&#xff0c;双击安装&#xff0c;安装过程基本不用动什么&#xff0c;包括盘符也尽量不要改。 node.js安装验证 cmd运行nod…