Giter Club home page Giter Club logo

autopoi's Introduction

JeecgBoot 低代码开发平台

当前最新版本: 3.7.0_all(发布日期:2024-06-23)

AUR GitHub stars GitHub forks

项目介绍

Java Low Code Platform for Enterprise web applications

JeecgBoot 是一款基于代码生成器的低代码开发平台!前后端分离架构 SpringBoot2.x和3.x,SpringCloud,Ant Design Vue3,Mybatis-plus,Shiro,JWT,支持微服务。强大的代码生成器让前后端代码一键生成,实现低代码开发! JeecgBoot 引领新的低代码开发模式(OnlineCoding-> 代码生成器-> 手工MERGE), 帮助解决Java项目70%的重复工作,让开发更多关注业务。既能快速提高效率,节省研发成本,同时又不失灵活性!

JeecgBoot 提供了一系列低代码模块,实现在线开发真正的零代码:Online表单开发、Online报表、报表配置能力、在线图表设计、仪表盘设计、大屏设计、移动配置能力、表单设计器、在线设计流程、流程自动化配置、插件能力(可插拔)等等!

JEECG宗旨是: 简单功能由OnlineCoding配置实现,做到零代码开发;复杂功能由代码生成器生成进行手工Merge 实现低代码开发,既保证了智能又兼顾灵活;实现了低代码开发的同时又支持灵活编码,解决了当前低代码产品普遍不灵活的弊端!

JEECG业务流程: 采用工作流来实现、扩展出任务接口,供开发编写业务逻辑,表单提供多种解决方案: 表单设计器、online配置表单、编码表单。同时实现了流程与表单的分离设计(松耦合)、并支持任务节点灵活配置,既保证了公司流程的保密性,又减少了开发人员的工作量。

适用项目

Jeecg-Boot低代码开发平台,可以应用在任何J2EE项目的开发中,支持信创国产化(默认适配达梦和人大金仓)。尤其适合SAAS项目、企业信息管理系统(MIS)、内部办公系统(OA)、企业资源计划系统(ERP)、客户关系管理系统(CRM)等,其半智能手工Merge的开发方式,可以显著提高开发效率70%以上,极大降低开发成本。

项目说明

项目名 说明
jeecg-boot 后端源码JAVA(SpringBoot微服务架构)
jeecgboot-vue3 前端源码VUE3(vue3+vite5+ts最新技术栈)
jeecg-uniapp 配套APP框架 适配多个终端,支持APP、小程序、H5

技术文档

启动项目

技术架构:

后端

  • IDE建议: IDEA (必须安装lombok插件 )
  • 语言:Java 8+ (支持17)
  • 依赖管理:Maven
  • 基础框架:Spring Boot 2.7.18
  • 微服务框架: Spring Cloud Alibaba 2021.0.1.0
  • 持久层框架:MybatisPlus 3.5.3.2
  • 报表工具: JimuReport 1.7.6
  • 安全框架:Apache Shiro 1.12.0,Jwt 3.11.0
  • 微服务技术栈:Spring Cloud Alibaba、Nacos、Gateway、Sentinel、Skywalking
  • 数据库连接池:阿里巴巴Druid 1.1.22
  • 日志打印:logback
  • 缓存:Redis
  • 其他:autopoi, fastjson,poi,Swagger-ui,quartz, lombok(简化代码)等。
  • 默认数据库脚本:MySQL5.7+
  • 其他数据库,需要自己转

前端

  • 前端IDE建议:WebStorm、Vscode
  • 采用 Vue3.0+TypeScript+Vite+Ant-Design-Vue等新技术方案,包括二次封装组件、utils、hooks、动态菜单、权限校验、按钮级别权限控制等功能
  • 最新技术栈:Vue3.0 + TypeScript + Vite5 + ant-design-vue4 + pinia + echarts + unocss + vxe-table + qiankun + es6
  • 依赖管理:node、npm、pnpm

支持库

数据库 支持
MySQL
Oracle11g
Sqlserver2017
PostgreSQL
MariaDB
达梦
人大金仓

微服务解决方案

  • 1、服务注册和发现 Nacos √
  • 2、统一配置中心 Nacos √
  • 3、路由网关 gateway(三种加载方式) √
  • 4、分布式 http feign √
  • 5、熔断降级限流 Sentinel √
  • 6、分布式文件 Minio、阿里OSS √
  • 7、统一权限控制 JWT + Shiro √
  • 8、服务监控 SpringBootAdmin√
  • 9、链路跟踪 Skywalking 参考文档
  • 10、消息中间件 RabbitMQ √
  • 11、分布式任务 xxl-job √
  • 12、分布式事务 Seata
  • 13、轻量分布式日志 Loki+grafana套件
  • 14、支持 docker-compose、k8s、jenkins
  • 15、CAS 单点登录 √
  • 16、路由限流 √

