代码之家  ›  专栏  ›  技术社区  ›  Shubham Jain

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

  •  1
  • Shubham Jain  · 技术社区  · 6 年前

    我有一个特殊的字符在我的字符串中,我想写在我的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();
    

    我需要用别的图书馆吗?,如果是,请建议

    2 回复  |  直到 6 年前
        1
  •  5
  •   Axel Richter    6 年前

    人物 0x0F &#15; XML 因为它是一个控制字符。所以自从 *.xlsx 文件使用存储内容 ,该字符不能直接存储。

    然而,微软没有定义: ECMA-376 Part 1 22.4 Variant Types 22.4.2.4 bstr (Basic String)

    22.4.2.4 bstr(基本字符串)

    这个元素定义了一个二进制基本字符串变量类型,它可以存储任何有效的Unicode字符。无法在XML中直接表示为的Unicode字符 应使用 Unicode数字字符表示转义字符格式 _xHHHH_ _x0008_ . [结束示例]要存储转义序列的文字形式,应使用初始下划线 _x005F_ ). [示例:字符串 字面意义的 _x0008个_ 将存储为 _x005F_x0008_

    这个 此元素的可能值由W3CXML模式定义 字符串数据类型。

    _xhhh小时_ 作为一种实体 &#xHHHH; .

    Excel 会有这样的性格

    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();
     }
    
    }
    

    但是我可以问你为什么需要这个控制角色成为一个 擅长 单元格内容?这可能就是我问题的答案 Useful use cases for escape character format _xHHHH_ in Office Open XML? .

        2
  •  1
  •   Shubham Jain    6 年前

    有许多控制字符。要识别它们,请将数据转储到notepad++或任何显示控制字符名称/详细信息的工具。

    下面是列出所有控制字符的链接

    https://ascii.cl/control-characters.htm

    现在将字符串替换为 \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_");