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

    文章

    212

    浏览量

    55185
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66739
  • 数据源
    +关注

    关注

    1

    文章

    59

    浏览量

    9587

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    如何向LABVIEW导入MATLAB生成的EXCEL数据?

    变换的公式进行变换。首先,我需要从MATLAB生成的EXCEL中取出数据,还要按顺序进行使用,我的想法是,如果可以一个一个按顺序取出EXCEL
    发表于 03-29 11:24

    如何写Qt版本的Helloworld程序?

    如何写Qt版本的Helloworld程序?
    发表于 05-05 11:07

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

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

    EXCEL BOM.BAS谁有这工具?请大神发给小弟!谢谢!

    EXCEL BOM.BAS谁有这工具?请大神发给小弟!谢谢!XCEL BOM.BAS 有这个工具吗?PADS
    发表于 01-22 23:24

    是否有工具从file.sym或从符号表编辑器导出导入外部符号表到excel或xml?

    您是否有工具从file.sym或从符号表编辑器导出导入外部符号表到excel或xml?到目前为止,我做了些事情,将它与testplan链
    发表于 10-24 11:26

    如何写简易的printf函数?

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

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

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

    单片机如何写段宏控制外部存储器的访问?

    单片机如何写段宏控制外部存储器的访问?
    发表于 10-29 06:24

    如何写简单的字符设备驱动程序?

    如何写简单的字符设备驱动程序?
    发表于 12-23 06:26

    基于Java反射机制的Excel文件导出实现_杨敏煜

    基于Java反射机制的Excel文件导出实现_杨敏煜
    发表于 03-18 09:46 1次下载

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

    日常在做后台系统的时候会很频繁的遇到Excel导入导出的问题,正好这次在做一个后台系统,就想着写一个公用工具进行
    的头像 发表于 08-20 09:33 2495次阅读
    如何用一个<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 1532次阅读

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

    前景 1 传统POI的的版本优缺点比较 2 使用方式哪种看情况 3 百万数据导入导出(正菜) 4 总结 前景 在项目开发中往往需要使用到数据的导入导出
    的头像 发表于 10-11 17:19 968次阅读

    如何导入导出SCL源文件?

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