Java 获取远程excel内容-修改excel内容
  • 需求背景
  • 前台页面
  • 后端逻辑实现


需求背景

现在需要通过Java获取远程对象存储OSS的excel文件内容,并修改excel内容中的指定列的值后返回新的excel给用户下载。

前台页面

前台页面列表以及搜索条件相关的就不说了,这里直接步入主题,直接讲述对应按钮的功能,页面如图

Java 获取远程excel内容-修改excel内容_excel


我们需要讲的就是红色框中的按钮【导出(脱敏)】,对应按钮的html代码

{

  title: '操作',

  align: 'center',

  formatter: function(value, row, index) {

    var actions = [];

    actions.push('<a class="btn btn-info btn-xs  ' + editFlag + '" href="javascript:void(0)" onclick="searchClueDaily(\'' + options.searchUrl + '\',\'' + row.accountTime + '\', \''+ row.clueType+'\')"><i class="fa fa-list"></i> 查看详情</a> ');

    if(row.errorDetailUrl == null || row.errorDetailUrl == ''){

      actions.push('<a class="btn btn-warning btn-xs' + clueExport + '" href="javascript:void(0)" onclick="notUrlTips()"><i class="fa fa-download"></i> 导出</a> ');

    }else{

      actions.push('<a class="btn btn-warning btn-xs ' + clueExport + '" href="' + row.errorDetailUrl + '"><i class="fa fa-download"></i> 导出</a> ');

      actions.push('<a class="btn btn-warning btn-xs ' + clueExport + '" href="javascript:void(0)" onclick="exportData(\'' + row.errorDetailUrl + '\')"><i class="fa fa-download"></i> 导出(脱敏)</a> ');

    }

    return actions.join('');

  }

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.

对应的js代码

//errorurl为远程文件路径

function exportData(errorurl) {

  window.location.href=prefix+"/exportData?url="+errorurl;

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

其中:prefix为页面全局变量,对应controller请求路径
var prefix = ctx + “project/accountClueDetail”;
errorurl对应的是数据库中查出数据的远程excel文件路径,例如这样的
String errorurl= “http://yuancheng.test.com/online_crm/export/file/2021/10/20/线索获取明细_20210926_购书未购课中级_1634677384547.xlsx”;

后端逻辑实现

整体实现逻辑就是先通过http请求获取远程excel的文件流,然后读取文件流内容到Workbook,再对Workbook中对应列的值进行修改,修改完成后重新创建该列并写回到表格中,最后返回表格给前端下载。

/**

 * 导出线索统计明细列表

 */

@RequiresPermissions("project:accountClueDetail:export")

@RequestMapping("/exportData")

@ResponseBody

public void exportData(String url, HttpServletResponse response)

{

    URL urlfile = null;

    HttpURLConnection httpUrl = null;

    OutputStream out = null;

    try {

        //创建url请求对象

        urlfile = new URL(url);

        httpUrl = (HttpURLConnection) urlfile.openConnection();

        httpUrl.connect();

        //创建Workbook 接收HttpURLConnection返回的输入流

        Workbook workbook = WorkbookFactory.create(httpUrl.getInputStream());

        //获取表格的第一个sheet

        Sheet sheetAt = workbook.getSheetAt(0);

        //获取sheet的行数

        int rows = sheetAt.getPhysicalNumberOfRows();

        for (int i = 1; i < rows; i++) {

            //第0行为表头,故从第1行开始获取行数据

            Row row = sheetAt.getRow(i);

            //获取第3列的数据,列的计算从0来时

            Cell cell = row.getCell(3);

            //获取对应表格的值

            String cellValue = cell.getStringCellValue();

            if (StringUtils.isNotEmpty(cellValue)) {

                //脱敏处理

                String str = desensitizeStr(cellValue);

                //重新创建第1行第3列表格数据并设置脱敏后的数据

                Cell cell1 = row.createCell(3);

                cell1.setCellValue(str);

            }

        }

        response.setCharacterEncoding("UTF-8");

        response.setHeader("content-type", "application/octet-stream; charset=utf-8");


        //设置文件名

        String dname="";

        String exportName = url.substring(url.lastIndexOf("/")+1,url.lastIndexOf("."))+"(脱敏)";

        try {

            //针对IE或IE为内核的浏览器

            if(userAgent.contains("MSIE")||userAgent.contains("Trident")) {

                dname=java.net.URLEncoder.encode(exportName,"UTF-8");

            }else {

                //谷歌控制版本

                dname=new String(exportName.getBytes("UTF-8"),"ISO-8859-1");

            }

        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();

        }

        //设置response响应头

        response.setHeader("Content-Disposition", "attachment;filename="+dname+"(脱敏).xlsx");

        out = response.getOutputStream();

        workbook.write(out);

        //System.out.println("数据导出成功");

        httpUrl.disconnect();

    } catch (Exception e) {

        e.printStackTrace();

    } finally {

        try {

            if(out != null){

                out.flush();

                out.close();

            }

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}


/**

 * 字符串 手机号 脱敏

 *  public static final Pattern TEXT_CONRAIN_PHONE = Pattern.compile("^(.*)(1[0-9]{9})(.*)$");

 * @param sensitizeStr 脱敏字符串

 * @return

 */

private String desensitizeStr(String sensitizeStr){

    Matcher matcher = Regex.TEXT_CONRAIN_PHONE.matcher(sensitizeStr);

    if( matcher.matches() ){

        String phone = matcher.group(2);

        String replaceStr = phone.substring(0, 3) + "****" + phone.substring(7);

        return phone.replace(phone, replaceStr);

    }

    return sensitizeStr;

}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.

到这里就完成了,最后处理后的数据

Java 获取远程excel内容-修改excel内容_开发语言_02