WPS文本域替换不完全的问题
前段时间用户反馈我们的一个Active-X控件在对WPS文档进行文本域操作时无法完全替换值,但是在WORD中不存在该问题。通常来说WPS的许多接口都和WORD相同,DISPID也几乎一致(WPS Document的Application的DISPID和WORD不同,一个是0x000003e8而另一个是0×00000001)。于是将替换核心代码抽出做成一个命令行工具进行测试,代码如下:
2 std::wcout.imbue(std::locale(“chs”)); 3 4 #ifndef DEBUG 5 wcout << *(argv + 1) << endl; 6 #endif 7 8 CComPtr<IOleObject> pole = NULL; 9 CComPtr<IBindCtx> pbctx = NULL; 10 CComPtr<IMoniker> pmkfile = NULL; 11 HRESULT hr = S_OK; 12 BIND_OPTS bopts = { sizeof(BIND_OPTS), BIND_MAYBOTHERUSER, 0, 10000 }; 13 14 #ifdef DEBUG 15 LPOLESTR pwszFile = _T(“E:\\Test.wps”); 16 #else 17 LPOLESTR pwszFile = *(argv + 1); 18 #endif 19 20 bopts.grfMode = (STGM_TRANSACTED | STGM_SHARE_DENY_WRITE | STGM_READWRITE); 21 22 ::CoInitialize(NULL); 23 24 hr = CreateBindCtx(0, &pbctx); 25 hr = pbctx->SetBindOptions(&bopts); 26 hr = CreateFileMoniker(pwszFile, &pmkfile); 27 hr = pmkfile->BindToObject(pbctx, NULL, IID_IOleObject, (void**)&pole); 28 29 CComPtr<IDispatch> pdisp; 30 CComPtr<IDispatch> pFields; 31 32 hr = pole.QueryInterface<IDispatch>(&pdisp); 33 hr = Marshal::GetIDispatchProperty(pdisp, DISP_DOCUMENT_FIELDS, &pFields); 34 35 LONG lCount; 36 37 hr = Marshal::GetCollectionCount(pFields, &lCount); 38 39 printf(“Field count = %ld\r\n”, lCount); 40 41 for (LONG i = 1; i <= lCount; ++i) { 42 CComPtr<IDispatch> pField, pCode, pResult; 43 CComBSTR strText; 44 LONG lStart, lEnd; 45 46 Marshal::GetCollectionItem2(pFields, i, &pField); 47 Marshal::GetIDispatchProperty(pField, DISP_FIELD_CODE, &pCode); 48 Marshal::GetBSTRTypeProperty(pCode, DISP_RANGE_TEXT, &strText); 49 Marshal::GetI8TypeProperty(pCode, DISP_RANGE_START, &lStart); 50 Marshal::GetI8TypeProperty(pCode, DISP_RANGE_END, &lEnd); 51 52 wcout << lStart << _T(” “) << lEnd << _T(” “); 53 wcout << wstring(strText) << endl; 54 55 Marshal::GetIDispatchProperty(pField, DISP_FIELD_RANGE, &pResult); 56 Marshal::PutBSTRTypeProperty(pResult, DISP_RANGE_TEXT, CComBSTR(_T(“hello, world”))); 57 } 58 59 CComPtr<IPersistFile> ppfile; 60 61 hr = pole.QueryInterface<IPersistFile>(&ppfile); 62 hr = ppfile->Save(pwszFile, TRUE); 63 64 wcout << _T(“保存成功”) << endl; 65 66 ::CoUninitialize(); 67 68 getchar(); 69 70 return 0;
测试环境1:Windows Server 2008 R2 64位 + WPS Office 2009专业版
测试结果:一个有11个文本域的文档只替换了6个
测试环境2:Windows Server 2008 32位 + Microsoft Office 2007
测试结果:一个有11个文本域的文档全部替换成功
测试环境3:Windows 7 64位 + Microsoft Office 2010
测试结果:一个有11个文本域的文档全部替换成功
测试环境4:Windows XP 32位 + WPS Office 2009专业版
测试结果:一个有11个文本域的文档只替换了6个
之前金山研发人员确认用WORD的方式没有问题,但多次测试结果表明WORD的文本域替换在WPS中无法完全奏效。WPS需要在设置Result.Text属性前,调用Collapse函数才可以完成替换:pResult.Invoke0(DISP_RANGE_COLLAPSE);
转载于:https://www.cnblogs.com/junchu25/archive/2012/08/10/2631154.html
WPS文本域替换不完全的问题相关推荐
- Pdf文本域替换,iText替换pdf文本域
替换pdf字段主要工具 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf& ...
- php替换文本域中的换行符,文本域中换行符的替换示例
说明:代码在实际项目中测试通过,我已经省去些不重要的,大家可以重点看颜色标记的部分 前戏: 问:为什么做这个呢?? 答:项目中有个将录入的文本域文字保存到数据库中.'查看时'从数据库获取相应数据,显示 ...
- html文本框回车符换行符,文本域中换行符的替换示例
说明:代码在实际项目中测试通过,我已经省去些不重要的,大家可以重点看颜色标记的部分 前戏: 问:为什么做这个呢?? 答:项目中有个将录入的文本域文字保存到数据库中.'查看时'从数据库获取相应数据,显示 ...
- WPS 代码域 修改默认代码域 使目录页码样式和页脚样式不同。
需求:有需要不同样式的情况,所以针对这样去更改. 目录 切换代码域 替换页码格式 大小写域开关 数字格式开关 字符格式和以前用的格式 再次切换代码域 避免整个目录更新 切换代码域 在Windows中, ...
- 1.2 文本域(含可编辑表格实现)
1.2 文本域 1.2.1 基本形制 <textarea rows="3" cols="40">Comments</textarea> ...
- 文本批量替换的正则表达式
1.去掉第三世第十三世之类的前缀: ^(第)(\w{1,})(世)($|\W|\s) 2.去掉行首名字加公的"公"字 ^(\w)(公,) 3.去掉某某公之子的"公&quo ...
- 文本域多行文本回显换行问题
文本域回显换行问题 先具体描述下问题: 管理后台文本域添加内容中带有换行,但未处理数据,传入后台保存到数据库,在展示页面需要回显,如果直接用此字段的话,并没有原先的换行样式 (1)下图为存数据时 (2 ...
- JAVA 使用Itext模板生成pdf,解决图片插入,文本域超出字体缩放,半自动换行
1.前言 前一段时间遇到一个制作Pdf的业务,自己下来摸索了一下,基本上解决.将其中遇到的几个问题及解决方法做以记录,仅供大家参考. 首先在这里对于刚接触该类型业务的同学说明下,ItexPdf支持使用 ...
- WPS表格查找替换技巧:让你的工作效率翻倍
WPS表格中查找和替换是最基础的操作,看似简单,但是还有很多人在工作中不会熟练使用,其实掌握一些小技巧可以快速提高工作效率,本节课就来介绍几种比较有效的"查找和替换技巧". 本节课 ...
最新文章
- f-free 查看系统中空闲和使用的内存
- Visual Studio Extensions for SharePoint v1.1
- BI工具和数据中台有什么区别?数据中台初探
- html正则判断全数字,javascript如何判断是不是数字?
- python wms_webGIS实践:4_2_python django整合geoserver wms服务
- 第二轮冲次会议第三次
- 《零基础入门学习Python》学习过程笔记【016列表,元组,字符串的转化及共用技巧】...
- json和ajax使用
- 如何解决卸载McAfee时出现“处于托管模式时无法删除”问题(转)
- 微信小程序轮播图调用接口
- 毕设全记录——探索 JavaBDD
- 基于CCII+的电流模式二阶带通滤波器仿真
- 虚拟签到拍照打卡技巧,超实在的教程
- redis进阶之bigkey和hotkey
- 论文阅读:Gibberish, Assistant, or Master? Using Tweets Linking to News for Extractive Single-Document Su
- python helper函数_使函数定义以python文件顺序独立
- 钻石DIAMOND一词来源于古法文DIAMAUND钻石
- windows环境elasticsearch设置登录用户名、密码
- 用Python并行处理大文件,看这篇就够了!
- 项目管理软件Microsoft Project 2019和 Visio 2019下载