OpenXLSX 中文字段读取问题
在读取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 中文字段读取问题相关推荐
- oracle+sql+按中文拼音排序,Oracle 中文字段进行排序的sql语句
Oracle 中文字段进行排序的sql语句 1)按笔画排序 select * from Table order by nlssort(columnName,'NLS_SORT=SCHINESE_STR ...
- ItemAdding实现数据验证--中文字段,properties.AfterProperties值为null的问题
最近写事件接收器,发现中文字段如果直接用properties.AfterProperties["申请人"]这样获取的值为null,无法得到值.后拉忽然发现用英文字段可以得到值.难道 ...
- 解决GeoTools中CQL解析中文字段名的问题
GeoTools中CQL无法解析中文字段名的过滤条件,会报异常错误,经过一个下午的努力,终于通过简单有效的方式解决啦 String filterCondition = "temp='&quo ...
- mysql8中文排序_mysql中utf8编码的中文字段按拼音排序
http://blog.s777n.net/orderbychinesefieldutf8/comment-page-2/ 2010-08-24 17:36 by TomorrowMan | 分类: ...
- SAP CRM IBASE头部字段读取的具体实现
本文介绍IBASE头部字段读取的具体实现. 要获取更多Jerry的原创文章,请关注公众号"汪子熙":
- mysql 字段 中文_如何配置mysql支持中文字段名与中文字段
匿名用户 1级 2018-11-18 回答 中文字段名都可以了 但是中文记录不行 奇怪啊 mysql>; create table a (a char(20)); Query OK, 0 row ...
- FireDAC 中文字段过滤问题
当使用 FireDAC Filter 过滤数据的时候,通常这样写: FDMemTable.Filtered := False; FDMemTable1.Filter := '姓名=' + strin ...
- php mssql扩展SQL查询中文字段名解决方法
一.问题: 数据库是MS SQLServer2000,要把SQLServer2000里的一张表的数据导入MySQL5,其中SQLServer2000表的字段以简体中文命名(强烈建议不要以中文做为字段名 ...
- mysql data to long_mysql 当插入中文字段时发生“data too long for column”错误
从MySql5中运行本地脚本创建数据库,当插入中文字段时发生"data too long for column"错误.上网一查,发现多字节用户大都碰到了这种情况.google搜索网 ...
最新文章
- 关于 ORA-01033: ORACLE initialization or shutdown in progress
- shiro+springboot分析思路
- Liunx 命令大全
- c++ mqtt客户端_MQTT详解及百度物接入连接手机测试(含源码) 秦子帅
- 公文字体字号标准2020_手把手教你写公文——红头文件的制作技巧
- C#之异步导致内存泄漏
- 国内最强Web3D软件WebMax正式版发布
- SpringAOP简单案例
- python怎么激活_Python窗口激活
- 《Adobe SiteCatalyst网站分析权威手册》一第1章 什么是Adobe SiteCatal0yst1.1 SiteCatalyst简史...
- c++多线程detach函数用法的实例
- C语言 条件运算符的用法
- 使用Visual Studio怎样制作登录界面
- 西恩科技更新招股书:IPO前大手笔分红“套现”, 赵志安为实控人
- 第一章计算机系统概述答案,1第一章计算机系统概论.ppt
- 《你好,放大器》----学习记录(三)
- 【海康威视单个摄像头读取视频流并保存本地】
- Two classes have the same XML type name 排错
- 短时傅里叶变换(STFT)实例
- 域名劫持污染和被墙的区别!