EasyExcel填充模板导出excel.xlsx

菜鸟的自我救赎,自从有了GPT,还是头一次一个bug写一天。
直接贴导出excel模板的完整案例

官网冲刺 EasyExcel

EasyExcel填充模板导出excel.xlsx / 导出excel模板

一、bug(不需要请跳过)

1.1 使用apache poi操作excel报错 java.lang.NoSuchMethodError: org.apache.logging.log4j.Logger.atTrace()Lorg/apache/logging/log4j/

1.2EasyPoi读取word时报错java.util.zip.ZipException: Unexpected record signature: 0X9

二、配置文件

<!--以下代码为 使用easyExcel需要用到的包-->
<dependencies><!--排除自带低版本poi,解决依赖冲突问题--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version><exclusions><exclusion><groupId>org.apache.poi</groupId><artifactId>poi</artifactId></exclusion><exclusion><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></exclusion><exclusion><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId></exclusion></exclusions></dependency><!--添加适合的版本依赖--><!--排除自带低版本log4j-api,解决依赖冲突问题--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.2</version><exclusions><exclusion><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version><exclusions><exclusion><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId></exclusion></exclusions></dependency><!--添加适合的版本依赖--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.23.1</version></dependency></dependencies>

三、 excel模板

在这里插入图片描述

四、 模板存放路径

在这里插入图片描述

五、 代码

5.1 Controller

参数不需要可以去掉

  @GetMapping("/excel/export/details")public void excelExport(@RequestParam(name = "xxxx", required = false) String purchaseSeq, HttpServletResponse response) {purchaseOrderService.excelExportDetails(purchaseSeq, response);}

5.2 实体

package com.zetian.platform.modules.order.vo;import java.io.Serializable;
import java.util.Date;public class AdminPurchaseOrderDetailsExportDTO  implements Serializable {private static final long serialVersionUID = 1L;/*** 订单号*/private String purchaseSeq;/*** 下单门店*/private String orderStore;/*** 门店编码*/private String storeCode;/*** 联系人*/private String user;/*** 联系电话*/private String userMobile;/*** 门店类型*/private String storeType;/*** 收货地址*/private String userAddress;/*** 创建时间*/private Date createTime;/*** 发货日期*/private Date expectTime;/*** 订单状态*/private String orderStatus;/*** 订单来源*/private String orderSource;/*** 下单金额*/private String orderPrice;/*** 发货金额*/private String deliveryAmount;/*** 收货金额*/private String receivedAmount;/*** 司机*/private String driver;/*** 司机电话*/private String driverMobile;/*** 送货时间*/private Date deliveryTime;/*** 采购*/private String purchaseUser;/*** 采购电话*/private String purchaseMobile;//TODO  详情部分  待添加public String getPurchaseSeq() {return purchaseSeq;}public void setPurchaseSeq(String purchaseSeq) {this.purchaseSeq = purchaseSeq;}public String getOrderStore() {return orderStore;}public void setOrderStore(String orderStore) {this.orderStore = orderStore;}public String getStoreCode() {return storeCode;}public void setStoreCode(String storeCode) {this.storeCode = storeCode;}public String getUser() {return user;}public void setUser(String user) {this.user = user;}public String getUserMobile() {return userMobile;}public void setUserMobile(String userMobile) {this.userMobile = userMobile;}public String getStoreType() {return storeType;}public void setStoreType(String storeType) {this.storeType = storeType;}public String getUserAddress() {return userAddress;}public void setUserAddress(String userAddress) {this.userAddress = userAddress;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public Date getExpectTime() {return expectTime;}public void setExpectTime(Date expectTime) {this.expectTime = expectTime;}public String getOrderStatus() {return orderStatus;}public void setOrderStatus(String orderStatus) {this.orderStatus = orderStatus;}public String getOrderSource() {return orderSource;}public void setOrderSource(String orderSource) {this.orderSource = orderSource;}public String getOrderPrice() {return orderPrice;}public void setOrderPrice(String orderPrice) {this.orderPrice = orderPrice;}public String getDeliveryAmount() {return deliveryAmount;}public void setDeliveryAmount(String deliveryAmount) {this.deliveryAmount = deliveryAmount;}public String getReceivedAmount() {return receivedAmount;}public void setReceivedAmount(String receivedAmount) {this.receivedAmount = receivedAmount;}public String getDriver() {return driver;}public void setDriver(String driver) {this.driver = driver;}public String getDriverMobile() {return driverMobile;}public void setDriverMobile(String driverMobile) {this.driverMobile = driverMobile;}public Date getDeliveryTime() {return deliveryTime;}public void setDeliveryTime(Date deliveryTime) {this.deliveryTime = deliveryTime;}public String getPurchaseUser() {return purchaseUser;}public void setPurchaseUser(String purchaseUser) {this.purchaseUser = purchaseUser;}public String getPurchaseMobile() {return purchaseMobile;}public void setPurchaseMobile(String purchaseMobile) {this.purchaseMobile = purchaseMobile;}
}

