SSM+VUE实现Excel表的录入如导出和csv文件的录入

需求

将excel文件和csv文件进行导入数据库,然后再网页上进行增删改查,然后导出新的excel表

需要的依赖

对于excel表的导入与导出使用的是阿里提供的easyexcel包

		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.0.5</version>
        </dependency>

csv文件使用的是opencsv包

 		<dependency>
            <groupId>com.opencsv</groupId>
            <artifactId>opencsv</artifactId>
            <version>5.0</version>
        </dependency>
        <dependency>
            <groupId>net.sourceforge.javacsv</groupId>
            <artifactId>javacsv</artifactId>
            <version>2.0</version>
        </dependency>

        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.2</version>
        </dependency>

后端实现

导入

excel导入

主要的代码:
	@Override
    public int insetExcel(MultipartFile file) throws IOException {
        int insert=0;
        DemoDataListener<Staff> staffDemoDataListener = new DemoDataListener<Staff>();
        EasyExcel.read(file.getInputStream(), Staff.class,staffDemoDataListener).sheet("稿酬发放汇总表").doRead();
        List<Staff> list = staffDemoDataListener.list;
        int num=list.size();
        System.out.println(num);
        for (Staff staff : list) {
            String discrepancy="";
            if (staff.getBank().equals("中国建设银行")){
                staff.setBank("是");
            }else {
                staff.setBank("否");
            }
            String abnormal = judge(list, staff);
            if (!abnormal.equals("")){
                discrepancy="信息重复";
            }
            staff.setAbnormal(abnormal);
            boolean isintact = staff.isintact();
            if (isintact){
                discrepancy+="  信息完整";
            }else {
                discrepancy+="  信息不完整";
            }
            staff.setDiscrepancy(discrepancy);
            insert+= staffMapper.insert(staff);
        }
        if (num==insert){
            return 1;  //插入成功
        }else if(insert>0&&insert<num){
            return -1;  //插入不完整
        }
        return 0; //插入失败
    }
@Service
public class DemoDataListener<T> extends AnalysisEventListener<T> {

    List<T> list = new ArrayList<T>();


    public DemoDataListener() {}
    @Override
    public void invoke(T t, AnalysisContext analysisContext) {  //读取一行后执行,第一个参数是一行的数据对象
        list.add(t);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//        System.out.println(JSON.toJSONString(list));
    }

    //监听器出现异常的情况下调用
    @Override
    public void onException(Exception exception, AnalysisContext context){

    }
}

以上代码主要的功能在:

DemoDataListener<Staff> staffDemoDataListener = new DemoDataListener<>();
EasyExcel.read(file.getInputStream(), Staff.class,staffDemoDataListener).sheet("稿酬发放汇总表").doRead();

通过EasyExcel中的read方法来读取文件流,它需要三个参数,第一个就是文件流,第二个就是,读出的数据所对应的实体类对象的类,第三个是文档数据监听器,它类似于迭代器+扫描器,它可以通过invoke方法读取一行的数据,读完之后接着读取下一行,在读完文件后会执行doAfterAllAnalysed方法,这就是基本简单的录入excel文件,做简单的分页读取数据,页面呈现:
在这里插入图片描述

CSV导入

 @Override
    @Scheduled(cron ="0 35 11 * * ?") //每天11:35执行一次
    public void insertPortal() throws IOException {
        int i1 = portalMapper.countByExample(portalExample);
        if (i1!=0){
            portalMapper.deleteByExample(portalExample);  //删除原有的数据   
        }
        String realpath  = "F:\\uploadfile\\user\\header" + File.separator + "门户抓取信息.csv";  //csv文件在本地的绝对路径
        CsvReader csvReader  = new CsvReader(realpath,',', Charset.forName("GBK")); //String.valueOf(StandardCharsets.UTF_8)
        int insert=0;
        int num=0;
        csvReader.readHeaders();
        while (csvReader.readRecord()) {
            String rawRecord = csvReader.getRawRecord();
            String[] split = rawRecord.split(",");
            System.out.println(split.length);
            if (split.length > 14) {
                num++;
                portal.setDate(split[0]);
                portal.setTitle(split[1]);
                portal.setLink(split[2]);
                portal.setFontnum(split[3].equals("") ? 0 : Integer.valueOf(split[3]));
                portal.setPlatform(split[4]);
                portal.setPlate(split[5]);
                portal.setFontauthor(split[6]);
                portal.setFontauthorunit(split[7]);
                portal.setImgeauthor(split[8]);
                portal.setImgeauthorunit(split[9]);
                portal.setImgenum(split[10].equals("") ? 0 : Integer.valueOf(split[10]));
                portal.setEdit(split[11]);
                portal.setEditunit(split[12]);
                portal.setContributions(split[13]);  //组稿
                portal.setContributionsunit(split[14]);  //平台编辑
                String context = "";
                for (int i = 15; i < split.length; i++) {
                    context += split[i];
                }
                portal.setContent(context);  //内容
                insert += portalMapper.insert(portal);
            }
        }
    }

CSV导入需求是,通过抓包工具抓取数据csv文件放在服务器本地进行定时读取更新数据,opencsv读取数据没太多好说的,不过在定时器上有一个巨坑的,具体可以看我的另一篇博客:
https://blog.csdn.net/m0_57254953/article/details/128004161

excel导出

 	@CrossOrigin
    @ResponseBody
    @GetMapping("/download")
    public void download(HttpServletResponse response) throws IOException {
        List<Staff> staff = excelManage.selectAll();
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("GBK");
        String fileName = URLEncoder.encode("测试", "GBK").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), Staff.class).sheet("员工信息").doWrite(staff);
    }

前端实现

上传文件就是使用ElementUI组件库的上传,就不说了,讲一下文件导出下在的过程:

expor(){
        this.$axios({
          url:"/staff/download",
          responseType: 'blob'
        }).then((res)=>{
          let blob=new Blob([res.data])
          let a=document.createElement("a")
          a.style.display='none'
          a.href=URL.createObjectURL(blob)
          a.setAttribute(
            'download',
            "导出.xlsx"
          ),
          document.body.appendChild(a);
          a.click();                            //下载该文件
          document.body.removeChild(a);

        })
      },

页面展示:
在这里插入图片描述
在这里插入图片描述

打开文件:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值