spring boot + vue 实现导出excel 特定单元格字体设置为红色

标签: jeecg boot  poi  excel  vue.js

后端:代码;

 /**
     * 导出excel
     *
     * @param request
     * @param prProject
     */
    @RequestMapping(value = "/exportXls")
    //@RequiresPermissions("prProject:exportXls")
    public void exportXls(HttpServletRequest request,HttpServletResponse response, PrProject prProject) {
        log.debug("开始导出_______________________" + System.currentTimeMillis());
        IPage<Map<String, Object>> datasPage = iPrCommonService.getSheetData(prProject.getName(), prProject.getProjectType(), 1, 10);
        List<Map<String, Object>> newData = new ArrayList<>();
        String temProjectId = "";
        for (Map<String, Object> data : datasPage.getRecords()) {
            if (data.get("project_id").equals(temProjectId)) {
                String subListString = (String) newData.get(newData.size() - 1).get("subList");
                List<Map> subList = JSONArray.parseArray(subListString, Map.class);
                subList.add(data);
                newData.get(newData.size() - 1).put("subList", JSON.toJSONString(subList));
            } else {
                temProjectId = data.get("project_id").toString();
                List<Map<String, Object>> subList = new ArrayList<>();
                subList.add(data);
                data.put("subList", JSON.toJSONString(subList));
                newData.add(data);
            }
//           }
        }
        IPage ipage = new Page();
        ipage.setSize(datasPage.getSize());
        ipage.setRecords(newData);
        ipage.setPages(datasPage.getPages());
        ipage.setTotal(datasPage.getTotal());
        ipage.setCurrent(datasPage.getCurrent());

        List<Map<String, Object>> fieldData2 = ipage.getRecords();
      /*  for (Map msp : fieldData2) {
            System.out.println("____________" + msp.toString());
        }
*/
        /*得到表头*/
        List<PrStepField> prStepFields = new ArrayList<>();
        List<PrStep> prSteps = iPrStepService.getByProjectType(prProject.getProjectType());
        for (PrStep step : prSteps) {
            QueryWrapper<PrStepField> stepFieldQueryWrapper = new QueryWrapper<>();
            stepFieldQueryWrapper.eq("deleted", YesOrNoConstant.NOTDELETED);
            stepFieldQueryWrapper.eq("is_excel", "Y");
            stepFieldQueryWrapper.orderByAsc("px");
            stepFieldQueryWrapper.eq("step_id", step.getId());
            List<PrStepField> prStepFieldList = prStepFieldService.list(stepFieldQueryWrapper);
            for (PrStepField field : prStepFieldList) {
                prStepFields.add(field);
            }
        }
//        TemplateExcelConstants
        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet();
        sheet.autoSizeColumn(1,true);
        Cell cell;
        CreationHelper helper = workbook.getCreationHelper();
        /*实际填报时间*/
        RichTextString str;
        /*预计填报时间 用于判断颜色,并不参与填入excel*/
        RichTextString yuji;


        Font[] fonts = new Font[1];
        fonts[0] = workbook.createFont();
        fonts[0].setColor(HSSFColor.RED.index);
        Row rHead = sheet.createRow(0);
        cell = rHead.createCell(0);
        str = helper.createRichTextString("项目名称");
        cell.setCellValue(str);
        cell = rHead.createCell(1);
        str = helper.createRichTextString("项目简述");
        cell.setCellValue(str);
        short width=500;
        short height=600;

        /*标题。
        * */

        for (int i = 2; i < prStepFields.size() + 2; i++) {
            // log.info("---+--"+prStepFields.get(i-2).getName());
            cell = rHead.createCell(i);
            str = helper.createRichTextString(prStepFields.get(i - 2).getName());
            cell.setCellValue(str);
        }
//fieldData 返回来要放入表格中项目,单个对象里是包含该项目所有步骤的所有字段id以及对应的值。还有项目名字

        
        for (int i = 1; i < fieldData2.size() + 1; i++) {
            Row row = sheet.createRow(i);
            row.setHeight(height);
            // for (int j = 2; j < fieldData2.get(i - 1).size() + 2; j++) {//map中key个数创造

            /*填充项目名称和项目简述*/
            {
                cell = row.createCell(0);
                cell.setCellValue(fieldData2.get(i-1).get("project_name").toString());
                cell = row.createCell(1);
                cell.setCellValue(fieldData2.get(i-1).get("description").toString());
            }
            for (int j = 2; j < prStepFields.size() + 2; j++) {//字段个数创造
                //prStepFields是头部字段
                cell = row.createCell(j);
                // for (PrStepField prStepField : prStepFields) {
                for (int y = j - 2; y < fieldData2.get(i - 1).size() - 2; y++) {
                    /*从第z开始拿数据*/
                    /*y是从0开始的*/
                    /*判断是否为实际填报时间*/
                    if (y % 2 == 1 && y > 0) {
                        /*y  shiji str*/
                        /*y-1 预计  */
                        /*这里为实际填报时间*/
                        if (fieldData2.get(i - 1).get(prStepFields.get(y).getId()).toString() != null) {
                            /*给单元格中设值 实际时间*/
                            if(fieldData2.get(i - 1).get(prStepFields.get(y).getId()).toString().length()<=1){
                                //str = helper.createRichTextString(fieldData2.get(i - 1).get(prStepFields.get(y).getId()).toString())
                                str = helper.createRichTextString("无");
                            }else{
                                str = helper.createRichTextString(fieldData2.get(i - 1).get(prStepFields.get(y).getId()).toString());
                            }

                            if(fieldData2.get(i - 1).get(prStepFields.get(y-1).getId()).toString().length()<=1){
                                //yuji = helper.createRichTextString(fieldData2.get(i - 1).get(prStepFields.get(y-1).getId()).toString())
                                yuji = helper.createRichTextString("无");
                            }else{
                                /*预计填报时间*/
                                yuji = helper.createRichTextString(fieldData2.get(i - 1).get(prStepFields.get(y - 1).getId()).toString());
                            }
                            /*判断任务时间是否有值*/
                            if (fieldData2.get(i - 1).get(prStepFields.get(y).getId()).toString().length() > 3 && fieldData2.get(i - 1).get(prStepFields.get(y - 1).getId()).toString().length() > 3) {
                                long yujitime;
                                long shijitime;
                                /*处理信息*/
                                try {
                                    Calendar calendaryuji = Calendar.getInstance();
                                    Calendar calendarshiji = Calendar.getInstance();
                                    calendaryuji.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(String.valueOf(yuji)));
                                    calendarshiji.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(String.valueOf(str)));
                                    shijitime = calendaryuji.getTimeInMillis();
                                    yujitime = calendaryuji.getTimeInMillis();
                                    // timeQueue.put(String.valueOf(str));
                                } catch (Exception e) {
                                    e.printStackTrace();
                                    continue;
                                }
                                if (shijitime - yujitime <= 0) {
                                    str.applyFont(fonts[0]);
                                }

                            } else if (fieldData2.get(i - 1).get(prStepFields.get(y).getId()).toString().length() <= 1 && fieldData2.get(i - 1).get(prStepFields.get(y - 1).getId()).toString().length() > 3) {
                                /*实际无,计划有*/
                                /*操作实际*/
                                /*没有实际填报时间,或者现在还没做*/
                                long thistime;
                                /*处理信息*/
                                    try {
                                        Calendar calendarthis = Calendar.getInstance();

                                        calendarthis.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(String.valueOf(fieldData2.get(i - 1).get(prStepFields.get(y-1).getId()).toString())));
                                        thistime = calendarthis.getTimeInMillis();
                                        // timeQueue.put(String.valueOf(str));
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                        continue;
                                    }

                                    /*预计时间与当前时间比较*/
                                    if (thistime - System.currentTimeMillis() <= 0) {
                                        str.applyFont(fonts[0]);
                                    }

                            } else if (fieldData2.get(i - 1).get(prStepFields.get(y).getId()).toString().length() <= 1 && fieldData2.get(i - 1).get(prStepFields.get(y - 1).getId()).toString().length() <= 1) {
                                /*二者都没有*/
                                /*不做变色*/
                            }
                        }
                        cell.setCellValue(str);
                    } else {
                        if (fieldData2.get(i - 1).get(prStepFields.get(y).getId()).toString() != null) {
                            str = helper.createRichTextString(fieldData2.get(i - 1).get(prStepFields.get(y).getId()).toString());
                            cell.setCellValue(str);
                        }
                    }
                    break;
                }

            }
        }
        try {
           // FileOutputStream out = new FileOutputStream(new File("d:\\1.xls"));
            String codeFileName="项目报表";
            /*设置请求头*/
            response.setHeader("Content-Disposition","attachment;filename="+codeFileName+".xlsx");
            /*响应类型,编码*/
            response.setContentType("application/octet-stream;charset=UTF-8");
            /*创建输出流*/
            OutputStream osp=response.getOutputStream();
            /*将excel 文件写入流*/
            workbook.write(osp);
            osp.close();
            //workbook.write(out);
           // out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {

        }
        log.debug("导出结束___________________________" + System.currentTimeMillis());
    }