微服务方式启动

微服务架构图

微服务架构图

为什么选择JeecgBoot?

  • 1.采用最新主流前后分离框架(Springboot+Mybatis+antd+vue3),容易上手; 代码生成器依赖性低,灵活的扩展能力,可快速实现二次开发;
  • 2.支持微服务SpringCloud Alibaba(Nacos、Gateway、Sentinel、Skywalking),提供切换机制支持单体和微服务自由切换
  • 3.开发效率高,采用代码生成器,单表、树列表、一对多、一对一等数据模型,增删改查功能一键生成,菜单配置直接使用;
  • 4.代码生成器提供强大模板机制,支持自定义模板,目前提供四套风格模板(单表两套、树模型一套、一对多三套)
  • 5.代码生成器非常智能,在线业务建模、在线配置、所见即所得支持23种类控件,一键生成前后端代码,大幅度提升开发效率,不再为重复工作发愁。
  • 6.低代码能力:Online在线表单(无需编码,通过在线配置表单,实现表单的增删改查,支持单表、树、一对多、一对一等模型,实现人人皆可编码)
  • 7.低代码能力:Online在线报表(无需编码,通过在线配置方式,实现数据报表,可以快速抽取数据,减轻开发压力,实现人人皆可编码)
  • 8.低代码能力:Online在线图表(无需编码,通过在线配置方式,实现曲线图,柱状图,数据报表等,支持自定义排版布局,实现人人皆可编码)
  • 9.封装完善的用户、角色、菜单、组织机构、数据字典、在线定时任务等基础功能,支持访问授权、按钮权限、数据权限等功能
  • 10.常用共通封装,各种工具类(定时任务,短信接口,邮件发送,Excel导入导出等),基本满足80%项目需求
  • 11.简易Excel导入导出,支持单表导出和一对多表模式导出,生成的代码自带导入导出功能
  • 12.集成简易报表工具,图像报表和数据导出非常方便,可极其方便的生成图形报表、pdf、excel、word等报表;
  • 13.采用前后分离技术,页面UI风格精美,针对常用组件做了封装:时间、行表格控件、截取显示控件、报表组件,编辑器等等
  • 14.查询过滤器:查询功能自动生成,后台动态拼SQL追加查询条件;支持多种匹配方式(全匹配/模糊查询/包含查询/不匹配查询);
  • 15.数据权限(精细化数据权限控制,控制到行级,列表级,表单字段级,实现不同人看不同数据,不同人对同一个页面操作不同字段
  • 16.页面校验自动生成(必须输入、数字校验、金额校验、时间空间等);
  • 17.支持SAAS服务模式,提供SaaS多租户架构方案。
  • 18.分布式文件服务,集成minio、阿里OSS等优秀的第三方,提供便捷的文件上传与管理,同时也支持本地存储。
  • 19.主流数据库兼容,一套代码完全兼容Mysql、Postgresql、Oracle、Sqlserver、MariaDB、达梦、人大金仓等主流数据库。
  • 20.集成工作流flowable,并实现了只需在页面配置流程转向,可极大的简化bpm工作流的开发;用bpm的流程设计器画出了流程走向,一个工作流基本就完成了,只需写很少量的java代码;
  • 21.低代码能力:在线流程设计,采用开源flowable流程引擎,实现在线画流程,自定义表单,表单挂靠,业务流转
  • 22.多数据源:及其简易的使用方式,在线配置数据源配置,便捷的从其他数据抓取数据;
  • 23.提供单点登录CAS集成方案,项目中已经提供完善的对接代码
  • 24.低代码能力:表单设计器,支持用户自定义表单布局,支持单表,一对多表单、支持select、radio、checkbox、textarea、date、popup、列表、宏等控件
  • 25.专业接口对接机制,统一采用restful接口方式,集成swagger-ui在线接口文档,Jwt token安全验证,方便客户端对接
  • 26.接口安全机制,可细化控制接口授权,非常简便实现不同客户端只看自己数据等控制
  • 27.高级组合查询功能,在线配置支持主子表关联查询,可保存查询历史
  • 28.提供各种系统监控,实时跟踪系统运行情况(监控 Redis、Tomcat、jvm、服务器信息、请求追踪、SQL监控)
  • 29.消息中心(支持短信、邮件、微信推送等等)
  • 30.集成Websocket消息通知机制
  • 31.移动自适应效果优秀,提供APP发布方案:
  • 32.支持多语言,提供国际化方案;
  • 33.数据变更记录日志,可记录数据每次变更内容,通过版本对比功能查看历史变化
  • 34.平台UI强大,实现了移动自适应
  • 35.平台首页风格,提供多种组合模式,支持自定义风格
  • 36.提供简单易用的打印插件,支持谷歌、火狐、IE11+ 等各种浏览器
  • 37.示例代码丰富,提供很多学习案例参考
  • 38.采用maven分模块开发方式
  • 39.支持菜单动态路由
  • 40.权限控制采用 RBAC(Role-Based Access Control,基于角色的访问控制)
  • 41.提供新行编辑表格JVXETable,轻松满足各种复杂ERP布局,拥有更高的性能、更灵活的扩展、更强大的功能

Jeecg Boot 产品功能蓝图

功能蓝图

分支说明

主干master更稳定,如果你对最新技术栈无要求,建议采用主干

springboot3分支

springboot3_sas分支

功能模块

├─Online在线开发(低代码)
│  ├─Online在线表单
│  ├─Online代码生成器
│  ├─Online在线报表
│  ├─仪表盘设计器
│  ├─AI助手
│  ├─系统编码规则
│  ├─系统校验规则
├─积木报表设计器
│  ├─打印设计器
│  ├─数据报表设计
│  ├─图形报表设计(支持echart)
├─系统管理
│  ├─用户管理
│  ├─角色管理
│  ├─菜单管理
│  ├─权限设置(支持按钮权限、数据权限)
│  ├─表单权限(控制字段禁用、隐藏)
│  ├─部门管理
│  ├─我的部门(二级管理员)
│  └─字典管理
│  └─分类字典
│  └─系统公告
│  └─职务管理
│  └─通讯录
│  ├─多数据源管理
│  └─多租户管理(租户管理、租户角色、我的租户)
├─消息中心
│  ├─消息管理
│  ├─模板管理
├─代码生成器(低代码)
│  ├─代码生成器功能(一键生成前后端代码,生成后无需修改直接用,绝对是后端开发福音)
│  ├─代码生成器模板(提供4套模板,分别支持单表和一对多模型,不同风格选择)
│  ├─代码生成器模板(生成代码,自带excel导入导出)
│  ├─查询过滤器(查询逻辑无需编码,系统根据页面配置自动生成)
│  ├─高级查询器(弹窗自动组合查询条件)
│  ├─Excel导入导出工具集成(支持单表,一对多 导入导出)
│  ├─平台移动自适应支持
├─系统监控
│  ├─Gateway路由网关
│  ├─性能扫描监控
│  │  ├─监控 Redis
│  │  ├─Tomcat
│  │  ├─jvm
│  │  ├─服务器信息
│  │  ├─请求追踪
│  │  ├─磁盘监控
│  ├─定时任务
│  ├─系统日志
│  ├─消息中心(支持短信、邮件、微信推送等等)
│  ├─数据日志(记录数据快照,可对比快照,查看数据变更情况)
│  ├─系统通知
│  ├─SQL监控
│  ├─swagger-ui(在线接口文档)
│─报表示例
│  ├─曲线图
│  └─饼状图
│  └─柱状图
│  └─折线图
│  └─面积图
│  └─雷达图
│  └─仪表图
│  └─进度条
│  └─排名列表
│  └─等等
│─大屏模板
│  ├─作战指挥中心大屏
│  └─物流服务中心大屏
│─常用示例
│  ├─自定义组件
│  ├─对象存储(对接阿里云)
│  ├─JVXETable示例(各种复杂ERP布局示例)
│  ├─单表模型例子
│  └─一对多模型例子
│  └─打印例子
│  └─一对多TAB例子
│  └─内嵌table例子
│  └─常用选择组件
│  └─异步树table
│  └─接口模拟测试
│  └─表格合计示例
│  └─异步树列表示例
│  └─一对多JEditable
│  └─JEditable组件示例
│  └─图片拖拽排序
│  └─图片翻页
│  └─图片预览
│  └─PDF预览
│  └─分屏功能
│─封装通用组件	
│  ├─行编辑表格JEditableTable
│  └─省略显示组件
│  └─时间控件
│  └─高级查询
│  └─用户选择组件
│  └─报表组件封装
│  └─字典组件
│  └─下拉多选组件
│  └─选人组件
│  └─选部门组件
│  └─通过部门选人组件
│  └─封装曲线、柱状图、饼状图、折线图等等报表的组件(经过封装,使用简单)
│  └─在线code编辑器
│  └─上传文件组件
│  └─验证码组件
│  └─树列表组件
│  └─表单禁用组件
│  └─等等
│─更多页面模板
│  ├─各种高级表单
│  ├─各种列表效果
│  └─结果页面
│  └─异常页面
│  └─个人页面
├─高级功能
│  ├─提供单点登录CAS集成方案
│  ├─提供APP发布方案
│  ├─集成Websocket消息通知机制
│─更多商业功能
│  ├─流程设计器
│  ├─表单设计器
│  ├─大屏设计器
│  └─我的任务
│  └─历史流程
│  └─历史流程
│  └─流程实例管理
│  └─流程监听管理
│  └─流程表达式
│  └─我发起的流程
│  └─我的抄送
│  └─流程委派、抄送、跳转
│  └─OA办公组件
│  └─。。。
   

系统效果

PC端

输入图片说明

输入图片说明

输入图片说明

输入图片说明

系统交互

AI助手

仪表盘设计器

报表设计器

手机端

PAD端

图表示例

输入图片说明 输入图片说明 输入图片说明 输入图片说明

在线接口文档

输入图片说明 输入图片说明

UNIAPP效果

大屏设计器

流程设计

输入图片说明

输入图片说明

输入图片说明

表单设计器

捐赠

如果觉得还不错,请作者喝杯咖啡吧 ☺

autopoi's People

Contributors

dependabot[bot] avatar lly-ke avatar zhangdaiscott avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

autopoi's Issues

样式错误

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Cell.getCellTypeEnum()Lorg/apache/poi/ss/usermodel/CellType;] with root cause

