diff --git a/CHANGELOG.md b/CHANGELOG.md index 8d83083e3..8e455a220 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ * 【core 】 增加Partition * 【http 】 SoapClient.sendForResponse改为public(issue#I466NN@Gitee) * 【core 】 XmlUtil增加append重载(issue#I466Q0@Gitee) +* 【poi 】 增加EscapeStrCellSetter(issue#I466ZZ@Gitee) ### 🐞Bug修复 diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/setters/EscapeStrCellSetter.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/setters/EscapeStrCellSetter.java new file mode 100644 index 000000000..60a62e133 --- /dev/null +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/cell/setters/EscapeStrCellSetter.java @@ -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值设置器
+ * 使用 _x005F前缀转义_xXXXX_,避免被decode的问题
+ * 如用户传入'_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的问题
+ * 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"); + } +} diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java index c98f3ab2b..4f5916c52 100644 --- a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java +++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelWriteTest.java @@ -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 row = ListUtil.of("S_20000314_x005F_x5116_0004"); + List row = ListUtil.of(new EscapeStrCellSetter("S_20000314_x5116_0004")); ExcelWriter writer = ExcelUtil.getWriter("d:/test/_x.xlsx"); writer.writeRow(row);