Coder Social home page Coder Social logo

jeecgboot / autopoi Goto Github PK

View Code? Open in Web Editor NEW
460.0 23.0 198.0 305 KB

AutoPOI 功能如同名字auto,追求的就是自动化,让一个没接触过poi的人员,可以傻瓜化的快速实现Excel导入导出、Word模板导出、可以仅仅5行代码就可以完成Excel的导入导出。

Home Page: http://www.jeecg.com

License: Apache License 2.0

Java 99.98% Batchfile 0.02%
poi easypoi easyexcel excel

autopoi's Introduction

AutoPOI (Excel和 Word简易工具类)

AutoPOI 功能如同名字auto,追求的就是自动化,让一个没接触过poi的人员,可以傻瓜化的快速实现Excel导入导出、Word模板导出、可以仅仅5行代码就可以完成Excel的导入导出。

当前最新版本: 1.4.8(发布日期:20240426)


AutoPOI的主要特点

1.设计精巧,使用简单
2.接口丰富,扩展简单
3.默认值多,write less do more
4.AbstractView 支持,web导出可以简单明了

AutoPOI的几个入口工具类

1.ExcelExportUtil Excel导出(普通导出,模板导出)
2.ExcelImportUtil Excel导入
3.WordExportUtil  Word导出(只支持docx ,doc版本poi存在图片的bug,暂不支持)

关于Excel导出XLS和XLSX区别

1.导出时间XLS比XLSX快2-3倍
2.导出大小XLS是XLSX的2-3倍或者更多
3.导出需要综合网速和本地速度做考虑^~^

几个工程的说明

1.autopoi-parent 父包--作用大家都懂得
2.autopoi 导入导出的工具包,可以完成Excel导出,导入,Word的导出,Excel的导出功能
3.autopoi-web  耦合了spring-mvc 基于AbstractView,极大的简化spring-mvc下的导出功能
4.sax 导入使用xercesImpl这个包(这个包可能造成奇怪的问题哈),word导出使用poi-scratchpad,都作为可选包了

maven

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