java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Cell.getCellTypeEnum()Lorg/apache/poi/ss/usermodel/CellType;

一对多导入时,使用wps软件编辑的excel文件,导入失败

问题:导出一对多excel文件,使用wps软件编辑文件内容,再重新导入,使用ExcelImportUtil.importExcel获取list数据,list子表数据获取为空
原因分析:通过断点调试,发现是因为获取下表头标题时,会判断上一行单元格是否是合并单元格,否的话会把标题替换为下表头标题。通过wps软件编辑的文件,如果单个单元格的属性是合并单元格会自动取消合并属性,造成上述问题的出现。
注:使用office软件编辑导入正常

导入excel要读取的sheet数量错误

问题

导入excel要读取的sheet数量应该由ImportParams的sheetNum决定,而不应该直接读取excel文件sheet数量,导入的excel有多个sheet可能是附录之类的无需读取的文件,使用excel文件的sheet数量读取会导致读入大量空行,如果sheet中只有图片还会报不识别该文件。

依赖

org.jeecgframework autopoi-web 1.3.4

文件位置

org\jeecgframework\poi\excel\imports\ExcelImportServer.java:428

代码

//begin-------author:liusq------date:20210313-----for:-------多sheet导入改造点--------
//获取导入文本的sheet数
int sheetNum = book.getNumberOfSheets();
if(sheetNum>1){
params.setSheetNum(sheetNum);
}
//end-------author:liusq------date:20210313-----for:-------多sheet导入改造点--------

