数据导入导出(EasyExcel)框架入门指南
写在前面
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站
文章目录
- EasyExcel 框架
- 概述
- 依赖
- API
- Excel 实体类注解
- 写 Excel
- 概念介绍
- 写 Excel 通用参数
- WriteWorkbook
- WriteSheet
- WriteTable
- 代码示例
- 创建 Excel 文件
- (1)配置实体类
- (2)Excel 文件的生成和下载
- 模板打印
- (1)定义模板
- (2)填充模板并下载 Excel 模板文件
- 解析 Excel 文件
- (1)配置实体类
- (2)解析 Excel 文件
- 拓展
- csv 读写的支持
EasyExcel 框架
本文仅作为快速入门指南,深入学习详见官方文档
概述
Java 解析、生成 Excel 比较有名的框架有Apache poi、jxl,但它们都存在一些严重的问题,如代码编写繁琐且重复,极其耗费内存。EasyExcel 是一个基于 Java 的简单、省内存的读写 Excel 的开源项目。在尽可能节约内存的情况下支持读写百万级数据的 Excel。
EasyExcel:阿里巴巴开源的操作 Excel 的框架,底层封装的 POI,可以大大减少占用内存的主要原因是在解析 Excel 时,没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
下图是 easyExcel 和 POI 在解析 Excel 时的对比图:

easyExcel 采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener)。

