在读取excel的时候发现有些中文字段无法读取,通过把excel文件解压后对比发现,正常读取和不

能正常读取的中文字段在sharedString.xml中存储的格式有差异,取其中一个字段,如下图:

正常读取的

不能读取的

对比可以看到其区别,然后查找openxlsx对这块的处理,通过调试代码找到代码如下:

const char* XLSharedStrings::getString(uint32_t index) const
{auto iter = xmlDocument().document_element().children().begin();std::advance(iter, index);return iter->first_child().text().get();
}

通过分析代码上下文,并结合getString函数,发现其只处理了si结点的第一个子节点,所以无法

处理上图的存储格式,找到问题了,做一个兼容即可,修改后的代码如下:

const char* XLSharedStrings::getString(uint32_t index) const
{auto iter = xmlDocument().document_element().children().begin();std::advance(iter, index);if (!iter->first_child().empty() && !strcmp(iter->first_child().name(), "r")){pugi::xml_node iter_r = iter->first_child();if (!iter_r.first_child().empty() && !strcmp(iter_r.first_child().name(), "rPr")){pugi::xml_node iter_rPr = iter_r.first_child();if (!iter_rPr.next_sibling().empty() && !strcmp(iter_rPr.next_sibling().name(), "t")){pugi::xml_node iter_t = iter_rPr.next_sibling();return iter_t.text().get();}}}return iter->first_child().text().get();
}

从上面代码可以看到,实际就是如果si标签下面如果是r标签,那就查找rPr标签,然后再找到t标签

即可,如果si标签下面直接是r标签,就还沿用原来的代码。

OpenXLSX 中文字段读取问题相关推荐

  1. oracle+sql+按中文拼音排序,Oracle 中文字段进行排序的sql语句

    Oracle 中文字段进行排序的sql语句 1)按笔画排序 select * from Table order by nlssort(columnName,'NLS_SORT=SCHINESE_STR ...

  2. ItemAdding实现数据验证--中文字段,properties.AfterProperties值为null的问题

    最近写事件接收器,发现中文字段如果直接用properties.AfterProperties["申请人"]这样获取的值为null,无法得到值.后拉忽然发现用英文字段可以得到值.难道 ...

  3. 解决GeoTools中CQL解析中文字段名的问题

    GeoTools中CQL无法解析中文字段名的过滤条件,会报异常错误,经过一个下午的努力,终于通过简单有效的方式解决啦 String filterCondition = "temp='&quo ...

  4. mysql8中文排序_mysql中utf8编码的中文字段按拼音排序

    http://blog.s777n.net/orderbychinesefieldutf8/comment-page-2/ 2010-08-24 17:36 by TomorrowMan | 分类: ...

  5. SAP CRM IBASE头部字段读取的具体实现

    本文介绍IBASE头部字段读取的具体实现. 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

  6. mysql 字段 中文_如何配置mysql支持中文字段名与中文字段

    匿名用户 1级 2018-11-18 回答 中文字段名都可以了 但是中文记录不行 奇怪啊 mysql>; create table a (a char(20)); Query OK, 0 row ...

  7. FireDAC 中文字段过滤问题

    当使用 FireDAC Filter  过滤数据的时候,通常这样写: FDMemTable.Filtered := False; FDMemTable1.Filter := '姓名=' + strin ...

  8. php mssql扩展SQL查询中文字段名解决方法

    一.问题: 数据库是MS SQLServer2000,要把SQLServer2000里的一张表的数据导入MySQL5,其中SQLServer2000表的字段以简体中文命名(强烈建议不要以中文做为字段名 ...

  9. mysql data to long_mysql 当插入中文字段时发生“data too long for column”错误

    从MySql5中运行本地脚本创建数据库,当插入中文字段时发生"data too long for column"错误.上网一查,发现多字节用户大都碰到了这种情况.google搜索网 ...

最新文章

  1. 关于 ORA-01033: ORACLE initialization or shutdown in progress
  2. shiro+springboot分析思路
  3. Liunx 命令大全
  4. c++ mqtt客户端_MQTT详解及百度物接入连接手机测试(含源码) 秦子帅
  5. 公文字体字号标准2020_手把手教你写公文——红头文件的制作技巧
  6. C#之异步导致内存泄漏
  7. 国内最强Web3D软件WebMax正式版发布
  8. SpringAOP简单案例
  9. python怎么激活_Python窗口激活
  10. 《Adobe SiteCatalyst网站分析权威手册》一第1章 什么是Adobe SiteCatal0yst1.1 SiteCatalyst简史...
  11. c++多线程detach函数用法的实例
  12. C语言 条件运算符的用法
  13. 使用Visual Studio怎样制作登录界面
  14. 西恩科技更新招股书:IPO前大手笔分红“套现”, 赵志安为实控人
  15. 第一章计算机系统概述答案,1第一章计算机系统概论.ppt
  16. 《你好,放大器》----学习记录(三)
  17. 【海康威视单个摄像头读取视频流并保存本地】
  18. Two classes have the same XML type name 排错
  19. 短时傅里叶变换(STFT)实例
  20. 域名劫持污染和被墙的区别!

热门文章

  1. npm i依赖版本兼容问题处理
  2. linux的yum详解,Linux之YUM 详解
  3. java实现文件在线预览
  4. nginx 反向proxy多个 tomcat,负载均衡
  5. conda和pip的区别
  6. element form自定义校验_SpringBoot分组校验及自定义校验注解
  7. 自定义链表增,删除,链表逆序
  8. Python数据类型与运算符号
  9. Mybatis基于XML配置SQL映射器(一)
  10. 20150303+JQuery选择器-02