ImportParams 类的 keyindex属性 不起作用

经过测试,发现excel文件中可能有很多空行的情况。然后看了下说明是 keyindex 列如果为空,那这一行即为无效数据,不会加到list中去。但是现在的代码中默认值为0,实测不起作用。换用 easypoi 是可以的,考虑到autopoi 和 jeecg 集成,希望能测试修复一下,谢谢。

导入String类型去掉后缀.0是为啥?

CellValueServer.getValueByType(String xclass, Object result, ExcelImportEntity entity)判断为String类型,为什么要去掉后缀.0?实际导入会存在名称为xxx2.0,xxx3.0的数据

autopoi 导出excel,支持动态列吗?

以前用easypoi 的时候,自己有手动改造支持动态列, 现在新版的autpoi 有没有实现这个功能,如果有怎么使用,如果没有预计什么时候会有?
比如这样的动态excel
a.
列1 (固定) | 列2(固定) 列3 (固定)| 列4(动态) | 列5(动态)....
b.
列1 (固定) | 列2(固定) 列3 (固定)| 列4(动态) | 列5(动态)| 列6(固定)

Bug Found: org.jeecgframework.poi.util.PoiElUtil.isTrue:

/**
* 是不是真
*
* @param keys
* @param map
* @return
* @throws Exception
*/
private static Boolean isTrue(String[] keys, Map<String, Object> map) throws Exception {
if (keys.length == 0) {
String constant = null;
if ((constant = isConstant(keys[0])) != null) {
return Boolean.valueOf(constant);
}
return Boolean.valueOf(PoiPublicUtil.getParamsValue(keys[0], map).toString());
}
if (keys.length == 3) {
Object first = eval(keys[0], map);
Object second = eval(keys[2], map);
return PoiFunctionUtil.isTrue(first, keys[1], second);
}
throw new ExcelExportException("判断参数不对");
}

