java后端导出如何自定义样式

22 阅读1分钟

最近在研究一个java项目,需要实现一个导出功能,后端用的是EasyExcel组件,版本是3.3.3版本,导出功能很简单。但是我想要实现Excel中加入标题,已经给表头自定义样式。折腾了半天,终于解决了,记录下来方便以后查看。 后端主要代码:

// 1. 首先创建一个样式策略
            WriteCellStyle headWriteCellStyle = new WriteCellStyle();
            // 设置表头字体
            WriteFont headWriteFont = new WriteFont();
            headWriteFont.setFontHeightInPoints((short) 12); // 表头字体大小
            headWriteCellStyle.setWriteFont(headWriteFont);

            // 2. 构建样式策略对象
            HorizontalCellStyleStrategy horizontalCellStyleStrategy =
                    new HorizontalCellStyleStrategy(headWriteCellStyle, new WriteCellStyle());
            com.alibaba.excel.EasyExcel.write(response.getOutputStream())
                    .head(head)
                    .relativeHeadRowIndex(1// 关键:把表头下移一行
                    .registerWriteHandler(horizontalCellStyleStrategy)
                    .registerWriteHandler(new com.alibaba.excel.write.handler.SheetWriteHandler() {
                        @Override
                        public void afterSheetCreate(com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder wb,
                                                     com.alibaba.excel.write.metadata.holder.WriteSheetHolder sh) {
                            org.apache.poi.ss.usermodel.Sheet sheet = sh.getSheet();
                            org.apache.poi.ss.usermodel.Row r0 = sheet.createRow(0);
                            org.apache.poi.ss.usermodel.Cell c0 = r0.createCell(0);
                            c0.setCellValue(title);
                            org.apache.poi.ss.usermodel.CellStyle titleStyle = sheet.getWorkbook().createCellStyle();
                            org.apache.poi.ss.usermodel.Font titleFont = sheet.getWorkbook().createFont();
                            titleFont.setFontHeightInPoints((short) 16); // 标题字体大小 16
                            titleFont.setBold(true); // 标题加粗
                            titleStyle.setFont(titleFont);
                            titleStyle.setAlignment(org.apache.poi.ss.usermodel.HorizontalAlignment.CENTER);
                            c0.setCellStyle(titleStyle);
                            sheet.addMergedRegion(new org.apache.poi.ss.util.CellRangeAddress(000, Math.max(colCount - 10)));
                        }
                    })

                    .sheet("导出数据")
                    .doWrite(rows);

主要就是给Excel第一行增加标题,以及给表头自定义样式,比如大小,字体颜色等。 前端代码:

public exportData() {
    //查询参数 
    this.search_params = {
    
    }
    const title = '导出数据.xls'
    const exportParam = Object.assign({}, this.search_params, { responseType'blob' })
    this.$http.submit('get''mybusiness/export', {}, exportParam, '.el-main').then((res: any) => {
      const reader = new FileReader()
      reader.onload = (e: any) => {
        const nav = window.navigator as any
        try {
          const errData = JSON.parse(e.target.result)
          if (errData.code != 200 || errData.message) {
            return this.$message.warning(errData?.message || '导出失败')
          } else {
            if (nav && nav.msSaveOrOpenBlob) {
              nav.msSaveBlob(res, title)
            } else {
              let a = document.createElement('a')
              a.download = title
              a.href = window.URL.createObjectURL(res)
              a.click()
            }
          }
        } catch (err) {
          if (nav && nav.msSaveOrOpenBlob) {
            nav.msSaveBlob(res, title)
          } else {
            let a = document.createElement('a')
            a.download = title
            a.href = window.URL.createObjectURL(res)
            a.click()
          }
        }
      }
      reader.readAsText(res)
    })

  }

前端用的是VUE,后端是JAVA,实现起来还是挺简单,就不知道后端导出会不会影响性能。