这当中包含了很多我自己的业务代码,思路是,从数据库中查到需要的数据存放在 List 中,然后循环list中的数据,逐个放进 cell 中,
后端把数据放入outputStream 中
在这里插入图片描述

在这里插入图片描述
核心导出就这两张图,参数列表和返回值要注意

接下来就是前端
首先新建manage.js文件,在里面定义一个方法

import { axios } from '@/utils/request'

export function downxinagmu(url,parameter){
  return axios({
    url: url,
    params: parameter,
    method:'get' ,
    headers: {
      "Content-Type": "application/json; application/octet-stream"
    },
    responseType: 'blob'
  })
}

然后在需要到出的页面写导出方法

  handleExportXls(fileName) {
        if (!fileName || typeof fileName != "string") {
          fileName = "导出文件"
        }
        let param = {projectType: this.projectType, name: this.name,};
        /*  if(this.selectedRowKeys && this.selectedRowKeys.length>0){
            param['selections'] = this.selectedRowKeys.join(",")
          }*/
        console.log("导出参数", JSON.stringify(param))
        downxinagmu(this.url.exportXlsUrl, param).then((data) => {
          if (!data) {
            this.$message.warning("文件下载失败")
            return
          }
          console.log("接受到的文件",data)
          if (typeof window.navigator.msSaveBlob !== 'undefined') {
            window.navigator.msSaveBlob(new Blob([data]), fileName + '.xls')
          } else {
            let url = window.URL.createObjectURL(new Blob([data]))
            let link = document.createElement('a')
            link.style.display = 'none'
            link.href = url
            link.setAttribute('download', fileName + '.xls')
            document.body.appendChild(link)
            link.click()
            document.body.removeChild(link); //下载完成移除元素
            window.URL.revokeObjectURL(url); //释放掉blob对象
          }
        })
      },