EXCEL根据模板导出 报错

导出模板
image

如果导出参数map中没有设置导出模板中的属性值
调用ExcelExportUtil.exportExcel(params, map)会报错

报错的代码代码如下

image

PoiPublicUtil中的442行
应改成return ((Map) object).getOrDefault(params, "");

给模板中的属性值设置一个默认值

导出字段类型 文档里10 是数字型,代码里是4

https://github.com/zhangdaiscott/autopoi/blob/master/autopoi/src/main/java/org/jeecgframework/poi/excel/export/base/ExcelExportBase.java

Object value = getCellValue(entity, obj);
//update-begin--Author:xuelin Date:20171018 for:TASK #2372 【excel】easypoi 导出类型,type增加数字类型--------------------
if (entity.getType() == 1) {
createStringCell(row, cellNum++, value == null ? "" : value.toString(), row.getRowNum() % 2 == 0 ? getStyles(false, entity) : getStyles(true, entity), entity);
} else if (entity.getType() == 4){
createNumericCell(row, cellNum++, value == null ? "" : value.toString(), index % 2 == 0 ? getStyles(false, entity) : getStyles(true, entity), entity);
} else{
createImageCell(patriarch, entity, row, cellNum++, value == null ? "" : value.toString(), obj);
}
//update-end--Author:xuelin Date:20171018 for:TASK #2372 【excel】easypoi 导出类型,type增加数字类型----------------

外面所有的文档都不是这样的定义。。。。。

AutoPoi ExcelExportUtil参数填写问题?

Jar包中
/**
* 一个excel 创建多个sheet
*
* @param list
* 多个Map key title 对应表格Title key entity 对应表格对应实体 key data
* Collection 数据
* @return
*/
public static Workbook exportExcel(List<Map<String, Object>> list, String type) {
Workbook workbook;
if (ExcelType.HSSF.equals(type)) {
workbook = new HSSFWorkbook();
} else {
workbook = new XSSFWorkbook();
}
for (Map<String, Object> map : list) {
ExcelExportServer server = new ExcelExportServer();
server.createSheet(workbook, (ExportParams) map.get("title"), (Class) map.get("entity"), (Collection) map.get("data"));
}
return workbook;
}

我引用 return ExcelExportUtil.exportExcel(sheetsList, "HSSF");
程序执行总是报错,后来发现,第二个参数 String type的值 虽然写着“HSSF”,但是

执行 ExcelType.HSSF.equals(type)的结果却是 false;
请帮忙看下,type 的值该如何些,我需要函数体内 执行的是

workbook = new HSSFWorkbook();


附:

在easypoi中,exportExcel是这样定义的

/**
* 一个excel 创建多个sheet
*
* @param list
* 多个Map key title 对应表格Title key entity 对应表格对应实体 key data
* Collection 数据
* @return
*/
public static Workbook exportExcel(List<Map<String, Object>> list, ExcelType type) {
Workbook workbook = getWorkbook(type,0);
for (Map<String, Object> map : list) {
ExcelExportService service = new ExcelExportService();
service.createSheet(workbook, (ExportParams) map.get("title"),
(Class) map.get("entity"), (Collection) map.get("data"));
}
return workbook;
}

easypoi中第二个参数是ExcelType type,不是String格式的,

不支持多sheet导入

我试了一下多sheet导出是可以的,多少缺少多shett导入,这样要做多sheet导入导出功能就不完善了

能否导入指定sheet页的数据

我尝试用:
ImportParams params = new ImportParams();
params.setSheetNum(6);
结果前面的sheet也会导入,请问有没有方法导入指定sheet页的数据?

导入行号

如何在导入时,能拿到某条数据所在excel对应的行号呢

项目通过jar 包方式上传到服务器后 ,autopoi 读取不到jar包里的excel模版文件 (导出功能)

通过jar 包方式上传到服务器后 autopoi 读取不到jar包里的excel模版文件
TemplateExportParams params = new TemplateExportParams();
params.setTemplateUrl(relativePath);
params.setScanAllsheet(true);
ModelAndView mv = new ModelAndView(new JeecgTemplateExcelView());
mv.addObject(TemplateExcelConstants.MAP_DATA, productMap);
mv.addObject(TemplateExcelConstants.FILE_NAME, templateName);
mv.addObject(TemplateExcelConstants.PARAMS, params);
mv.addObject(TemplateExcelConstants.CLASS, TBaseProductEntity.class);

