# MySheet **Repository Path**: carbon-studio/mysheet ## Basic Information - **Project Name**: MySheet - **Description**: 一种针对于多数据维度、复杂样式布局和频繁需求变更而设计的电子表格导入导出中间件。主要应用在MES、ERP、OA等系统的数据文件导出上。该库使用分治设计,并且通过精简接口,链式编程以及策略模式等简化电子表格的数据录入,映射规则,样式处理以及合并操作。为复杂型电子表格操作提供了一种解决方案。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 1 - **Created**: 2025-08-23 - **Last Updated**: 2026-04-23 ## Categories & Tags **Categories**: excel-utils **Tags**: POI, Excel, SpringBoot ## README

MySheet-面向可复用模块的表格设计

Static Badge Static Badge Static Badge
#### 介绍 一种针对于多数据维度、复杂样式布局和频繁需求变更而设计的电子表格导入导出中间件。主要应用在MES、ERP、OA等系统的数据文件导出上。该库使用可嵌套Sheet,利用分治设计表格。并且通过精简接口,链式编程以及策略模式等简化电子表格的数据录入,映射规则,样式处理以及合并操作。为复杂型电子表格操作提供了一种解决方案,旨在帮助开发人员注重业务而非在调整样式和格式上花费大量精力。详细文档教程参考:[📖 Exporter参考文档](./参考文档.md) MySheet v2.0及以上版本重新设计了架构,成为可完全适配于多种Excel操作库的中间件,构造器层以下可通过专用引擎类操作不同的Excel库(如POI,EasyExcel),而构造器以上在以后任意版本中保持使用语法不变,由MySheet构造器引擎映射到适配各个的底层操作库的动作。 #### 📣版本更新(v3) - 重构了类结构,移除了一些类方法和成员变量,添加了多个接口适配流式输出。 - 增强了链式编程和批处理,重构类结构使得生命周期变化,纯增量设置样式,无需调用apply()方法。 - 完善了插入移动时,合并区域也移动。 - 修复了XCells批量设置不生效的问题。 - 新增设置单元格内容下划线样式。 #### 项目结构 - **mysheet包**:核心类库,Exporter的源码在此包下。 - **mysheet-test包**:为测试Exporter工具类的使用而简单搭建的Spring boot项目环境。 #### 简单介绍 中间构造器是MySheet实现可复用模块设计的核心层。最初Exporter工具类(MySheet雏形)设计为底层API-面向用户端封装库的两层系统架构,虽然初版设计采用了策略模式和链式编程等方法优化了用户端的编程便利,但本质上还是一种硬编码,无法摆脱频繁变更需求的场景下爆改代码的状况。因此需要一个中间构造器来解决这一窘境。 #### UML类图基本架构 ![输入图片说明](resources/MySheet.png) #### N叉树分治及盒模型 N叉树中每一个节点都是一个盒子,一个盒子代表一个矩形表格结构。而一个矩形表格,最基本的构成要素就是数据和样式布局。在MySheet中一个盒子被称为DIV(div),CSS全称Cell Style Sheet [单元格样式表(哈哈不是前端的CSS)],是构造器模型中用于存储样式标记的表类,它不存储实际样式对象,而是存储标记,通过set方法接收单元格并按照样式标记值进行内部处理。这样设计除了解耦、最重要的还是减少样式对象的开销。不能让一个单元格配一个样式对象,而是让一个虚拟的样式标记表来处理众多单元格。 输入图片说明 现在每个DIV都有能力构建自己的表,那么接下来开始设计它们之间的关系,作为一个树形数据结构,从父DIV创建子DIV是必要的,MySheet规范需要设计create方法,该方法自动将创建好的子DIV挂载到自己的子DIV列表中,并返回这个对象的引用供外部使用。 树可以递归遍历每一个节点直至找到对应名称的DIV,调用它的create方法,这就是找到指定名称的DIV并从其下创建子DIV块。 这么做还有另外一个最重要的因素,就是可复用的特点;即使在复杂的表,有很多可复用的子结构,以下面几个复杂表示例: ![输入图片说明](resources/示例.png) 它们都有很多重复相似的子结构,和排列方式,因此将他们抽象出来很有必要。 DIV的父子关系可以概括为父表与子表,它们有一个特征:**当父表移动N个单位时,子表及其下所有子表也移动N个单位**。MySheet使用偏移量来记录块与块之间平移的记录,并在块生成的时候使用这个偏移量来偏移。 ![输入图片说明](resources/偏移演示.png) 偏移量可以在用户操作偏移时累加,无需每次偏移都全部作用到每个数据和样式上。此外还需要注意,**当选中一个DIV偏移时,仅有它及其下的所有子DIV偏移,而非包含父节点偏移。**只有这样才能保证N叉树设计布局合理,下方示图以红色表示选中偏移的节点,橙色表示全部需要更新偏移的节点来理解这一点。 ![输入图片说明](resources/偏移更新示意图.png) 教程参考:[📖 Exporter参考文档](./参考文档.md) #### 如何部署到本地? 可从Intellij IDEA中创建项目,选择Project form Version Control,填写Git仓库地址: https://gitee.com/carbon-studio/apache-poi-export