让一个按钮触发此方法

<a-button type="primary" icon="download" @click="handleExportXlsMM('项目报表')">导出Excel</a-button>

我用的ant design UI ,效果如下,
在这里插入图片描述
这次总结就到这里了 ,

在这里插入图片描述

版权声明:本文为qq_42213516原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42213516/article/details/107458535

智能推荐

Thread.join()方法的使用

如果一个线程A执行了thread.join()语句,代表当前线程A等待thread线程终止后才从thread.join()方法返回 并且这个方法具有超时特性,可以添加参数设置 输出结果: jdk中Thread.join()方法的源码(进行了部门调整)   每个线程终止的条件是前驱线程的终止,每个线程等待前驱线程终止后,才从join()方法返回,  当线程终止时,会调用自身的no...

linux服务器部署jenkins笔记

安装jenkins参考文档:https://blog.csdn.net/tomatocc/article/details/83930714 1. 打开jenkins官网:https://jenkins.io/download/ 将war包下载到本地 **ps:**这里要注意的是要下载左边下方的war包,不要下载右边下面的war包。左边是稳定版本,右边是最新版本,建议大家使用稳定版本(我刚开始下载的...

k8s部署elasticsearch集群

百度营销大学     环境准备 我们使用的k8s和ceph环境见: https://blog.51cto.com/leejia/2495558 https://blog.51cto.com/leejia/2499684 ECK简介 Elastic Cloud on Kubernetes,这是一款基于 Kubernetes Operator 模式的新型编排产品,用户可使用该产品在...

saas-export项目-AdminLTE介绍与入门

AdminLTE介绍 (1)AdminLTE是什么? AdminLTE是一款建立在bootstrap和jquery之上的开源的模板主题工具 (2)AdminLTE有什么特点? 提供一系列响应的、可重复使用的组件, 并内置了多个模板页面 自适应多种屏幕分辨率,兼容PC和移动端 快速的创建一个响应式的Html5网站 AdminLTE 不但美观, 而且可以免去写很大CSS与JS的工作量 AdminLTE...

MyBatis中ResultMap结果集映射

用于解决属性名和字段名不一致的情况: resultMap 元素是 MyBatis 中最重要最强大的元素。...

猜你喜欢

编写一个shell

编写shell的过程: 1.从标准输入中读入一个字符串。 2.解析字符串 3.创建一个子进程的执行程序。 4.子进程程序替换。 5.父进程等待子进程退出。...

WEB自动化测试中Xpath定位方法

前言: Xpath是在XML文档中查找信息的一种语言,使用路径表达式来选取XML文档中的节点或节点集,由于XML与HTML结构类似(前者用于传输数据,后者用于显示数据),所以Xpath也常用于查找HTML文档中的节点或节点集。 一  路径表达式: 路径以“/”开始     表示找到满足该绝对路径的元素; 路径以//”开始  ...

力扣困难难度 第4题 寻找两个正序数组的中位数

先看一眼题 我的思路: 设置下标i,j分别用于遍历两个数组,初始值均为0,直到找到两个数组中从小到大的第第length/2个数为止结束循环,length为两个数组长度之和。 ·每次比较nums[i]nums[j],如果前者小则i++,否则j++ ·循环结束时,如果count已经达到length/2,则说明已经找到了中位数,[注意:此时有可能正好其中一个数组遍历完了!所以...

[国家集训队]小Z的袜子(莫队)

[国家集训队]小Z的袜子 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿。终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这NN只袜子从1到NN编号,然后从编号LL到RR(LL 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同...

服务器配置(五) 服务器使用tomcat配置https全过程

一.了解服务器配置https协议 HTTPS,是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 配置HTTPS就需要证书,证书通过权威的CA机构付费获得的证书才能被互联网承认,我们将其放在服务器上面,配置好后,就可以进行https通信了。 通过https访问的网站,在地址前可以看到安全两个字,点击可以查...