2020-07-24 15:34:59.452 [http-nio-6080-exec-9] ERROR org.jeecgframework.poi.cache.manager.FileLoade:58 - home/eps/jeecg-boot/tts-module-system-2.2.0.jar!/BOOT-INF/classes!/import/订单导入/FBA订单模板.xlsx (没有那个文件或目录)
java.io.FileNotFoundException: home/eps/jeecg-boot/tts-module-system-2.2.0.jar!/BOOT-INF/classes!/import/订单导入/FBA订单模板.xlsx (没有那个文件或目录)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.(FileInputStream.java:138)
at java.io.FileInputStream.(FileInputStream.java:93)
at org.jeecgframework.poi.cache.manager.FileLoade.getFile(FileLoade.java:47)
at org.jeecgframework.poi.cache.manager.POICacheManager$1.load(POICacheManager.java:48)
at org.jeecgframework.poi.cache.manager.POICacheManager$1.load(POICacheManager.java:45)
at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3528)
at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2277)
at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2154)
at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2044)
at com.google.common.cache.LocalCache.get(LocalCache.java:3952)
at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3974)
at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4958)
at org.jeecgframework.poi.cache.manager.POICacheManager.getFile(POICacheManager.java:56)

放置了excel模版在resources 中, IDEA 中运行是可以成功下载excel 模版文件的, 但是打包jar 放到服务器后就不行

模版导出问题

模版导出,有excelcollection,无法导出。即使指定了type,也失败。

prontFonts方法里数组越界

https://github.com/zhangdaiscott/autopoi/blob/5feedad660516a08193f4c7845e8970d50a1a03c/autopoi/src/main/java/org/jeecgframework/poi/excel/html/helper/StylerHelper.java#L86

//Line 86
for (short i = 0, le = wb.getNumberOfFonts(); i <= le; i++) {
	Font font = wb.getFontAt(i);
	out.format(".%s .%s {%n", DEFAULTS_CLASS, "font_" + i + "_" + cssRandom);
	fontStyle(font);
	out.format("}%n");
}

版本:1.3

java.lang.IndexOutOfBoundsException: Index: 4, Size: 4
	at java.util.ArrayList.rangeCheck(ArrayList.java:657)
	at java.util.ArrayList.get(ArrayList.java:433)
	at org.apache.poi.xssf.model.StylesTable.getFontAt(StylesTable.java:382)
	at org.apache.poi.xssf.usermodel.XSSFWorkbook.getFontAt(XSSFWorkbook.java:982)
	at org.apache.poi.xssf.usermodel.XSSFWorkbook.getFontAt(XSSFWorkbook.java:123)
	at org.jeecgframework.poi.excel.html.helper.StylerHelper.prontFonts(StylerHelper.java:72)
	at org.jeecgframework.poi.excel.html.helper.StylerHelper.printInlineStyle(StylerHelper.java:66)
	at org.jeecgframework.poi.excel.html.helper.StylerHelper.<init>(StylerHelper.java:60)
	at org.jeecgframework.poi.excel.html.ExcelToHtmlServer.printPage(ExcelToHtmlServer.java:55)
	at org.jeecgframework.poi.excel.ExcelToHtmlUtil.toTableHtml(ExcelToHtmlUtil.java:25)

关于锁定单元格样式的设置

看了代码之后,发现扩展单元格锁定的样式很难。原因ExportParams这个类的样式使用是基于反射不易于传递参数。请问有办法解决或是后续有开发计划吗

AutoPoi Excel工具类1.0.3,@Excel注解中没有isColumnHidden

