我的字符串中有一个特殊字符,我想在excel文件中写入,但poi jar替换为?
特殊字符,如下字符串:
某些网站在Unicode之下
1)
Unicode character Oct Dec Hex HTML
\x{F} si shift in ctrl-o 017 15 0xF 
2)
U+000F : <control-000F> (SHIFT IN [SI])
示例:
我的字符串如下
Excel将输出显示为:
PrincipalOffice~?DIRECTION
我正在使用的代码如下:
String filename= "D:\\DataFiles\\"+File+"";
XSSFWorkbook hwb =new XSSFWorkbook();
XSSFSheet sheet = hwb.createSheet("Data");
XSSFRow rowhead= sheet.createRow((short)0);
rowhead.createCell((short) 0).setCellValue("my");
XSSFRow row= sheet.createRow((short)i);
String value = "PrincipalOffice~DIRECTION";
row.createCell((short) 0).setCellValue(value);
FileOutputStream fileOut = new FileOutputStream(filename);
hwb.write(fileOut);
fileOut.close();
hwb.close();
我尝试了3.15和3.17罐Apache Poi 我是否需要使用其他库?如果是,请建议
答案 0 :(得分:4)
您提到的字符0x0F
或
无法直接存储在XML
中,因为它是控制字符。因此,由于*.xlsx
文件使用XML
存储内容,因此该字符不能直接存储。
Microsoft仍然定义: ECMA-376 Part 1 22.4 Variant Types 22.4.2.4 bstr (Basic String):
22.4.2.4 bstr(基本字符串)
此元素定义二进制基本字符串变体类型,该类型可以存储任何有效的Unicode字符。不能以XML直接表示为的Unicode字符 由XML 1.0规范定义,应使用 Unicode数字字符表示转义字符格式
_xHHHH_
,其中H代表字符值中的十六进制字符。 [示例:XML中不允许使用Unicode字符8 1.0文档,因此应将其转义为_x0008_
。 [最终示例]为了存储转义序列的字面形式,初始下划线应为 本身被转义(即存储为_x005F_
)。 [示例:字符串 文字_x0008_
将存储为_x005F_x0008_
。结束示例]该元素的可能值由W3C XML模式定义 字符串数据类型。
这扩展了W3C XML Schema字符串数据类型。因此,像_xHHHH_
这样的实体,字符序列&#xHHHH;
确实具有特殊的含义。
因此,以下内容将起作用,Excel
将以字符0x0F
作为单元格内容。
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class CreateExcelControlCharacter {
public static void main(String[] args) throws Exception {
Workbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet();
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
String value = "PrincipalOffice\u000FDIRECTION";
value = value.replace("\u000F", "_x000F_");
cell.setCellValue(value);
wb.write(new FileOutputStream("CreateExcelControlCharacter.xlsx"));
wb.close();
}
}
但是我可以问为什么您需要将此控制字符作为Excel
单元格内容?那可能是我的问题Useful use cases for escape character format _xHHHH_ in Office Open XML?的答案。
答案 1 :(得分:0)
添加到Axel点。
有许多控制字符。为了识别它们,请将数据转储到notepad ++或任何会显示控制字符名称/详细信息的工具。
下面是列出所有控制字符的链接
https://ascii.cl/control-characters.htm
现在在Google上找到了它的Unicode,例如“ si unicode”。您会发现一个类似U + 000F的字符串。
现在将字符串替换为\u000F
,然后像_x000F_
那样放置替换
一些例子:
U+000F <Shift In> (SI) Unicode Character - Compart
value = value.replace("\u000F", "_x000F_");
U+001C <File Separator> (FS) Unicode Character - Compart
value = value.replace("\u001C", "_x001C_");
U+001E <Record Separator> (RS) Unicode Character - Compart
value = value.replace("\u001E", "_x001E_");