java导出 Excel时,对特殊字符编码后的字符串进行解码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java导出 Excel时,对特殊字符编码后的字符串进行解码相关的知识,希望对你有一定的参考价值。

大致情况描述为:
我从页面input输入了a×b
通过post方式提交到后台,后台收到的内容为 a×b
然后将 a×b 保存到了数据库
此时查询出来显示在页面为a×b (显示没问题,自动转码了)
但是,我在将数据库数据导出到excel时,还是原版导出了a×b
有没有什么处理可以在导出时将其转码成a×b?

备注:页面很多,字段也很多,挨个针对性修改不现实。所以我的想法时能不能在导出数据时解决?
导出excel的部分代码为
//调用导出方法
XSSFWorkbook wb = ExcelPoiUtils.exportExcel(dataList, map);
String catNames = getNameByCatalogId(catalog);
String fileName = new String(catNames.getBytes("UTF-8"),"iso8859-1");
OutputStream output = response.getOutputStream();
response.reset();
response.setHeader("Content-disposition", "attachment; filename="+fileName+".xlsx");
System.out.println(getNameByCatalogId(catalog));
response.setContentType("application/msexcel");
wb.write(output);
output.close();

或者有没有其他更好的解决方法,最终结果只要输入什么,就显示、导出什么就行。
...这个页面也给我编码了...我加(隔开)修改一下

大致情况描述为:
我从页面input输入了a×b
通过post方式提交到后台,后台收到的内容为 a&ti(隔开)mes;b
然后将 a&ti(隔开)mes;b 保存到了数据库
此时查询出来显示在页面为a×b (显示没问题,自动转码了)
但是,我在将数据库数据导出到excel时,还是原版导出了a&ti(隔开)mes;b
有没有什么处理可以在导出时将其转码成a×b?

问题解决了,在导出excel写入每个数据时,用StringEscapeUtils.unescapehtml3( "需要反转义的任何内容");

就是cell.setCellValue(StringEscapeUtils.unescapeHtml3(value + ""));

当然,每跳都要反转义一次,程序会慢一点点,测试结果只是慢了5%左右,在接受范围内。
来个人拿分吧

参考技术A //关键代码
HSSFCell cell = new HSSFCell();
cell.setCellType(HSSFCell.CELL_TYPE_STRING);本回答被提问者和网友采纳

导出 excel 400错误

get请求 下载excel 解决错误代码:400

  • 错误代码:400原因
    编码问题,url参数出现了特殊字符
  <p id="acre-nonCooperativeAcre">导出···</p>
  $("#acre-nonCooperativeAcre").click(function () {
        nonCooperativeAcre(10, 100, "123", "b1");
  });


function nonCooperativeAcre(slope, areal, position, boundary) {

    var data = [{
        ‘slope‘: slope,
        ‘area‘: area1,
        ‘position‘: position,
        ‘boundary‘: boundary
    }];

    var a = document.createElement(‘a‘);
    
    // encodeURIComponent()
    
    var url = ‘http://1127.0.0.1:8080/gis/nonCooperativeAcre?jsonParam=‘ + encodeURIComponent(JSON.stringify(data));
    a.href = url;
    a.click();
    }
  • encodeURIComponent 简介
  • encodeURIComponent()是对统一资源标识符(URI)的组成部分进行编码的方法。它使用一到四个转义序列来表示字符串中的每个字符的UTF-8编码(只有由两个Unicode代理区字符组成的字符才用四个转义字符编码) 转义除了字母、数字、(、)、.、!、~、*、‘、-和_之外的所有字符
  • 为了避免服务器收到不可预知的请求,对任何用户输入的作为URI部分的内容你都需要用encodeURIComponent进行转义。比如,一个用户可能会输入"Thyme &time=again"作为comment变量的一部分。如果不使用encodeURIComponent对此内容进行转义,服务器得到的将是comment=Thyme%20&time=again。请注意,"&"符号和"="符号产生了一个新的键值对,所以服务器得到两个键值对(一个键值对是comment=Thyme,另一个则是time=again),而不是一个键值对。

  • 对于 application/x-www-form-urlencoded (POST) 这种数据方式,空格需要被替换成 ‘+‘,所以通常使用 encodeURIComponent 的时候还会把 "%20" 替换为 "+"。

  • 为了更严格的遵循 RFC 3986(它保留 !, ‘, (, ), 和 *),即使这些字符并没有正式划定 URI 的用途,下面这种方式是比较安全的:


function fixedEncodeURIComponent (str) {
  return encodeURIComponent(str).replace(/[!‘()*]/g, function(c) {
    return ‘%‘ + c.charCodeAt(0).toString(16);
  });
 }
  • 下面这个例子提供了 UTF-8 下 Content-Disposition 和 Link 的服务器响应头信息的参数(例如 UTF-8 文件名):
ar fileName = ‘my file(2).txt‘;
var header = "Content-Disposition: attachment; filename*=UTF-8‘‘" 
             + encodeRFC5987ValueChars(fileName);

console.log(header); 
// 输出 "Content-Disposition: attachment; filename*=UTF-8‘‘my%20file%282%29.txt"


function encodeRFC5987ValueChars (str) {
    return encodeURIComponent(str).
        // 注意,仅管 RFC3986 保留 "!",但 RFC5987 并没有
        // 所以我们并不需要过滤它
        replace(/[‘()]/g, escape). // i.e., %27 %28 %29
        replace(/\*/g, ‘%2A‘).
            // 下面的并不是 RFC5987  URI 编码必须的
            // 所以对于 |`^ 这3个字符我们可以稍稍提高一点可读性
            replace(/%(?:7C|60|5E)/g, unescape);
}

以上是关于java导出 Excel时,对特殊字符编码后的字符串进行解码的主要内容,如果未能解决你的问题,请参考以下文章

JS编解码与Java编解码

BigQuery json 特殊字符 UI 导出问题

Rails CSV 导出到 excel 会产生特殊的 Â 和 &amp 字符

微信昵称emoji表情,特殊表情导致列表不显示,导出EXCEL报错等问题解决!

导出 excel 400错误

java 连接mysql时 怎么对特殊字符转译 例如某个字符 :灰\ 怎样对\ 进行转译