/**

  • Copyright 2013-2015 JEECG ([email protected])
  • Licensed under the Apache License, Version 2.0 (the "License");
  • you may not use this file except in compliance with the License.
  • You may obtain a copy of the License at
  • http://www.apache.org/licenses/LICENSE-2.0
    
  • Unless required by applicable law or agreed to in writing, software
  • distributed under the License is distributed on an "AS IS" BASIS,
  • WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  • See the License for the specific language governing permissions and
  • limitations under the License.
    */
    package org.jeecgframework.poi.excel.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**

  • Excel 导出基本注释

  • @author JEECG

  • @Date 2014年6月20日 下午10:25:12
    */
    @retention(RetentionPolicy.RUNTIME)
    @target(ElementType.FIELD)
    public @interface Excel {

    /**

    • 导出时间设置,如果字段是Date类型则不需要设置 数据库如果是string 类型,这个需要设置这个数据库格式
      */
      public String databaseFormat() default "yyyyMMddHHmmss";

    /**

    • 导出的时间格式,以这个是否为空来判断是否需要格式化日期
      */
      public String exportFormat() default "";

    /**

    • 时间格式,相当于同时设置了exportFormat 和 importFormat
      */
      public String format() default "";

    /**

    • 导出时在excel中每个列的高度 单位为字符,一个汉字=2个字符
      */
      public double height() default 10;

    /**

    • 导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的
      */
      public int imageType() default 1;

    /**

    • 导入的时间格式,以这个是否为空来判断是否需要格式化日期
      */
      public String importFormat() default "";

    /**

    • 文字后缀,如% 90 变成90%
      */
      public String suffix() default "";

    /**

    • 是否换行 即支持\n
      */
      public boolean isWrap() default true;

    /**

    • 合并单元格依赖关系,比如第二列合并是基于第一列 则{1}就可以了
      */
      public int[] mergeRely() default {};

    /**

    • 纵向合并内容相同的单元格
      */
      public boolean mergeVertical() default false;

    /**

    • 导出时,对应数据库的字段 主要是用户区分每个字段, 不能有annocation重名的 导出时的列名
    • 导出排序跟定义了annotation的字段的顺序有关 可以使用a_id,b_id来确实是否使用
      */
      public String name();

    /**

    • 是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row)
      */
      public boolean needMerge() default false;

    /**

    • 展示到第几个可以使用a_id,b_id来确定不同排序
      */
      public String orderNum() default "0";

    /**

    • 值得替换 导出是{"男_1","女_0"} 导入反过来,所以只用写一个
      */
      public String[] replace() default {};

    /**

    • 导入路径,如果是图片可以填写,默认是upload/className/ IconEntity这个类对应的就是upload/Icon/

    */
    public String savePath() default "upload";

    /**

    • 导出类型 1 是文本 2 是图片,3是函数,4是数字 默认是文本
      */
      public int type() default 1;

    /**

    • 导出时在excel中每个列的宽 单位为字符,一个汉字=2个字符 如 以列名列内容中较合适的长度 例如姓名列6 【姓名一般三个字】
    • 性别列4【男女占1,但是列标题两个汉字】 限制1-255
      */
      public double width() default 10;

    /**

    • 是否自动统计数据,如果是统计,true的话在最后追加一行统计,把所有数据都和 这个处理会吞没异常,请注意这一点
    • @return
      */
      public boolean isStatistics() default false;

    /**

    • 方法描述: 数据字典表
    • 作 者: yiming.zhang
    • 日 期: 2014年5月11日-下午5:26:40
    • @return
    • 返回类型: String
      */
      public String dictTable() default "";

    /**

    • 方法描述: 数据code
    • 作 者: yiming.zhang
    • 日 期: 2014年5月13日-下午9:37:16
    • @return
    • 返回类型: String
      */
      public String dicCode() default "";

    /**

    • 方法描述: 数据Text
    • 作 者: yiming.zhang
    • 日 期: 2014年5月11日-下午5:29:05
    • @return
    • 返回类型: String
      */
      public String dicText() default "";

    /**

    • 导入数据是否需要转化
    • 若是为true,则需要在pojo中加入 方法:convertset字段名(String text)
    • @return
      /
      public boolean importConvert() default false;
      /
      *
    • 导出数据是否需要转化
    • 若是为true,则需要在pojo中加入方法:convertget字段名()
    • @return
      */
      public boolean exportConvert() default false;

    /**

    • 值的替换是否支持替换多个(默认true,若数据库值本来就包含逗号则需要配置该值为false)
    • @author taoYan
    • @SInCE 2018年8月1日
      */
      public boolean multiReplace() default true;
      }
      请问,怎么导出忽略某些列?

导出多表头Excel时会多出一空列

使用手动ExcelExportEntity或者注解两种形式,导出多表头数据时,会多出一列空列,貌似是把合并的表头也算成了一列,这个是否有办法可以解决,多谢了~

增加特性:列设置颜色

用户有时需要把很多不同对象的数据放到一个sheet里,需要用颜色区分一下不同对象的数据。或者现有的哪些特性可以实现相同的效果吗?

自定义模版提示不兼容问题

版本: 1.2.2
自定义的Excel模版导出报错:
org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]

切换回:1.1.1后正常导出

涉及到合并单元格,读取cell内容,如果@Excel注解中type设置的非1类型,这里使用getStringCellValue()方法会出现异常

