Java导出表格,导出表格,表格导出,导出Excel,导入Excel 工具包

分享一个表格导出的jar包,使用场景:因为Poi版本太老还有项目框架的问题无法使用主流的工具包


声明:此工具包完全个人编写,基于poi3.9版本进行编写,新版poi有一些参数上的优化,可能导致jar包无法使用,且文件导出格式为老版表格后缀为“.xls”,请编写demo测试是否适用场景再使用。

下载

链接:https://pan.baidu.com/s/1IefluW74RuTK9Vt4upTdYg?pwd=1234
提取码:1234

使用介绍

把包放入项目中lib目录
引入:

<dependency>
			<groupId>org.xfm.util</groupId>
			<artifactId>ExcelUtil</artifactId>
			<version>1.0-SNAPSHOT</version>
			<scope>system</scope>
			<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/ExcelUtil-1.0-SNAPSHOT.jar</systemPath>
		</dependency>

使VO类实现ExcelInterface并实现四个方法
方法分为两种 导出方法,导入方法
导出:

  1. getCellName 获取字段映射,通过字段名获取对应中文,注意是双向获取
    具体实现:
 public String getCellName(String s) {
        switch (s){
            case "thisDay":return "记录时间";
            case "userName":return "用户名";
            case "officeName":return "公司名";
            case "areaName":return "大区名";
            
            case "记录时间":return "thisDay";
            case "用户名":return "userName";
            case "公司名":return "officeName";
            case "大区名":return "areaName";
            
        }
        return null;
    }
  1. getTits 这个方法控制字段的显示显示的顺序
    实现如下:
 /**
     * @return
     */
    @Override
    public List<String> getTits() {
        return new ArrayList<>(Arrays.asList(
                "thisDay",
                "userName",
                "officeName",
                "areaName"
        ));
    }

导入以及导出模板的方法:

/**
     * @param s
     * @return
     */
    @Override
    public String getCellNameSet(String s) {
        switch (s){
            case "thisDay":return "记录时间";
            case "userName":return "用户名";
            case "officeName":return "公司名";
            case "areaName":return "大区名";
            
            case "记录时间":return "thisDay";
            case "用户名":return "userName";
            case "公司名":return "officeName";
            case "大区名":return "areaName";
            
        }
        return null;
    }
/**
     * @return
     */
    @Override
    public List<String> getTitsModel() {
        return new ArrayList<>(Arrays.asList(
                "thisDay",
                "userName",
                "officeName",
                "areaName"
        ));
    }
    

导入导出的方式实现上基本是一致的,只不过是字段配置上的差异,比如导出时需要哪些字段,但是导入不需要。
到这里配置就已经完成了,下面是如何使用

调用

  1. 导出以及导出模板
public List<KpBusinessProgressVO> dow(KpBusinessProgressDTO kpBusinessProgressDTO, HttpServletResponse response) {


        // 创建一个工作簿对象
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 创建一个工作表对象
        Sheet sheet = workbook.createSheet("业务进度");
        sheet.setDefaultColumnWidth(14);
        // 创建一个标题行
        Map<String, HSSFCellStyle> styleMap = StatisticsReportController.createCellStyle(workbook);
        //可以自定义样式map key:titleStyle 标题样式 key:headStyle 第二行字段标题样式

        //导出数据
        if ("0".equals(kpClientNodeDTO.getType())) {//为0时导出数据 否则导出模板
            List<KpBusinessProgressVO> list=dao.findList1(kpBusinessProgressDTO);//查询数据list
	        //这里可以处理字典项
	        
	        // 设置单元格title内容和样式
	        ExcelUtils.renderTitle1("业务进度", KpBusinessProgressVO.class, sheet, styleMap);
			//填充数据
	        ExcelUtils.renderValue(list, KpBusinessProgressVO.class, sheet, styleMap, workbook);
        } else {
            // 导出模板
            ExcelUtils.renderTitle1Model("业务进度", KpBusinessProgressVO.class, sheet, styleMap);
        }

		//响应文件
        try {
            // 设置Excel文件名,并以中文进行编码
            String codedFileName = new String("业务进度");
            response.setHeader("Content-Disposition", "attachment;filename=" + new String(codedFileName.getBytes(), "iso-8859-1") + ".xls");
            // 响应类型,编码
            response.setContentType("application/octet-stream;charset=UTF-8");
            // 形成输出流
            OutputStream osOut = response.getOutputStream();
            // 将指定的字节写入此输出流
            workbook.write(osOut);
            // 刷新此输出流并强制将所有缓冲的输出字节被写出
            osOut.flush();
            // 关闭流
            osOut.close();
        } catch (Exception e) {
            logger.info("错误信息", e);
        }

        return list;
    }
  1. 导入
public JsonAppData upload(KpBusinessProgressDTO kpBusinessProgressDTO) {
        if (kpBusinessProgressDTO.getFile() == null)
            return new JsonAppData("0", "文件为空", "");
        //收集数据 注意关键代码只有这一行,其他都是业务代码
        List<KpBusinessProgressVO> kpBusinessProgressDetailVOList = ExcelUtils.getWorkVos(kpBusinessProgressDTO.getFile(), KpBusinessProgressVO.class);


        if (kpBusinessProgressDetailVOList.isEmpty()) {
            return new JsonAppData("0", "没有任何数据!", null);
        }
        
        StringBuffer stringBuffer=new StringBuffer();
        
        for (int i = 0; i < kpBusinessProgressDetailVOList.size(); i++) {
            KpBusinessProgressVO kpBusinessProgressVOFor = kpBusinessProgressDetailVOList.get(i);
            //工具类内判空方法 最后一个参数不进行判空的字段集合,返回数据 **字段不能为空! 。。。
            String isNull = ExcelUtils.getIsNull(kpBusinessProgressVOFor, KpBusinessProgressVO.class,new ArrayList<>(Arrays.asList("备注")));
            if (!"".equals(isNull)) {
                stringBuffer.append("第" + (i + 1) + "行 " + isNull+"  ");
            }
			//下面对每条数据进行校验
            
        }
        //判断是否有错误信息
        if(StringUtils.isNotBlank(stringBuffer.toString())){
            return new JsonAppData("0",stringBuffer.toString(),null);
        }
        //插入数据
        int count = 0;
        for (KpBusinessProgressVO kpBusinessProgressVO : kpBusinessProgressDetailVOList) {
            KpBusinessProgress kpBusinessProgress = new KpBusinessProgress();
            BeanUtils.copyProperties(kpBusinessProgressVO, kpBusinessProgress);
            kpBusinessProgress.preInsert();
            kpBusinessProgress.setId(String.valueOf(UUID.randomUUID()));
            kpBusinessProgress.setIsClose("0");
            count += dao.insert(kpBusinessProgress);
        }
        return new JsonAppData("1", "导入成功," + count + "条数据已导入!", null);
    }

拙劣代码献丑了,希望各位大佬可以不吝赐教,咱也会谦逊求教共同进步!
使用上有不明白的地方发邮件 1376428952@qq.com

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值