add EscapeStrCellSetter

This commit is contained in:
Looly 2021-08-18 23:51:19 +08:00
parent 42fbe12f69
commit 3cb4aa0796
3 changed files with 48 additions and 1 deletions

View File

@ -13,6 +13,7 @@
* 【core 】 增加Partition
* 【http 】 SoapClient.sendForResponse改为publicissue#I466NN@Gitee
* 【core 】 XmlUtil增加append重载issue#I466Q0@Gitee
* 【poi 】 增加EscapeStrCellSetterissue#I466ZZ@Gitee
### 🐞Bug修复

View File

@ -0,0 +1,45 @@
package cn.hutool.poi.excel.cell.setters;
import cn.hutool.core.util.ReUtil;
import cn.hutool.core.util.StrUtil;
import java.util.regex.Pattern;
/**
* 字符串转义Cell值设置器<br>
* 使用 _x005F前缀转义_xXXXX_避免被decode的问题<br>
* 如用户传入'_x5116_'会导致乱码使用此设置器转义为'_x005F_x5116_'
*
* @author looly
* @since 5.7.10
*/
public class EscapeStrCellSetter extends CharSequenceCellSetter {
private static final Pattern utfPtrn = Pattern.compile("_x[0-9A-Fa-f]{4}_");
/**
* 构造
*
* @param value
*/
public EscapeStrCellSetter(CharSequence value) {
super(escape(StrUtil.str(value)));
}
/**
* 使用 _x005F前缀转义_xXXXX_避免被decode的问题<br>
* issue#I466ZZ@Gitee
*
* @param value 被转义的字符串
* @return 转义后的字符串
*/
private static String escape(String value) {
if (value == null || false == value.contains("_x")) {
return value;
}
// 使用 _x005F前缀转义_xXXXX_避免被decode的问题
// issue#I466ZZ@Gitee
return ReUtil.replaceAll(value, utfPtrn, "_x005F$0");
}
}

View File

@ -8,6 +8,7 @@ import cn.hutool.core.lang.Console;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.poi.excel.cell.setters.EscapeStrCellSetter;
import cn.hutool.poi.excel.style.StyleUtil;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.BuiltinFormats;
@ -740,7 +741,7 @@ public class ExcelWriteTest {
// https://gitee.com/dromara/hutool/issues/I466ZZ
// 需要输出S_20000314_x5116_0004
// 此处加入一个转义前缀_x005F
List<Object> row = ListUtil.of("S_20000314_x005F_x5116_0004");
List<Object> row = ListUtil.of(new EscapeStrCellSetter("S_20000314_x5116_0004"));
ExcelWriter writer = ExcelUtil.getWriter("d:/test/_x.xlsx");
writer.writeRow(row);