0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何写一个公用工具来进行Excel的导入导出

Android编程精选 来源:Android编程精选 作者:Android编程精选 2022-10-09 14:19 次阅读

Part1序

日常在做后台系统的时候会很频繁的遇到Excel导入导出的问题,正好这次在做一个后台系统,就想着写一个公用工具来进行Excel的导入导出。一般我们在导出的时候都是导出的前端表格,而前端表格同时也会对应的在后台有一个映射类。所以在写这个工具的时候我们先理一下我们需要实现的效果:

导出方法接收一个list集合,和一个Class类型,和HttpServletResponse 对象

导出是可能会有下拉列表,所以需要一个map存储下拉列表数据源,传入参数后只需一行代码即可导出

导入方法需要传入file文件,以及一个Class类型,导入之后将会返回一个list集合,里面的对象就是传入类型的对象,传入参数后只需一行代码即可导入

Part2实现过程

1.首先需要创建三个注解

一个是EnableExport ,必须有这个注解才能导出

/**
*设置允许导出
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public@interfaceEnableExport{
StringfileName();

}

然后就是EnableExportField,有这个注解的字段才会导出到Excel里面,并且可以设置列宽

/**
*设置该字段允许导出
*并且可以设置宽度
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public@interfaceEnableExportField{
intcolWidth()default100;
StringcolName();
}

再就是ImportIndex,导入的时候设置Excel中的列对应的序号

/**
*导入时索引
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public@interfaceImportIndex{
intindex();


}

注解使用示例

3bef6c88-4574-11ed-96c9-dac502259ad0.png三个注解创建好之后就需要开始操作Excel了

Part3操作Excel

首先,导入方法。在后台接收到前端上传的Excel文件之后,使用poi来读取Excel文件我们根据传入的类型上面的字段注解的顺序来分别为不同的字段赋值,然后存入集合中,再返回

欢迎关注公众号"Java学习之道",查看更多干货!

代码如下:

/**
*将Excel转换为对象集合
*@paramexcelExcel文件
*@paramclazzpojo类型
*@return
*/
publicstaticListparseExcelToList(Fileexcel,Classclazz){
Listres=newArrayList<>();
//创建输入流,读取Excel
InputStreamis=null;
Sheetsheet=null;
try{
is=newFileInputStream(excel.getAbsolutePath());
if(is!=null){
Workbookworkbook=WorkbookFactory.create(is);
//默认只获取第一个工作表
sheet=workbook.getSheetAt(0);
if(sheet!=null){
//前两行是标题
inti=2;
Stringvalues[];
Rowrow=sheet.getRow(i);
while(row!=null){
//获取单元格数目
intcellNum=row.getPhysicalNumberOfCells();
values=newString[cellNum];
for(intj=0;j<= cellNum; j++) {
                        Cell cell =   row.getCell(j);
                        if (cell != null) {
                            //设置单元格内容类型
                            cell.setCellType(Cell.CELL_TYPE_STRING );
                            //获取单元格值
                            String value = cell.getStringCellValue() == null ? null : cell.getStringCellValue();
                            values[j]=value;
                        }
                    }
                    Field[] fields = clazz.getDeclaredFields();
                    Object obj = clazz.newInstance();
                    for(Field f : fields){
                        if(f.isAnnotationPresent(ImportIndex.class)){
                            ImportIndex annotation = f.getDeclaredAnnotation(ImportIndex.class);
                            int index = annotation.index();
                            f.setAccessible(true);
                            //此处使用了阿里巴巴的fastjson包里面的一个类型转换工具类
                            Object val =TypeUtils.cast(values[index],f.getType(),null);
                            f.set(obj,val);
                        }
                    }
                    res.add(obj);
                    i++;
                    row=sheet.getRow(i);
                }

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

接下来就是导出方法

导出分为几个步骤:

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

3c1fdefe-4574-11ed-96c9-dac502259ad0.png

2 建立一张sheet表

3c3801dc-4574-11ed-96c9-dac502259ad0.png

3 设置标的行高和列宽

3c4eb008-4574-11ed-96c9-dac502259ad0.png

4 绘制标题和表头

3c6b1860-4574-11ed-96c9-dac502259ad0.png这两个方法是自定义方法,代码会贴在后面

5 写入数据到Excel

3c913e5a-4574-11ed-96c9-dac502259ad0.png

6 创建下拉列表

3cb8b2be-4574-11ed-96c9-dac502259ad0.png

7 写入文件到response

3cd36c44-4574-11ed-96c9-dac502259ad0.png到这里导出工作就完成了下面是一些自定义方法的代码

欢迎关注公众号"Java学习之道",查看更多干货!

/**
*获取一个基本的带边框的单元格
*@paramworkbook
*@return
*/
privatestaticHSSFCellStylegetBasicCellStyle(HSSFWorkbookworkbook){
HSSFCellStylehssfcellstyle=workbook.createCellStyle();
hssfcellstyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
hssfcellstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
hssfcellstyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
hssfcellstyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
hssfcellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
hssfcellstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
hssfcellstyle.setWrapText(true);
returnhssfcellstyle;
}

/**
*获取带有背景色的标题单元格
*@paramworkbook
*@return
*/
privatestaticHSSFCellStylegetTitleCellStyle(HSSFWorkbookworkbook){
HSSFCellStylehssfcellstyle=getBasicCellStyle(workbook);
hssfcellstyle.setFillForegroundColor((short)HSSFColor.CORNFLOWER_BLUE.index);//设置背景色
hssfcellstyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
returnhssfcellstyle;
}

/**
*创建一个跨列的标题行
*@paramworkbook
*@paramhssfRow
*@paramhssfcell
*@paramhssfsheet
*@paramallColNum
*@paramtitle
*/
privatestaticvoidcreateTitle(HSSFWorkbookworkbook,HSSFRowhssfRow,HSSFCellhssfcell,HSSFSheethssfsheet,intallColNum,Stringtitle){
//在sheet里增加合并单元格
CellRangeAddresscra=newCellRangeAddress(0,0,0,allColNum);
hssfsheet.addMergedRegion(cra);
//使用RegionUtil类为合并后的单元格添加边框
RegionUtil.setBorderBottom(1,cra,hssfsheet,workbook);//下边框
RegionUtil.setBorderLeft(1,cra,hssfsheet,workbook);//左边框
RegionUtil.setBorderRight(1,cra,hssfsheet,workbook);//有边框
RegionUtil.setBorderTop(1,cra,hssfsheet,workbook);//上边框

//设置表头
hssfRow=hssfsheet.getRow(0);
hssfcell=hssfRow.getCell(0);
hssfcell.setCellStyle(getTitleCellStyle(workbook));
hssfcell.setCellType(HSSFCell.CELL_TYPE_STRING);
hssfcell.setCellValue(title);
}

/**
*设置表头标题栏以及表格高度
*@paramworkbook
*@paramhssfRow
*@paramhssfcell
*@paramhssfsheet
*@paramcolNames
*/
privatestaticvoidcreateHeadRow(HSSFWorkbookworkbook,HSSFRowhssfRow,HSSFCellhssfcell,HSSFSheethssfsheet,ListcolNames){
//插入标题行
hssfRow=hssfsheet.createRow(1);
for(inti=0;i< colNames.size(); i++) {
        hssfcell = hssfRow.createCell(i);
        hssfcell.setCellStyle(getTitleCellStyle(workbook));
        hssfcell.setCellType(HSSFCell.CELL_TYPE_STRING);
        hssfcell.setCellValue(colNames.get(i));
    }
}
/**
 * excel添加下拉数据校验
 * @param sheet 哪个 sheet 页添加校验
 * @return
 */
public static void createDataValidation(Sheet sheet,MapselectListMap){
if(selectListMap!=null){
selectListMap.forEach(
//第几列校验(0开始)key数据源数组value
(key,value)->{
if(value.length>0){
CellRangeAddressListcellRangeAddressList=newCellRangeAddressList(2,65535,key,key);
DataValidationHelperhelper=sheet.getDataValidationHelper();
DataValidationConstraintconstraint=helper.createExplicitListConstraint(value);
DataValidationdataValidation=helper.createValidation(constraint,cellRangeAddressList);
//处理Excel兼容性问题
if(dataValidationinstanceofXSSFDataValidation){
dataValidation.setSuppressDropDownArrow(true);
dataValidation.setShowErrorBox(true);
}else{
dataValidation.setSuppressDropDownArrow(false);
}
dataValidation.setEmptyCellAllowed(true);
dataValidation.setShowPromptBox(true);
dataValidation.createPromptBox("提示","只能选择下拉框里面的数据");
sheet.addValidationData(dataValidation);
}
}
);
}
}

Part4使用实例

导出数据

3d06dd9a-4574-11ed-96c9-dac502259ad0.png

导入数据(返回对象List)

3d33a7a8-4574-11ed-96c9-dac502259ad0.png

审核编辑:彭静

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Excel
    +关注

    关注

    4

    文章

    218

    浏览量

    55473
  • 代码
    +关注

    关注

    30

    文章

    4762

    浏览量

    68408
  • 数据源
    +关注

    关注

    1

    文章

    62

    浏览量

    9667

原文标题:利用Java注解+反射优雅的实现通用Excel导入导出

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    在LabVIEW中导入导出Excel文件程序设计

    LabVIEW Report Generation工具包的基础上,以示例方式描述了在LabVIEW开发环境中利用报表生成器函数,实现导入Excel文件和导出
    发表于 10-25 14:58

    labview如何导入导出Excel表,希望能给示例或者模板参考!

    labview如何导入导出Excel表,希望能给示例或者模板参考!比较急在做课设!!
    发表于 11-12 16:57

    如何写简易的printf函数?

    如何写简易的printf函数?
    发表于 04-28 06:47

    CAD软件中怎么批量导入导出坐标数据?

    坐标点批量导入导出CAD软件,就很少有设计师精通此道。今天小编为大家详细讲解下,如何使用浩辰CAD进行批量
    发表于 05-12 16:15

    如何写简短的Python代码做一个换脸程序的详细概述

    在这篇文章中将介绍如何写简短(200行)的 Python 脚本,来自动地将幅图片的脸替换为另幅图片的脸。
    的头像 发表于 07-09 10:48 4492次阅读

    如何用公用工具进行Excel导入导出

    日常在做后台系统的时候会很频繁的遇到Excel导入导出的问题,正好这次在做一个后台系统,就想着
    的头像 发表于 08-20 09:33 2699次阅读
    如何用<b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>公用工具</b><b class='flag-5'>来</b><b class='flag-5'>进行</b><b class='flag-5'>Excel</b>的<b class='flag-5'>导入</b><b class='flag-5'>导出</b>

    公用工具进行Excel导入导出

    导入方法需要传入file文件,以及Class类型,导入之后将会返回list集合,里面的对
    的头像 发表于 06-01 10:48 1702次阅读

    如何使用 Python 创建些强大的应用和实用工具

    本文将探讨如何以 Zynq UltraScale 器件上的 IP 核为目标,使用 Python 创建些强大的应用和实用工具。此处提供了
    发表于 09-08 10:23 674次阅读

    百万数据的导入导出解决方案

    就是从DB中查询数据然后使用POI写到Excel上。 写本文的背景是因为在工作中遇到了大数据的导入导出,问题既然来了逃跑不如干掉它!!! 只要这次解决了,后期遇到同样的问题就好解决
    的头像 发表于 10-11 17:19 1299次阅读

    如何导入导出SCL源文件?

    如何导入导出SCL源文件?
    的头像 发表于 01-16 10:41 2177次阅读

    excel导出功能如何实现?

    最近我做过MySQL`百万级别`数据的`excel`导出功能,已经正常上线使用了。 这个功能挺有意思的,里面需要注意的细节还真不少,现在拿出来跟大家分享
    的头像 发表于 05-11 18:17 1198次阅读
    <b class='flag-5'>excel</b><b class='flag-5'>导出</b>功能如何实现?

    款解决大文件内存溢出的 Excel 处理工具

      介绍 快速开始 引入依赖 简单导出 定义实体类 复杂导出 简单导入 参考资料 介绍 EasyExcel 是基于 Java 的、快速、
    的头像 发表于 07-03 16:11 1748次阅读
    <b class='flag-5'>一</b>款解决大文件内存溢出的 <b class='flag-5'>Excel</b> 处理<b class='flag-5'>工具</b>

    如何写简单的装饰器

    要的是,它让 Python 中被装饰器装饰后的方法长得更像装饰前的方法。 本篇文章不会过多的向你介绍装饰器的基本知识,我会默认你知道什么是装饰器,并且懂得如何写简单的装饰器。 不了解装饰器的可以先去阅读我之前
    的头像 发表于 11-01 09:54 474次阅读
    <b class='flag-5'>如何写</b><b class='flag-5'>一</b><b class='flag-5'>个</b>简单的装饰器

    如何写内存泄漏检测工具

    如何确定有内存泄露问题,如何定位到内存泄露位置,如何写内存泄漏检测工具? 1:概述 内存泄露本质:其实就是申请调用malloc/new,但是释放调用free/delete有遗漏,或
    的头像 发表于 11-11 16:19 801次阅读

    数据库的clob类型如何导入导出

    导入导出操作时,可以使用不同的方法和工具实现,具体取决于数据库的类型和版本。 导出CL
    的头像 发表于 11-21 10:51 4679次阅读