5.3 Service

使用 @Value(“classpath:xx/xx/xxx.xlsx”) 获取文件路径

	@Value("classpath:template/excel/ExportPurchaseOrderDetailsTemplate.xlsx")private org.springframework.core.io.Resource templateResource;

方法

public void excelExportDetails(String purchaseSeq, HttpServletResponse response) {try (InputStream templateInputStream = templateResource.getInputStream()) {// 检查模板文件是否存在if (!templateResource.exists()) {throw new RuntimeException("模板文件不存在!路径为:" + templateResource.getDescription());}// 设置响应头,告诉浏览器这是一个文件下载请求String fileName = URLEncoder.encode("导出采购订单详情", "UTF-8") + ".xlsx";response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");response.setHeader("Content-Disposition", "attachment;filename=" + fileName);AdminPurchaseOrderDetailsExportDTO adminPurchaseOrderDetailsExportDTO = new AdminPurchaseOrderDetailsExportDTO();adminPurchaseOrderDetailsExportDTO.setOrderStore("1");adminPurchaseOrderDetailsExportDTO.setStoreCode("21321");adminPurchaseOrderDetailsExportDTO.setUser("312321");adminPurchaseOrderDetailsExportDTO.setUserMobile("12321");adminPurchaseOrderDetailsExportDTO.setStoreType("321321");adminPurchaseOrderDetailsExportDTO.setUserAddress("123123");adminPurchaseOrderDetailsExportDTO.setCreateTime(new Date());adminPurchaseOrderDetailsExportDTO.setExpectTime(new Date());adminPurchaseOrderDetailsExportDTO.setOrderStatus("213213");adminPurchaseOrderDetailsExportDTO.setOrderSource("21312");adminPurchaseOrderDetailsExportDTO.setOrderPrice("12312");adminPurchaseOrderDetailsExportDTO.setDeliveryAmount("312321");adminPurchaseOrderDetailsExportDTO.setReceivedAmount("312321");adminPurchaseOrderDetailsExportDTO.setDriver("21321");adminPurchaseOrderDetailsExportDTO.setDriverMobile("12321");adminPurchaseOrderDetailsExportDTO.setDeliveryTime(new Date());adminPurchaseOrderDetailsExportDTO.setPurchaseUser("312312");adminPurchaseOrderDetailsExportDTO.setPurchaseMobile("321321321");try (ServletOutputStream outputStream = response.getOutputStream()) {EasyExcelFactory.write(outputStream) // 将文件写入输出流,而不是文件路径.withTemplate(templateInputStream) // 使用模板.sheet() // 填充第一个sheet.doFill(adminPurchaseOrderDetailsExportDTO); // 填充数据}} catch (Exception e) {throw new RuntimeException("导出 Excel 文件失败", e);}}

六 测试

在这里插入图片描述

七 成果展示

在这里插入图片描述

八 导出列表数据

8.1 修改实体类

package com.zetian.platform.modules.order.vo;import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;
import java.util.List;/*** @author xxxxx* @Description  excel采购单详情 头部信息* @since 2024/10/14 16:42**/
public class AdminPurchaseOrderDetailsExportDTO  implements Serializable {private static final long serialVersionUID = 1L;/*** 订单号*/private String purchaseSeq;/*** 下单门店*/private String orderStore;/*** 门店编码*/private String storeCode;/*** 联系人*/private String user;/*** 联系电话*/private String userMobile;/*** 门店类型*/private String storeType;/*** 收货地址*/private String userAddress;/*** 创建时间*/private Date createTime;/*** 发货日期*/private Date expectTime;/*** 订单状态*/private String orderStatus;/*** 订单来源*/private String orderSource;/*** 下单金额*/private String orderPrice;/*** 发货金额*/private String deliveryAmount;/*** 收货金额*/private String receivedAmount;/*** 司机*/private String driver;/*** 司机电话*/private String driverMobile;/*** 送货时间*/private Date deliveryTime;/*** 采购*/private String purchaseUser;/*** 采购电话*/private String purchaseMobile;/*** 订单详情*/private List<OrderItem> orderItems;public String getPurchaseSeq() {return purchaseSeq;}public void setPurchaseSeq(String purchaseSeq) {this.purchaseSeq = purchaseSeq;}public String getOrderStore() {return orderStore;}public void setOrderStore(String orderStore) {this.orderStore = orderStore;}public String getStoreCode() {return storeCode;}public void setStoreCode(String storeCode) {this.storeCode = storeCode;}public String getUser() {return user;}public void setUser(String user) {this.user = user;}public String getUserMobile() {return userMobile;}public void setUserMobile(String userMobile) {this.userMobile = userMobile;}public String getStoreType() {return storeType;}public void setStoreType(String storeType) {this.storeType = storeType;}public String getUserAddress() {return userAddress;}public void setUserAddress(String userAddress) {this.userAddress = userAddress;}public Date getCreateTime() {return createTime;}public void setCreateTime(Date createTime) {this.createTime = createTime;}public Date getExpectTime() {return expectTime;}public void setExpectTime(Date expectTime) {this.expectTime = expectTime;}public String getOrderStatus() {return orderStatus;}public void setOrderStatus(String orderStatus) {this.orderStatus = orderStatus;}public String getOrderSource() {return orderSource;}public void setOrderSource(String orderSource) {this.orderSource = orderSource;}public String getOrderPrice() {return orderPrice;}public void setOrderPrice(String orderPrice) {this.orderPrice = orderPrice;}public String getDeliveryAmount() {return deliveryAmount;}public void setDeliveryAmount(String deliveryAmount) {this.deliveryAmount = deliveryAmount;}public String getReceivedAmount() {return receivedAmount;}public void setReceivedAmount(String receivedAmount) {this.receivedAmount = receivedAmount;}public String getDriver() {return driver;}public void setDriver(String driver) {this.driver = driver;}public String getDriverMobile() {return driverMobile;}public void setDriverMobile(String driverMobile) {this.driverMobile = driverMobile;}public Date getDeliveryTime() {return deliveryTime;}public void setDeliveryTime(Date deliveryTime) {this.deliveryTime = deliveryTime;}public String getPurchaseUser() {return purchaseUser;}public void setPurchaseUser(String purchaseUser) {this.purchaseUser = purchaseUser;}public String getPurchaseMobile() {return purchaseMobile;}public void setPurchaseMobile(String purchaseMobile) {this.purchaseMobile = purchaseMobile;}public static class OrderItem implements Serializable {private static final long serialVersionUID = 1L;private String rootCategoryCode;private String parentCategoryCode;private String categoryCode;public String getRootCategoryCode() {return rootCategoryCode;}public void setRootCategoryCode(String rootCategoryCode) {this.rootCategoryCode = rootCategoryCode;}public String getParentCategoryCode() {return parentCategoryCode;}public void setParentCategoryCode(String parentCategoryCode) {this.parentCategoryCode = parentCategoryCode;}public String getCategoryCode() {return categoryCode;}public void setCategoryCode(String categoryCode) {this.categoryCode = categoryCode;}}
}

8.2 修改service

由于流使用一次就会关闭,这里选择一次性操作。
你也可以使用缓存的方式分两次写入。

 @Value("classpath:template/excel/ExportPurchaseOrderDetailsTemplate.xlsx")private org.springframework.core.io.Resource templateResource;public void excelExportDetails(String purchaseSeq, HttpServletResponse response) {try (InputStream templateInputStream = templateResource.getInputStream()) {// 检查模板文件是否存在if (!templateResource.exists()) {throw new RuntimeException("模板文件不存在!路径为:" + templateResource.getDescription());}// 设置响应头,告诉浏览器这是一个文件下载请求String fileName = URLEncoder.encode("导出采购订单详情", "UTF-8") + ".xlsx";response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");response.setHeader("Content-Disposition", "attachment;filename=" + fileName);AdminPurchaseOrderDetailsExportDTO adminPurchaseOrderDetailsExportDTO = new AdminPurchaseOrderDetailsExportDTO();adminPurchaseOrderDetailsExportDTO.setOrderStore("1");adminPurchaseOrderDetailsExportDTO.setStoreCode("21321");adminPurchaseOrderDetailsExportDTO.setUser("312321");adminPurchaseOrderDetailsExportDTO.setUserMobile("12321");adminPurchaseOrderDetailsExportDTO.setStoreType("321321");adminPurchaseOrderDetailsExportDTO.setUserAddress("123123");adminPurchaseOrderDetailsExportDTO.setCreateTime(new Date());adminPurchaseOrderDetailsExportDTO.setExpectTime(new Date());adminPurchaseOrderDetailsExportDTO.setOrderStatus("213213");adminPurchaseOrderDetailsExportDTO.setOrderSource("21312");adminPurchaseOrderDetailsExportDTO.setOrderPrice("12312");adminPurchaseOrderDetailsExportDTO.setDeliveryAmount("312321");adminPurchaseOrderDetailsExportDTO.setReceivedAmount("312321");adminPurchaseOrderDetailsExportDTO.setDriver("21321");adminPurchaseOrderDetailsExportDTO.setDriverMobile("12321");adminPurchaseOrderDetailsExportDTO.setDeliveryTime(new Date());adminPurchaseOrderDetailsExportDTO.setPurchaseUser("312312");adminPurchaseOrderDetailsExportDTO.setPurchaseMobile("321321321");List<AdminPurchaseOrderDetailsExportDTO.OrderItem> orderItemList = new ArrayList<>();AdminPurchaseOrderDetailsExportDTO.OrderItem orderItem = new AdminPurchaseOrderDetailsExportDTO.OrderItem();orderItem.setRootCategoryCode("3123213");orderItem.setParentCategoryCode("123213");orderItem.setCategoryCode("123213");orderItemList.add(orderItem);AdminPurchaseOrderDetailsExportDTO.OrderItem orderItem1 = new AdminPurchaseOrderDetailsExportDTO.OrderItem();orderItem1.setRootCategoryCode("dsfsfds");orderItem1.setParentCategoryCode("sdfgdsfg");orderItem1.setCategoryCode("werewrewrwe");orderItemList.add(orderItem1);try (ServletOutputStream outputStream = response.getOutputStream()) {// 一次性写入单个对象数据和对象列表数据ExcelWriter excelWriter = EasyExcelFactory.write(outputStream).withTemplate(templateInputStream).build();WriteSheet writeSheet = EasyExcel.writerSheet(0).build();// 填充单个对象数据excelWriter.fill(adminPurchaseOrderDetailsExportDTO, writeSheet);// 填充对象列表数据excelWriter.fill(orderItemList, writeSheet);// 结束写入excelWriter.finish();}catch (Exception e){throw new RuntimeException("导出 Excel 文件失败11111111111", e);}} catch (Exception e) {throw new RuntimeException("导出 Excel 文件失败", e);}}

8.3 成品

这里只做了几个简单的参数例子

在这里插入图片描述

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

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

相关文章

与双指针的亲密接触:快与慢的浪漫交错

公主请阅 1.合并两个有序数组1.1 题目说明示例 1示例 2示例 3 1.2 题目分析 1.3代码部分1.4 代码解析 2.移动零2.1题目说明示例 1示例 2 2.2题目分析2.3代码部分2.4代码解析 1.合并两个有序数组 题目传送门 1.1 题目说明 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums…

汽车免拆诊断案例 | 2022款大众捷达VS5车行驶中挡位偶尔会锁在D3挡

故障现象  一辆2022款大众捷达VS5汽车&#xff0c;搭载EA211发动机和手自一体变速器&#xff0c;累计行驶里程约为4.5万km。该车行驶中挡位偶尔会锁在D3挡&#xff0c;车速最高约50 km/h&#xff0c;且组合仪表上的发动机故障灯和EPC灯异常点亮。 故障诊断  用故障检测仪检…

linux一二三章那些是重点呢

第一章 静态库动态库的区别 什么是库 库文件是计算机上的一类文件&#xff0c;可以简单的把库文件看成一种代码仓库&#xff0c;它提供给使用者一些可以直接 拿来用的变量、函数或类。 如何制作 静态动态库 静态库&#xff1a; GCC 进行链接时&#xff0c;会把静态库中代码打…

MySQL-15.DQL-分页查询

一.DQL-分页查询 -- 分页查询 -- 1. 从 起始索引0 开始查询员工数据&#xff0c;每页展示5条记录 select * from tb_emp limit 0,5; -- 2.查询 第1页 员工数据&#xff0c;每页展示5条记录 select * from tb_emp limit 0,5; -- 3.查询 第2页 员工数据&#xff0c;每页展示5条记…

Golang | Leetcode Golang题解之第491题非递减子序列

题目&#xff1a; 题解&#xff1a; var (temp []intans [][]int )func findSubsequences(nums []int) [][]int {ans [][]int{}dfs(0, math.MinInt32, nums)return ans }func dfs(cur, last int, nums []int) {if cur len(nums) {if len(temp) > 2 {t : make([]int, len(…

4.计算机网络_TCP

可靠与效率 TCP的主要特点&#xff1a; TCP是面向连接的运输层协议&#xff0c;每一条TCP连接只能有两个端点&#xff0c;即&#xff1a;点对点、一对一形式。每一个端口都是一个socket。TCP提供可靠交付的服务TCP提供全双工通信&#xff0c;因为TCP的收发缓冲区是分开的。TC…

java导出带图形的word

先看效果图&#xff1a;方法都是一样的&#xff0c;所以数据只做了前两组 第一步需要准备模版&#xff1a; 新建一个word插入图表&#xff0c;选择想要的图表。 编辑图表&#xff1a;营业额表示数字&#xff0c;季度表示文字。其他的样式编辑可根据自己的需求更改&#xff0c;…

(42)MATLAB中使用fftshift绘制以零为中心的功率谱

文章目录 前言一、MATLAB代码二、仿真结果画图 前言 在分析信号的频率分量时&#xff0c;将零频分量平移到频谱中心会很有帮助。本例给出绘制以零为中心的功率谱的方法。 一、MATLAB代码 代码如下&#xff1a; f 1; % 余弦波的振荡频率&#xf…

400行程序写一个实时操作系统(十):用面向对象思想构建抢占式内核

前言 通过前几章的学习&#xff0c;我们学会了如何为RTOS设计一个合理的内存管理算法。现在&#xff0c;是时候学习设计RTOS内核了。 关于RTOS内核的文章也有很多&#xff0c;但都有一点先射箭再化靶子的意味。要么是代码连篇解释却寥寥无几&#xff0c;要么是要先怎么样再怎么…

大数据linux操作系统

第一关&#xff1a;Linux的初体验 答案&#xff1a; cd / ls -a / &#xff08;里面有空格要注意&#xff09; 第二关&#xff1a;Linux的常用命令 答案&#xff1a; touch newfile mkdir newdir cp newfile newdir/newfileCpy 第三关&#xff1a;Linux查询命令帮助语句…

飞机大战告尾

参考 PPO算法逐行代码详解 链接 通过网盘分享的文件&#xff1a;PlaneWar 链接: https://pan.baidu.com/s/1cbLKTcBxL6Aem3WkyDtPzg?pwd1234 提取码: 1234 10.17关于博客发了又改这件事 悲催的事 今天训练了一早上ppo模型&#xff0c;满怀期待的检测成果时发现一点长进都…

根据语音生成视频33搜帧

33搜帧&#xff0c;是一个能根据语音生成视频的网站&#xff0c;33搜帧 - 视频帧画面搜索引擎 33搜帧是一个使用AI技术构建的视频帧画面搜索引擎&#xff0c;和一般素材平台通过视频标签来搜索视频不同&#xff0c;33搜帧能搜索到视频素材中的每一帧画面&#xff0c;这个功能可…

基于SpringBoot+Vue+uniapp的海产品加工销售一体化管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的视频演示 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

软考(网工)——网络操作系统与应用服务器

文章目录 网络操作系统与应用服务器&#x1f550;本地用户与组1️⃣Windows server 2008R2 本地用户与组2️⃣常见用户组与权限 &#x1f551;活动目录1️⃣活动目录2️⃣活动目录&#xff08;Active Directory&#xff0c;AD)3️⃣活动目录工作组分类 &#x1f552;远程桌面与…

uniapp学习(005-1 详解Part.1)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第36p-第p40的内容 文章目录 响应式尺寸单位 rpx各种工具修改ui给的图片的宽度ps操作步骤即时设计操作步骤&…

高级算法设计与分析 学习笔记13 线性规划

注意是线性规划不是动态规划哦 好家伙&#xff0c;这不是凸优化吗&#xff1f; 凸优化标准形式&#xff1a; 先改成统一最大化&#xff08;凸优化那边怎么是统一最小化&#xff1f;&#xff09; 原来的x2正负无所谓&#xff0c;但我希望每个x都是有限制的&#xff0c;所以把它改…

高德开放平台API调用实战指南

本文 一、地图展示1.1 地图初始化与展示1.2 自定义标记 二、路线规划2.1 驾车路线规划2.2 步行路线规划 三、定位服务3.1 使用JavaScript API进行定位3.2 IP定位 四、实时交通信息查询4.1 获取实时交通路况 五、智能调度引擎总结 一、地图展示 地图展示是开发基于地理信息系统…

【MySQL】设置二进制日志文件自动过期,从根源上解决占满磁盘的问题:通过修改 binlog_expire_logs_seconds 配置项

引言 MySQL的二进制日志&#xff08;binlog&#xff09;文件记录了数据库中所有更改的详细信息&#xff0c;包括但不限于对数据的插入、删除、更新&#xff0c;对表和数据库的创建、更改、删除等操作。每一次这样的操作都会在二进制日志中生成一个新的日志事件&#xff0c;并被…

【Linux】命令行下的增删查改之“查看”

致谢:Linux常用命令大全(手册) – 真正好用的Linux命令在线查询网站 提供的命令查询 头部内容获取(head) head命令的功能是显示文件开头的内容&#xff0c;默认值为前10行。 指令参数&#xff1a; -n 定义显示行数 -c 指定显示头部内容的字符数 -v 总是显示文件名的头信…

实现双向链表的增删改查

头文件 #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> typedef int LTDataType; typedef struct ListNode {LTDataType data;struct ListNode* prev;struct ListNode* next; } LTNode; //v…