- 在实体类上配置注解(适配 Excel 中的标题)
- 调用 EasyExcel 的工具类方法,完成文件的上传或者下载
依赖
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.1</version></dependency>
API
Excel 实体类注解
-
@ExcelIgnoreUnannotated:标注在实体类上,作用是只使用标注了 @ExcelProperty 注解的字段参与 excel 读写。默认是不管加不加 ExcelProperty 的注解,所有字段都会参与读写
-
@ExcelProperty:标注在实体类属性上,用于 excel 的列和实体类属性的匹配
参数如下:
名称 默认值 描述 value 空 用于匹配excel中的头,必须全匹配,如果有多行头,会匹配最后一行头 order Integer.MAX_VALUE 优先级高于 value,会根据order的顺序来匹配实体和 excel 中数据的顺序index -1 优先级高于 value和order,会根据index直接指定到excel中具体的哪一列converter 自动选择 指定当前字段用什么转换器,默认会自动选择。写的情况下只要实现 com.alibaba.excel.converters.Converter#convertToExcelData(com.alibaba.excel.converters.WriteConverterContext<T>)方法即可 -
@ExcelIgnore:标注在实体类属性上,默认所有字段都会和 excel 去匹配,加了这个注解会忽略该字段
-
@DateTimeFormat:标注在实体类属性上,日期转换
参数如下:
名称 默认值 描述 value 空 参照 java.text.SimpleDateFormat书写即可use1904windowing 自动选择 excel中时间是存储1900年起的一个双精度浮点数,但是有时候默认开始日期是1904,所以设置这个值改成默认1904年开始 -
@NumberFormat:标注在实体类属性上,数字转换
参数如下:
名称 默认值 描述 value 空 参照 java.text.DecimalFormat书写即可roundingMode RoundingMode.HALF_UP 格式化的时候设置舍入模式
写 Excel
概念介绍
- WriteWorkbook :可以理解成一个 excel 文件
- WriteSheet :理解成一个excel 文件里面的一个表单
- WriteTable : 一个表单里面如果有多个实际用的表格,则可以用
WriteTablejava
写 Excel 通用参数
WriteWorkbook,WriteSheet ,WriteTable 都会有的参数,如果为空,默认使用上级。
| 名称 | 默认值 | 描述 |
|---|---|---|
| converter | 空 | 默认加载了很多转换器,这里可以加入不支持的字段 |
| writeHandler | 空 | 写的处理器。可以实现WorkbookWriteHandler,SheetWriteHandler,RowWriteHandler,CellWriteHandler,在写入excel的不同阶段会调用 |
| relativeHeadRowIndex | 0 | 写入到excel和上面空开几行 |
| head | 空 | 与clazz二选一。读取文件头对应的列表,会根据列表匹配数据,建议使用class |
| clazz | 空 | 与head二选一。读取文件的头对应的class,也可以使用注解。如果两个都不指定,则会读取全部数据 |
| autoTrim | true | 会对头、读取数据等进行自动trim |
| use1904windowing | false | excel中时间是存储1900年起的一个双精度浮点数,但是有时候默认开始日期是1904,所以设置这个值改成默认1904年开始 |
| useScientificFormat | false | 数字转文本的时候在较大的数值的是否是否采用科学计数法 |
| needHead | true | 是否需要写入头到excel |
| useDefaultStyle | true | 是否使用默认的样式 |
| automaticMergeHead | true | 自动合并头,头中相同的字段上下左右都会去尝试匹配 |
| excludeColumnIndexes | 空 | 需要排除对象中的index的数据 |
| excludeColumnFieldNames | 空 | 需要排除对象中的字段的数据 |
| includeColumnIndexes | 空 | 只要导出对象中的index的数据 |
| includeColumnFieldNames | 空 | 只要导出对象中的字段的数据 |
WriteWorkbook
设置方法如下(找不到参数的看下通用参数里面是否存在):
EasyExcel.write(fileName, DemoData.class)// 在 write 方法之后, 在 sheet方法之前都是设置 WriteWorkbook 的参数.sheet("模板").doWrite(() -> {// 分页查询数据return data();});
WriteWorkbook 方法:
public static ExcelWriterBuilder write()
public static ExcelWriterBuilder write(File file)
public static ExcelWriterBuilder write(String pathName)
public static ExcelWriterBuilder write(String pathName, Class head)
public static ExcelWriterBuilder write(OutputStream outputStream)
public static ExcelWriterBuilder write(OutputStream outputStream, Class head)
// 参数说明:
// file 创建的excel文件路径,路径需包含文件名
// pathName 创建的excel文件路径,路径需包含文件名
// outputStream 创建的excel文件的输出流,路径需包含文件名
// head excel文件的行头实体类(标题栏)
WriteWorkbook 参数:
| 名称 | 默认值 | 描述 |
|---|---|---|
| excelType | 空 | 当前excel的类型,支持XLS、XLSX、CSV |
| outputStream | 空 | 与file二选一。写入文件的流 |
| file | 空 | 与outputStream二选一。写入的文件 |
| templateInputStream | 空 | 模板的文件流 |
| templateFile | 空 | 模板文件 |
| charset | Charset#defaultCharset | 只有csv文件有用,写入文件的时候使用的编码 |
| autoCloseStream | true | 自动关闭写入的流。 |
| password | 空 | 读取文件的密码 |
| inMemory | false | 是否在内存处理,默认会生成临时文件以节约内存。内存模式效率会更好,但是容易OOM |
| writeExcelOnException | false | 写入过程中抛出异常了,是否尝试把数据写入到excel |
WriteSheet
-
设置方法如下(找不到参数的看下通用参数里面是否存在)
EasyExcel.write(fileName, DemoData.class).sheet("模板")// 在 sheet 方法之后, 在 doWrite方法之前都是设置WriteSheet的参数.doWrite(() -> {// 分页查询数据return data();});参数说明:
名称 默认值 描述 sheetNo 0 需要写入的编码 sheetName 空 需要些的Sheet名称,默认同 sheetNo
WriteTable
-
设置方法如下(找不到参数的看下通用参数里面是否存在)
EasyExcel.write(fileName, DemoData.class).sheet("模板").table()// 在 table 方法之后, 在 doWrite方法之前都是设置WriteTable的参数.doWrite(() -> {// 分页查询数据return data();});参数说明:
名称 默认值 描述 tableNo 0 需要写入的编码
代码示例
创建 Excel 文件
(1)配置实体类
在 EasyExcel 中,通过 java 代码生成或者解析 Excel 文件很简单。不需要创建繁琐的表头
-
创建数据行的实体类 : ContractProductVo
-
在实体类上通过注解配置 :标题,行高,列宽等数据
- @ExcelProperty:在创建Excel的时候,自动的读取实体类中的注解配置,生成表头
-
示例代码如下
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.format.DateTimeFormat; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.write.style.ContentRowHeight; import com.alibaba.excel.annotation.write.style.HeadRowHeight; import lombok.Data; import java.util.Date;/*** Excel 实体类*/ @Data @ContentRowHeight(20) //数据行高数 @HeadRowHeight(20) //表头高度 @ColumnWidth(15) //列宽 public class UserExcelVo {@ExcelProperty("用户名")private String username;@ExcelProperty("密码")private String password;@ExcelProperty("电话")private String phone;@ExcelProperty("创建时间")@DateTimeFormat("yyyy-MM-dd")private Date createTime; }
(2)Excel 文件的生成和下载
-
在 java 代码中通过 EasyExcel 工具类完成 excel 文件的生成和下载
-
示例代码如下
/*** 使用 EasyExcel完成 excel 的生成和下载* 1、数据查询* 2、设置下载信息* 3、调用EasyExcel的工具类完成生成下载*/@RequestMapping("/printEasyExcel")public void printEasyExcel(String inputDate) throws IOException {//1、数据查询List<ContractProductVo> list = contractService.findByShipTime(inputDate+"%");//2、设置下载信息response.setContentType("application/vnd.ms-excel"); //下载excelresponse.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("出货表", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");//3、调用EasyExcel的工具类完成生成下载EasyExcel.write(response.getOutputStream()).head(ContractProductVo.class) //设置表头.sheet("test127") //指定页名称.doWrite(list); //设置数据}
模板打印
对于复杂样式的 Excel 文件创建,EasyExcel 支持模板打印。以一个 Excel 文件作为模板,自动的进行数据的拓展和填充。
- 定义模板 ( 配置好了所有的样式 )
- 配置实体类(表头)
- java代码填充模板并下载 Excel
(1)定义模板
- 在 easyExcel 中,支持两个模板语言
- 语法:{map中的key}
- 传入一个 map 集合:往往是用于处理非list集合的数据
- 语法:{.对象中的属性名}
- 传入一个 list 集合,会自动的循环 list 集合构造数据列表

(2)填充模板并下载 Excel 模板文件
/*** 模板打印**/@RequestMapping("/printTemplate")public void printTemplate(String inputDate) throws IOException {//1.准备数据List<ContractProductVo> list = contractService.findByShipTime(inputDate+"%");Map map = new HashMap<>();inputDate = inputDate.replaceAll("-0","-").replaceAll("-","年");map.put("time",inputDate);map.put("title1","客户名称");//2.设置下载信息response.setContentType("application/vnd.ms-excel"); //下载excelresponse.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("出货表", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");//3.加载excel模板String path = session.getServletContext().getRealPath("/")+"/make/tOUTPRODUCT.xlsx";//4.创建EasyExcel的excelWtire对象( 用于数据填充)ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).head(ContractProductVo.class) //设置表头.withTemplate(path) //加载模板.build();//获取sheet对象WriteSheet sheet = EasyExcel.writerSheet().build();//5.调用方法完成填充map数据excelWriter.fill(map,sheet);//6.调用方法完成填充list数据excelWriter.fill(list,sheet);//7.属性资源,完成下载excelWriter.finish(); //下载excel文件,释放内存资源}
解析 Excel 文件
(1)配置实体类
创建实体类对象(用于解析封装对象),配置表头注解,EasyExcel 自动的根据注解配置获取文件中对应行的内容
- @ExcelIgnoreUnannotated:忽略默认表头配置
- @ExcelPropertym:配置表头
import cn.itcast.domain.BaseEntity;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;import java.io.Serializable;
import java.util.List;/*** 合同下货物的实体类* 通过EasyExcel完成文件解析,在实体类上通过注解配置表头* 如果实体类中的属性,未配置@ExcelProperty* 默认按照属性的编写顺序,从excel中获取数据* 默认情况下,为配置注解的属性会影响数据封装* 在类上配置一个注解:忽略未配置注解的属性*/
@ExcelIgnoreUnannotated
@Data
public class ContractProduct extends BaseEntity implements Serializable {private String id;@ExcelProperty("货号")private String productNo; //货号private String productImage; //图片路径@ExcelProperty("货物描述")private String productDesc; //货描@ExcelProperty("装率")private String loadingRate; //报运:装率 1/3@ExcelProperty("箱数")private Integer boxNum; //报运:箱数 100@ExcelProperty("包装单位")private String packingUnit; //包装单位:PCS/SETS 支/箱@ExcelProperty("数量")private Integer cnumber; //数量 300private Integer outNumber; //报运:出货数量 200private Integer finished; //报运:是否完成 no@ExcelProperty("要求")private String productRequest; //要求@ExcelProperty("单价")private Double price; //单价private Double amount; //总金额,冗余private Integer orderNo; //排序号private String contractId; //合同号@ExcelProperty("生产厂家")private String factoryName; //厂家名称,冗余字段private String factoryId;private List<ExtCproduct> extCproducts ; //货物和附件,一对多
}
(2)解析 Excel 文件
修改 ContractProductController 对象,完成 EasyExcel 的文件批量上传
/*** 通过 EasyExcel 完成文件上传解析,批量货物保存* 参数:购销合同id* 参数:上传的excel文件对象*/@RequestMapping("/import")public String importExcel(String contractId, MultipartFile file) throws Exception {List<ContractProduct> list = EasyExcel.read(file.getInputStream()).head(ContractProduct.class) //设置表头,将数据转化为目标对象.sheet(0) //读取第一页数据.doReadSync(); //解析excel,获取所有的数据for (ContractProduct contractProduct : list) {System.out.println(contractProduct);contractProduct.setContractId(contractId);contractProduct.setCompanyId(getLoginCompanyId());contractProduct.setCompanyName(getLoginCompanyName());}contractProductService.saveAll(list);return "redirect:/cargo/contractProduct/list.do?contractId="+contractId;}
拓展
csv 读写的支持
在3.0.0-beta1版本开始支持,读的时候会自动判断。写的时候指定 excelType 就行。
EasyExcel.write(fileName, DemoData.class)// 指定导出类型为csv.excelType(ExcelTypeEnum.CSV).sheet("模板").doWrite(() -> {// 分页查询数据return data();});
相关文章:
数据导入导出(EasyExcel)框架入门指南
写在前面 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 文章目录 EasyExcel 框架概述依赖APIExcel 实体类注解写 Excel概念介绍写 Excel 通用参数WriteWorkbookWriteSheetWriteTable 代码…...
Ubuntu如何实现每天定时关机
要在Ubuntu中实现每天定时关机,你可以使用cron来安排定时任务。以下是具体的步骤: 步骤 1: 创建脚本 打开终端。使用文本编辑器创建一个新的文件。例如: nano ~/shutdown_script.sh 步骤 2: 编写脚本 在编辑器中输入以下内容:…...
【MySQL进阶】事务、存储引擎、索引、SQL优化、锁
一、事务 1.概念 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向 系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 例子:转账,要求扣钱和进账…...
BeanDefinitionOverrideException产生原因及解决方案
BeanDefinitionOverrideException 是 Spring 框架中与依赖注入(Dependency Injection)相关的异常。它通常在 Spring 应用程序启动时抛出,当 Spring 在加载应用程序上下文时,检测到有多个相同名称的 Bean 定义被加载,并…...
配置Prettier+Vscode setting提高前端开发效率
前言 大家好,上一篇一文读懂 系列的文章中我们介绍了前端的代码格式化校验工具ESLient。代码格式是进行自动校验了,但你还要一个个的微调,很麻烦不是吗? 本文介绍和ESLient配合使用的Prettier实现编译器自动将代码格式化。 同时也…...
系统架构师计算题(1)——计算机系统基础知识(上)
持续刷题,持续总结,持续更新! 目录 1. 文件系统 题型1:多级索引 2. 存储管理 题型1:页式存储 题型2:段式存储 题型3:段页式存储 3. 磁盘读取 题型1:访问耗时 4. RAID 题型1:计算容量 1. 文件系统 文件在系统中的存储结构有如下几种: (1) 连续结构。 连续结构…...
2024/8/18周报
文章目录 摘要Abstract蚁群算法背景基本步骤应用TSP问题蚁群算法具体实现 遗传算法基本原理主要步骤遗传算法的主要组件遗传算法的应用遗传算法的优点遗传算法的局限性示例代码 多目标优化算法多目标优化的基本概念多目标优化算法的分类NSGA-II 算法示例 总结 摘要 本周对项目…...
端点安全新纪元:EDR与XDR技术的融合应用
在数字时代,随着网络威胁的日益复杂化和多样化,端点安全成为了企业组织不可或缺的重要防线。传统的防病毒软件和防火墙等安全解决方案已难以满足当前的安全需求,而EDR(端点检测与响应)和XDR(扩展检测与响应…...
机器学习:多元线性回归模型
目录 前言 一、讲在前面 1.多元_血压.csv: 2.完整代码: 3.运行结果: 二、实现步骤 1.导入库 2.导入数据 3.绘制散点图(这步可以省略) 编辑 4.求特征和标签的相关系数 5.建立并训练线性回归模型 6.检验模…...
树莓派5环境配置笔记 新建虚拟python环境—安装第三方库—配置Thonny解释器
树莓派5虚拟环境配及第三方库的安装🚀 在完成了树莓派的系统下载和各项基础配置之后进入到了,传感器开发部分,在测试传感器开发之前我打算先安装一下自己需要的库,但是在我直接在系统的根目录下运行pip命令的时候总会报环境错误&a…...
浅谈Winform
一、Winform简介说明 C# 是一种面向对象的编程语言,由微软开发并作为.NET框架的主要编程语言。C# 设计时考虑了易用性,并且具有丰富的特性,如垃圾回收、异常处理、泛型、LINQ(Language Integrated Query)、异步编程等。…...
MySQL(二)——CRUD
文章目录 CRUD新增全列插入指定列插入插入查询结果 查询全列查询指定列查询查询字段为表达式表达式不包含字段表达式包含一个字段表达式包含多个字段 补充:别名去重查询排序条件查询 补充:运算符区间查询模糊查询NULL的查询 分页查询聚合查询聚合函数 分…...
presto高级用法(grouping、grouping sets)
目录 准备工作: 在hive中建表 在presto中计算 分解式 按照城市分组 统计人数 按照性别分组 统计人数 编辑 按照爱好分组 统计人数 编辑 按照城市和性别分组 统计人数 按照城市和爱好分组 统计人数 按照性别和爱好分组 统计人数 按照城市和性别还有…...
二十五年后,Microsoft终于移除了FAT32的32GB分区限制——一个从草稿到现实的故事
二十五年后,Microsoft终于移除了FAT32的32GB分区限制——一个从草稿到现实的故事 你可能不知道,FAT32文件系统的32GB分区限制是怎么来的。这个限制其实是1994年Windows前开发者Dave Plummer无心插柳的结果,也是"草台班子"式开发的…...
Java二十三种设计模式-命令模式(18/23)
命令模式:将请求封装为对象的策略 概要 本文全面探讨了命令模式,从基础概念到实现细节,再到使用场景、优缺点分析,以及与其他设计模式的比较,并提供了最佳实践和替代方案,旨在帮助读者深入理解命令模式并…...
Kafka系列之:Dead Letter Queue死信队列DLQ
Kafka系列之:Dead Letter Queue死信队列DLQ 一、死信队列二、参数errors.tolerance三、创建死信队列主题四、在启用安全性的情况下使用死信队列更多内容请阅读博主这篇博客: Kafka系列之:Kafka Connect深入探讨 - 错误处理和死信队列一、死信队列 死信队列(DLQ)仅适用于接…...
Fragment学习笔记
静态加载 <fragment android:name"com.example.serviceapplication.fragment.TestFragment"android:layout_width"match_parent"android:layout_height"wrap_content"app:layout_constraintStart_toStartOf"parent"app:layout_cons…...
NGINX 基础参数与功能
章节 1 NGINX 的源码安装 2 NGINX 核心配置详解 3 NGINX 之 location 匹配优先级 4 NGINX 基础参数与功能 目录 1 实现 Nginx 账户认证功能 1.1 创建htpasswd 认证文件 1.2 创建数据目录 1.3 指定认证文件路径 1.4 测试效果 2 定义重定向错误日志 2.1 指定错误日志访问路…...
css设置元素居中显示
CSS中实现居中显示可以通过不同的属性来实现,取决于你是要水平居中还是垂直居中,或者两者都要。以下是一些常用的居中方法: 1.水平居中 - 行内元素或文本 .center-text {text-align: center; } 2.水平居中 - 块级元素 .center-block {mar…...
js判断一个任意值为空包括数组和对象
在JavaScript中,判断一个变量是否为空可以考虑以下几种情况: 如果变量可能是null或undefined,可以直接判断。 对于数组,如果想要判断数组为空(长度为0),可以检查其length属性。 对于对象&…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
