Apache POI jar无法在excel文件中写入特殊字符

时间:2018-09-05 12:36:34

标签: java excel apache-poi

我的字符串中有一个特殊字符,我想在excel文件中写入,但poi jar替换为?

特殊字符,如下字符串:

enter image description here

某些网站在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])

示例:

我的字符串如下

enter image description here

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 我是否需要使用其他库?如果是,请建议

2 个答案:

答案 0 :(得分:4)

您提到的字符0x0F&#15;无法直接存储在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_");