日常创建后台系统时,经常会出现Excel导入导出问题。这次,在创建后台系统的同时,我想创建Excel导入和导出的公共工具。(莎士比亚,Northern Excel,Northern Exposure)。

通常是导出时导出的前端表,前端表在背景中也有映射类。

所以在使用这个工具的时候,首先整理一下我们要达到的效果。

导出方法接收列表集合、类类型和HttpServletResponse对象

导出可能有下拉列表,因此需要map存储下拉数据源。传递参数后,只需一行代码即可导出

导入方法需要传入文件和类类型。导入后,将返回file集合。其中,对象是接收类型的对象,传递参数后,只要有一行代码就可以导入

实施过程:

首先,必须创建三个注释

一个是EnableExport。导出需要此注释

/* *

*允许导出设置

*/

@Targe)

@Retention)

Public @interface EnableExport {

字串档名;

}然后,可以使用EnableExportField将包含此注释的字段导出到Excel并设置列宽

/* *

*启用此字段可允许导出

*用于设置宽度

*/

@Targe)

@Retention)

public @ interfaceenableexportfield {

Int colWidth default 100

字符串colName

} ImportIndex在导入时设置与Excel中的列相对应的序列号

/* *

*导入时建立索引

*/

@Targe)

@Retention)

Public @interface ImportIndex {

Intindex

}使用注释的示例

创建三个注释后,必须开始Excel操作

先把方法拿来。前端在后台接收上传的Excel文件,然后使用poi读取Excel文件

根据接收类型上面的字段注释顺序,为不同的字段分配值,将其保存到集合中,然后返回。

代码如下:

/* *

将* Excel转换为对象集合

* @param excel Excel文件

* @param clazz POJO类型

* @return

*/

public static listobject parseexceltolist(file excel、classclazz) {

ListObject RES=new ArrayList

//创建输入流,读取Excel

InputStream is=;

图纸=;

Try {

is=new FileInputStream);

If (is)!=) {

workbook workbook=workbook fac(is);

//默认情况下,仅导入第一个工作表

sheet=workbook . get sheet at(0);

If(床单!=) {

//前两行是标题

int I=2;

字串值;

row row=(I);

while(low!=) {

//获取单元格数

intcell num=row . getphysicalnumberofcells;

values=new String[cell num];

for(int j=0;J=储存格numJ) {

cell cell=row . getcell(j);

If(单元格!=) {

//设定储存格内容类型

cell . setcelltype);

//获取单元格值

string value=cell . getstringcellvalue==? cell.getStringCellValue

values[j]=value;

}

}

field fields=clazz . getdeclaredfields;

Object obj=clazz.newInstance

/>for(Field f : fields){
i)){
ImportIndex annotation = f.getDeclaredAnnotation);
int index = anno;
f.setAccessible(true);
//此处使用了阿里巴巴的fastjson包里面的一个类型转换工具类
Object val =Ty(values[index],f.getType,);
f.set(obj,val);
}
}
res.add(obj);
i++;
row=(i);
}

}
}
} catch (Exception e) {
e.printStackTrace;
}
return res;
}

接下来就是导出方法。

导出分为几个步骤:

  1. 建立一个工作簿,也就是类型新建一个Excel文件

  1. 建立一张sheet表

  1. 设置标的行高和列宽

  1. 绘制标题和表头

这两个方法是自定义方法,代码会贴在后面

  1. 写入数据到Excel

  1. 创建下拉列表

  1. 写入文件到response

到这里导出工作就完成了

下面是一些自定义方法的代码

/**
* 获取一个基本的带边框的单元格
* @param workbook
* @return
*/
private static HSSFCellStyle getBasicCellStyle(HSSFWorkbook workbook){
HSSFCellStyle hssfcellstyle = workbook.createCellStyle;
);
);
);
);
);
);
(true);
return hssfcellstyle;
}

/**
* 获取带有背景色的标题单元格
* @param workbook
* @return
*/
private static HSSFCellStyle getTitleCellStyle(HSSFWorkbook workbook){
HSSFCellStyle hssfcellstyle = getBasicCellStyle(workbook);
((short) HSSFColor.CORNFLOWER_BLUE.index); // 设置背景色
);
return hssfcellstyle;
}

/**
* 创建一个跨列的标题行
* @param workbook
* @param hssfRow
* @param hssfcell
* @param hssfsheet
* @param allColNum
* @param title
*/
privatestaticvoidcreateTitle(HSSFWorkbook workbook, HSSFRow hssfRow , HSSFCell hssfcell, HSSFSheet hssfsheet,int allColNum,String title){
//在sheet里增加合并单元格
CellRangeAddress cra = new CellRangeAddress(0, 0, 0, allColNum);
(cra);
// 使用RegionUtil类为合并后的单元格添加边框
RegionU(1, cra, hssfsheet, workbook); // 下边框
RegionU(1, cra, hssfsheet, workbook); // 左边框
RegionU(1, cra, hssfsheet, workbook); // 有边框
RegionU(1, cra, hssfsheet, workbook); // 上边框

//设置表头
hssfRow = hssf(0);
hssfcell = (0);
( getTitleCellStyle(workbook));
);
(title);
}

/**
* 设置表头标题栏以及表格高度
* @param workbook
* @param hssfRow
* @param hssfcell
* @param hssfsheet
* @param colNames
*/
privatestaticvoidcreateHeadRow(HSSFWorkbook workbook,HSSFRow hssfRow , HSSFCell hssfcell,HSSFSheet hssfsheet,List<String> colNames){
//插入标题行
hssfRow = (1);
for (int i = 0; i < colNames.size; i++) {
hssfcell = (i);
(getTitleCellStyle(workbook));
);
(i));
}
}
/**
* excel添加下拉数据校验
* @param sheet 哪个 sheet 页添加校验
* @return
*/
publicstaticvoidcreateDataValidation(Sheet sheet,Map<Integer,String[]> selectListMap) {
if(selectListMap!=) {
(
// 第几列校验(0开始)key 数据源数组value
(key, value) -> {
i;0) {
CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(2, 65535, key, key);
DataValidationHelper helper = ;
DataValidationConstraint constraint = (value);
DataValidation dataValidation = (constraint, cellRangeAddressList);
//处理Excel兼容性问题
if (dataValidation instanceof XSSFDataValidation) {
da(true);
da(true);
} else {
da(false);
}
da(true);
da(true);
da("提示", "只能选择下拉框里面的数据");
(dataValidation);
}
}
);
}
}

使用实例

导出数据

导入数据(返回对象List)

源码地址:

来源:blog.c

1.《【excel导入怎么导】优雅的实现Excel导入和导出》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《【excel导入怎么导】优雅的实现Excel导入和导出》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/2482025.html