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

简介: 讲述Java获取远程excel内容,并修改excel中指定列内容并返回新的excel

需求背景

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

前台页面

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

image.png

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

{
  title: '操作',
  align: 'center',
  formatter: function(value, row, index) {
    var actions = [];
    actions.push('<aclass="btn btn-info btn-xs  ' + editFlag + '"href="javascript:void(0)"onclick="searchClueDaily(\'' + options.searchUrl + '\',\'' + row.accountTime + '\', \''+ row.clueType+'\')"><iclass="fa fa-list"></i> 查看详情</a> ');
    if(row.errorDetailUrl == null || row.errorDetailUrl == ''){
      actions.push('<aclass="btn btn-warning btn-xs' + clueExport + '"href="javascript:void(0)"onclick="notUrlTips()"><iclass="fa fa-download"></i> 导出</a> ');
    }else{
      actions.push('<aclass="btn btn-warning btn-xs ' + clueExport + '"href="' + row.errorDetailUrl + '"><iclass="fa fa-download"></i> 导出</a> ');
      actions.push('<aclass="btn btn-warning btn-xs ' + clueExport + '"href="javascript:void(0)"onclick="exportData(\'' + row.errorDetailUrl + '\')"><iclass="fa fa-download"></i> 导出(脱敏)</a> ');
    }
    return actions.join('');
  }
}

对应的js代码

//errorurl为远程文件路径functionexportData(errorurl) {
window.location.href=prefix+"/exportData?url="+errorurl;
}

其中: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")
@ResponseBodypublicvoidexportData(Stringurl, HttpServletResponseresponse)
{
URLurlfile=null;
HttpURLConnectionhttpUrl=null;
OutputStreamout=null;
try {
//创建url请求对象urlfile=newURL(url);
httpUrl= (HttpURLConnection) urlfile.openConnection();
httpUrl.connect();
//创建Workbook 接收HttpURLConnection返回的输入流Workbookworkbook=WorkbookFactory.create(httpUrl.getInputStream());
//获取表格的第一个sheetSheetsheetAt=workbook.getSheetAt(0);
//获取sheet的行数introws=sheetAt.getPhysicalNumberOfRows();
for (inti=1; i<rows; i++) {
//第0行为表头,故从第1行开始获取行数据Rowrow=sheetAt.getRow(i);
//获取第3列的数据,列的计算从0来时Cellcell=row.getCell(3);
//获取对应表格的值StringcellValue=cell.getStringCellValue();
if (StringUtils.isNotEmpty(cellValue)) {
//脱敏处理Stringstr=desensitizeStr(cellValue);
//重新创建第1行第3列表格数据并设置脱敏后的数据Cellcell1=row.createCell(3);
cell1.setCellValue(str);
            }
        }
response.setCharacterEncoding("UTF-8");
response.setHeader("content-type", "application/octet-stream; charset=utf-8");
//设置文件名Stringdname="";
StringexportName=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=newString(exportName.getBytes("UTF-8"),"ISO-8859-1");
            }
        } catch (UnsupportedEncodingExceptione) {
e.printStackTrace();
        }
//设置response响应头response.setHeader("Content-Disposition", "attachment;filename="+dname+"(脱敏).xlsx");
out=response.getOutputStream();
workbook.write(out);
//System.out.println("数据导出成功");httpUrl.disconnect();
    } catch (Exceptione) {
e.printStackTrace();
    } finally {
try {
if(out!=null){
out.flush();
out.close();
            }
        } catch (IOExceptione) {
e.printStackTrace();
        }
    }
}
/*** 字符串 手机号 脱敏*  public static final Pattern TEXT_CONRAIN_PHONE = Pattern.compile("^(.*)(1[0-9]{9})(.*)$");* @param sensitizeStr 脱敏字符串* @return*/privateStringdesensitizeStr(StringsensitizeStr){
Matchermatcher=Regex.TEXT_CONRAIN_PHONE.matcher(sensitizeStr);
if( matcher.matches() ){
Stringphone=matcher.group(2);
StringreplaceStr=phone.substring(0, 3) +"****"+phone.substring(7);
returnphone.replace(phone, replaceStr);
    }
returnsensitizeStr;
}

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

image.png

相关文章
|
1月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
131 5
|
1月前
|
Java BI API
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
69 6
|
5月前
|
Java BI 数据处理
如何在Java中实现Excel操作
如何在Java中实现Excel操作
|
1月前
|
Java API Apache
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
51 4
|
7月前
|
前端开发 Java
基于Java爬取微博数据(二) 正文长文本+导出数据Excel
【5月更文挑战第12天】基于Java爬取微博数据,正文长文本+导出数据Excel
|
6月前
|
Java 数据库 数据安全/隐私保护
Java操作Excel文件导入导出【内含有 jxl.jar 】
Java操作Excel文件导入导出【内含有 jxl.jar 】
88 0
|
3月前
|
存储 Java
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
56 2
|
2月前
|
Java Apache
Apache POI java对excel表格进行操作(读、写) 有代码!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
55 0
|
4月前
|
存储 Java Apache
下一篇
DataWorks