日常创建后台系统时,经常会出现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;
}
接下来就是导出方法。
导出分为几个步骤:
建立一个工作簿,也就是类型新建一个Excel文件
建立一张sheet表
设置标的行高和列宽
绘制标题和表头
这两个方法是自定义方法,代码会贴在后面
写入数据到Excel
创建下拉列表
写入文件到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