依赖

<dependency>
    <groupId>org.jeecgframework</groupId>
    <artifactId>autopoi-web</artifactId>
    <version>1.0.4</version>
</dependency>

文件位置

org/jeecgframework/poi/util/PoiMergeCellUtil.java:91

部分源码

for (int i = startRow; i <= endRow; i++) {
    row = sheet.getRow(i);
    for (Integer index : sets) {
        if (row == null || row.getCell(index) == null) {
            if (mergeDataMap.get(index) == null) {
                continue;
            }
            if (mergeDataMap.get(index).getEndRow() == 0) {
                mergeDataMap.get(index).setEndRow(i - 1);
            }
        } else {
            text = row.getCell(index).getStringCellValue();
            if (StringUtils.isNotEmpty(text)) {
                hanlderMergeCells(index, i, text, mergeDataMap, sheet, row.getCell(index), mergeMap.get(index));
            } else {
                mergeCellOrContinue(index, mergeDataMap, sheet);
            }
        }
    }
}

在上面else中的第一行,读取cell内容,如果@Excel注解中type设置的非1类型,这里使用getStringCellValue()方法会出现异常

@Excel注解type类型为4数值型(源码中type=4是数值,官网文档中type=10是数值,吐槽下~)时,出现以下异常

[ERROR] 2020-08-25 17:56:36.767 [http-nio-8080-exec-1] org.jeecgframework.poi.excel.export.ExcelExportServer - Cannot get a text value from a numeric cell
java.lang.IllegalStateException: Cannot get a text value from a numeric cell
	at org.apache.poi.hssf.usermodel.HSSFCell.typeMismatch(HSSFCell.java:643)
	at org.apache.poi.hssf.usermodel.HSSFCell.getRichStringCellValue(HSSFCell.java:720)
	at org.apache.poi.hssf.usermodel.HSSFCell.getStringCellValue(HSSFCell.java:703)
	at org.jeecgframework.poi.util.PoiMergeCellUtil.mergeCells(PoiMergeCellUtil.java:91)
	at org.jeecgframework.poi.util.PoiMergeCellUtil.mergeCells(PoiMergeCellUtil.java:58)
	at org.jeecgframework.poi.excel.export.base.ExcelExportBase.mergeCells(ExcelExportBase.java:384)
	at org.jeecgframework.poi.excel.export.ExcelExportServer.createSheet(ExcelExportServer.java:171)
	at org.jeecgframework.poi.excel.ExcelExportUtil.exportExcel(ExcelExportUtil.java:65)
	at org.jeecgframework.poi.excel.view.JeecgEntityExcelView.renderMergedOutputModel(JeecgEntityExcelView.java:69)
	at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316)
	at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1370)
	at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1116)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
	at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
	at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
	at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
	at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
	at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
	at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
	at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
	at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
	at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)
	at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
	at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.github.xiaoymin.swaggerbootstrapui.filter.SecurityBasicAuthFilter.doFilter(SecurityBasicAuthFilter.java:84)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.github.xiaoymin.swaggerbootstrapui.filter.ProductionSecurityFilter.doFilter(ProductionSecurityFilter.java:45)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:90)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:117)
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:106)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

@ExcelCollection多对多

一对多导出实体注解源码中,
有没有这种:一个实体类中@ExcelCollection(name="客户"),但是客户这个实体类中还有类似的@ExcelCollection(name="子客户")
就是多对多的情况
不知道有没有描述清楚
image

excel函数计算,会报错

例如使用函数:DATEDIF(L2,TODAY(),"Y")
导入报错Cannot get a text value from a numeric formula cell
是不支持么?

excel export junit

package org.jeecgframework.poi.excel.view;

import javax.servlet.http.HttpServletRequest;
import org.springframework.web.servlet.view.AbstractView;

public abstract class MiniAbstractExcelView extends AbstractView {
private static final String CONTENT_TYPE = "application/vnd.ms-excel";
protected static final String HSSF = ".xls";
protected static final String XSSF = ".xlsx";

public MiniAbstractExcelView() {
    this.setContentType("application/vnd.ms-excel");
}

protected boolean isIE(HttpServletRequest request) {
    return request.getHeader("USER-AGENT").toLowerCase().indexOf("msie") > 0 || request.getHeader("USER-AGENT").toLowerCase().indexOf("rv:11.0") > 0;
}

}

以上代码。当通过 mockmvc等进行测试时,如没有上传USER-AGENT会报错。为我这种小白增加困难,如能加入null 判断。则可解决

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.