AutoPoi 模板 表达式支持

  • 空格分割
  • 三目运算 {{test ? obj:obj2}}
  • n: 表示 这个cell是数值类型 {{n:}}
  • le: 代表长度{{le:()}} 在if/else 运用{{le:() > 8 ? obj1 : obj2}}
  • fd: 格式化时间 {{fd:(obj;yyyy-MM-dd)}}
  • fn: 格式化数字 {{fn:(obj;###.00)}}
  • fe: 遍历数据,创建row
  • !fe: 遍历数据不创建row
  • $fe: 下移插入,把当前行,下面的行全部下移.size()行,然后插入
  • !if: 删除当前列 {{!if:(test)}}
  • 单引号表示常量值 '' 比如'1' 那么输出的就是 1

AutoPoi导出实例

1.注解,导入导出都是基于注解的,实体上做上注解,标示导出对象,同时可以做一些操作

	@ExcelTarget("courseEntity")
	public class CourseEntity implements java.io.Serializable {
	/** 主键 */
	private String id;
	/** 课程名称 */
	@Excel(name = "课程名称", orderNum = "1", needMerge = true)
	private String name;
	/** 老师主键 */
	@ExcelEntity(id = "yuwen")
	@ExcelVerify()
	private TeacherEntity teacher;
	/** 老师主键 */
	@ExcelEntity(id = "shuxue")
	private TeacherEntity shuxueteacher;

	@ExcelCollection(name = "选课学生", orderNum = "4")
	private List<StudentEntity> students;

2.基础导出 传入导出参数,导出对象,以及对象列表即可完成导出

	HSSFWorkbook workbook = ExcelExportUtil.exportExcel(new ExportParams(
				"2412312", "测试", "测试"), CourseEntity.class, list);

3.基础导出,带有索引 在到处参数设置一个值,就可以在导出列增加索引

	ExportParams params = new ExportParams("2412312", "测试", "测试");
	params.setAddIndex(true);
	HSSFWorkbook workbook = ExcelExportUtil.exportExcel(params,
			TeacherEntity.class, telist);

4.导出Map 创建类似注解的集合,即可完成Map的导出,略有麻烦

	List<ExcelExportEntity> entity = new ArrayList<ExcelExportEntity>();
	entity.add(new ExcelExportEntity("姓名", "name"));
	entity.add(new ExcelExportEntity("性别", "sex"));

	List<Map<String, String>> list = new ArrayList<Map<String, String>>();
	Map<String, String> map;
	for (int i = 0; i < 10; i++) {
		map = new HashMap<String, String>();
		map.put("name", "1" + i);
		map.put("sex", "2" + i);
		list.add(map);
	}

	HSSFWorkbook workbook = ExcelExportUtil.exportExcel(new ExportParams(
			"测试", "测试"), entity, list);	

5.模板导出 根据模板配置,完成对应导出

	TemplateExportParams params = new TemplateExportParams();
	params.setHeadingRows(2);
	params.setHeadingStartRow(2);
	Map<String,Object> map = new HashMap<String, Object>();
    map.put("year", "2013");
    map.put("sunCourses", list.size());
    Map<String,Object> obj = new HashMap<String, Object>();
    map.put("obj", obj);
    obj.put("name", list.size());
	 params.setTemplateUrl("org/jeecgframework/poi/excel/doc/exportTemp.xls");
	Workbook book = ExcelExportUtil.exportExcel(params, CourseEntity.class, list,
			map);

6.导入 设置导入参数,传入文件或者流,即可获得相应的list

	ImportParams params = new ImportParams();
	params.setTitleRows(2);
	params.setHeadRows(2);
	//params.setSheetNum(9);
	params.setNeedSave(true);
	long start = new Date().getTime();
	List<CourseEntity> list = ExcelImportUtil.importExcel(new File(
			"d:/tt.xls"), CourseEntity.class, params);

7.SpringMvc的无缝融合 简单几句话,Excel导出搞定

	@RequestMapping(value = "/exportXls")
	public ModelAndView exportXls(HttpServletRequest request, HttpServletResponse response) {
		ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
		List<JeecgDemo> pageList = jeecgDemoService.list();
		//导出文件名称
		mv.addObject(NormalExcelConstants.FILE_NAME,"导出Excel文件名字");
		//注解对象Class
		mv.addObject(NormalExcelConstants.CLASS,JeecgDemo.class);
		//自定义表格参数
		mv.addObject(NormalExcelConstants.PARAMS,new ExportParams("自定义导出Excel模板内容标题", "自定义Sheet名字"));
		//导出数据列表
		mv.addObject(NormalExcelConstants.DATA_LIST,pageList);
		return mv;
	}
自定义视图 用途 描述
JeecgMapExcelView 实体对象导出视图 例如:List
JeecgEntityExcelView Map对象导出视图 List<Map<String, String>> list
JeecgTemplateExcelView Excel模板导出视图 -
JeecgTemplateWordView Word模板导出视图 -

8.Excel导入校验,过滤不符合规则的数据,追加错误信息到Excel,提供常用的校验规则,已经通用的校验接口

	/**
     * Email校验
     */
    @Excel(name = "Email", width = 25)
    @ExcelVerify(isEmail = true, notNull = true)
    private String email;
    /**
     * 手机号校验
     */
    @Excel(name = "Mobile", width = 20)
    @ExcelVerify(isMobile = true, notNull = true)
    private String mobile;
    
    ExcelImportResult<ExcelVerifyEntity> result = ExcelImportUtil.importExcelVerify(new File(
            "d:/tt.xls"), ExcelVerifyEntity.class, params);
    for (int i = 0; i < result.getList().size(); i++) {
        System.out.println(ReflectionToStringBuilder.toString(result.getList().get(i)));
    }

9.导入Map 设置导入参数,传入文件或者流,即可获得相应的list,自定义Key,需要实现IExcelDataHandler接口

	ImportParams params = new ImportParams();
	List<Map<String,Object>> list = ExcelImportUtil.importExcel(new File(
			"d:/tt.xls"), Map.class, params);

10.字典用法 在实体属性注解excel中添加dicCode="",此处dicCode即为jeecg系统中数据字典的Code

   @Excel(name="性别",width=15,dicCode="sex")
   private java.lang.String sex;

11.字典表用法 此处dictTable为数据库表名,dicCode为关联字段名,dicText为excel中显示的内容对应的字段

	@Excel(name="部门",dictTable="t_s_depart",dicCode="id",dicText="departname")
    private java.lang.String depart;

12.Replace用法 若数据库中存储的是0/1 ,则导出/导入的excel单元格中显示的是女/男

	@Excel(name="测试替换",width=15,replace={"男_1","女_0"})
	private java.lang.String fdReplace;

13.高级字段转换用法

  • exportConvert:在导出的时候需要替换值则配置该值为true,同时增加一个方法,方法名为原get方法名前加convert。
  • importConvert:在导入的时候需要替换值则配置该值为true,同时增加一个方法,方法名为原set方法名前加convert。
	@Excel(name="测试转换",width=15,exportConvert=true,importConvert=true)
	private java.lang.String fdConvert;
	
	/**
	  * 转换值示例: 在该字段值的后面加上元
	  * @return
	  */
	public String convertgetFdConvert(){
	  return this.fdConvert+"元";
	}
	  
	/**
	 * 转换值示例: 替换掉excel单元格中的"元"
	 * @return
	 */
	public void convertsetFdConvert(String fdConvert){
	  this.fdConvert = fdConvert.replace("元","");
	}

Excel 注解说明

@Excel

属性 类型 默认值 功能
name String null 列名,支持name_id
needMerge boolean fasle 是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row)
orderNum String "0" 列的排序,支持name_id
replace String[] {} 值得替换 导出是{a_id,b_id} 导入反过来
savePath String "upload" 导入文件保存路径,如果是图片可以填写,默认是upload/className/ IconEntity这个类对应的就是upload/Icon/
type int 1 导出类型 1 是文本 2 是图片,3 是函数,10 是数字 默认是文本
width double 10 列宽
height double 10 列高,后期打算统一使用@ExcelTarget的height,这个会被废弃,注意
isStatistics boolean fasle 自动统计数据,在追加一行统计,把所有数据都和输出 这个处理会吞没异常,请注意这一点
isHyperlink boolean FALSE 超链接,如果是需要实现接口返回对象
isImportField boolean TRUE 校验字段,看看这个字段是不是导入的Excel中有,如果没有说明是错误的Excel,读取失败,支持name_id
exportFormat String "" 导出的时间格式,以这个是否为空来判断是否需要格式化日期
importFormat String "" 导入的时间格式,以这个是否为空来判断是否需要格式化日期
format String "" 时间格式,相当于同时设置了exportFormat 和 importFormat
databaseFormat String "yyyyMMddHHmmss" 导出时间设置,如果字段是Date类型则不需要设置 数据库如果是string 类型,这个需要设置这个数据库格式,用以转换时间格式输出
numFormat String "" 数字格式化,参数是Pattern,使用的对象是DecimalFormat
imageType int 1 导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的
suffix String "" 文字后缀,如% 90 变成90%
isWrap boolean TRUE 是否换行 即支持\n
mergeRely int[] {} 合并单元格依赖关系,比如第二列合并是基于第一列 则{0}就可以了
mergeVertical boolean fasle 纵向合并内容相同的单元格
fixedIndex int -1 对应excel的列,忽略名字
isColumnHidden boolean FALSE 导出隐藏列

@ExcelCollection

属性 类型 默认值 功能
id String null 定义ID
name String null 定义集合列名,支持nanm_id
orderNum int 0 排序,支持name_id
type Class<?> ArrayList.class 导入时创建对象使用

单表导出实体注解源码

public class SysUser implements Serializable {

    /**id*/
    private String id;

    /**登录账号 */
    @Excel(name = "登录账号", width = 15)
    private String username;

    /**真实姓名*/
    @Excel(name = "真实姓名", width = 15)
    private String realname;

    /**头像*/
    @Excel(name = "头像", width = 15)
    private String avatar;

    /**生日*/
    @Excel(name = "生日", width = 15, format = "yyyy-MM-dd")
    private Date birthday;

    /**性别(1:男 2:女)*/
    @Excel(name = "性别", width = 15,dicCode="sex")
    private Integer sex;

    /**电子邮件*/
    @Excel(name = "电子邮件", width = 15)
    private String email;

    /**电话*/
    @Excel(name = "电话", width = 15)
    private String phone;

    /**状态(1:正常  2:冻结 )*/
    @Excel(name = "状态", width = 15,replace={"正常_1","冻结_0"})
    private Integer status;

一对多导出实体注解源码

@Data
public class JeecgOrderMainPage {
	
	/**主键*/
	private java.lang.String id;
	/**订单号*/
	@Excel(name="订单号",width=15)
	private java.lang.String orderCode;
	/**订单类型*/
	private java.lang.String ctype;
	/**订单日期*/
	@Excel(name="订单日期",width=15,format = "yyyy-MM-dd")
	private java.util.Date orderDate;
	/**订单金额*/
	@Excel(name="订单金额",width=15)
	private java.lang.Double orderMoney;
	/**订单备注*/
	private java.lang.String content;
	/**创建人*/
	private java.lang.String createBy;
	/**创建时间*/
	private java.util.Date createTime;
	/**修改人*/
	private java.lang.String updateBy;
	/**修改时间*/
	private java.util.Date updateTime;
	
	@ExcelCollection(name="客户")
	private List<JeecgOrderCustomer> jeecgOrderCustomerList;
	@ExcelCollection(name="机票")
	private List<JeecgOrderTicket> jeecgOrderTicketList;
}

autopoi's People

Contributors

dependabot[bot] avatar lly-ke avatar lsqgithub716 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  avatar

autopoi's Issues

EXCEL根据模板导出 报错

导出模板
image

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

报错的代码代码如下

image

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

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

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

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

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

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

导出字段类型 文档里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格式的,

@ExcelCollection多对多

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

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)

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 判断。则可解决

涉及到合并单元格,读取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)

不支持多sheet导入

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

能否导入指定sheet页的数据

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

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

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

ImportParams 类的 keyindex属性 不起作用

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

样式错误

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;

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("判断参数不对");
}

模版导出问题

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

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

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

增加特性:列设置颜色

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

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

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

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;
      }
      请问,怎么导出忽略某些列?

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

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

切换回:1.1.1后正常导出

导入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导入改造点--------

导入行号

如何在导入时,能拿到某条数据所在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 放到服务器后就不行

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.