前段时间用户反馈我们的一个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文本域替换不完全的问题相关推荐

  1. Pdf文本域替换,iText替换pdf文本域

    替换pdf字段主要工具 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf& ...

  2. php替换文本域中的换行符,文本域中换行符的替换示例

    说明:代码在实际项目中测试通过,我已经省去些不重要的,大家可以重点看颜色标记的部分 前戏: 问:为什么做这个呢?? 答:项目中有个将录入的文本域文字保存到数据库中.'查看时'从数据库获取相应数据,显示 ...

  3. html文本框回车符换行符,文本域中换行符的替换示例

    说明:代码在实际项目中测试通过,我已经省去些不重要的,大家可以重点看颜色标记的部分 前戏: 问:为什么做这个呢?? 答:项目中有个将录入的文本域文字保存到数据库中.'查看时'从数据库获取相应数据,显示 ...

  4. WPS 代码域 修改默认代码域 使目录页码样式和页脚样式不同。

    需求:有需要不同样式的情况,所以针对这样去更改. 目录 切换代码域 替换页码格式 大小写域开关 数字格式开关 字符格式和以前用的格式 再次切换代码域 避免整个目录更新 切换代码域 在Windows中, ...

  5. 1.2 文本域(含可编辑表格实现)

    1.2 文本域 1.2.1 基本形制 <textarea rows="3" cols="40">Comments</textarea> ...

  6. 文本批量替换的正则表达式

    1.去掉第三世第十三世之类的前缀: ^(第)(\w{1,})(世)($|\W|\s) 2.去掉行首名字加公的"公"字 ^(\w)(公,) 3.去掉某某公之子的"公&quo ...

  7. 文本域多行文本回显换行问题

    文本域回显换行问题 先具体描述下问题: 管理后台文本域添加内容中带有换行,但未处理数据,传入后台保存到数据库,在展示页面需要回显,如果直接用此字段的话,并没有原先的换行样式 (1)下图为存数据时 (2 ...

  8. JAVA 使用Itext模板生成pdf,解决图片插入,文本域超出字体缩放,半自动换行

    1.前言 前一段时间遇到一个制作Pdf的业务,自己下来摸索了一下,基本上解决.将其中遇到的几个问题及解决方法做以记录,仅供大家参考. 首先在这里对于刚接触该类型业务的同学说明下,ItexPdf支持使用 ...

  9. WPS表格查找替换技巧:让你的工作效率翻倍

    WPS表格中查找和替换是最基础的操作,看似简单,但是还有很多人在工作中不会熟练使用,其实掌握一些小技巧可以快速提高工作效率,本节课就来介绍几种比较有效的"查找和替换技巧". 本节课 ...

最新文章

  1. f-free 查看系统中空闲和使用的内存
  2. Visual Studio Extensions for SharePoint v1.1
  3. BI工具和数据中台有什么区别?数据中台初探
  4. html正则判断全数字,javascript如何判断是不是数字?
  5. python wms_webGIS实践:4_2_python django整合geoserver wms服务
  6. 第二轮冲次会议第三次
  7. 《零基础入门学习Python》学习过程笔记【016列表,元组,字符串的转化及共用技巧】...
  8. json和ajax使用
  9. 如何解决卸载McAfee时出现“处于托管模式时无法删除”问题(转)
  10. 微信小程序轮播图调用接口
  11. 毕设全记录——探索 JavaBDD
  12. 基于CCII+的电流模式二阶带通滤波器仿真
  13. 虚拟签到拍照打卡技巧,超实在的教程
  14. redis进阶之bigkey和hotkey
  15. 论文阅读:Gibberish, Assistant, or Master? Using Tweets Linking to News for Extractive Single-Document Su
  16. python helper函数_使函数定义以python文件顺序独立
  17. 钻石DIAMOND一词来源于古法文DIAMAUND钻石
  18. windows环境elasticsearch设置登录用户名、密码
  19. 用Python并行处理大文件,看这篇就够了!
  20. 项目管理软件Microsoft Project 2019和 Visio 2019下载

热门文章

  1. mongodb 3.2性能测试
  2. 简单封装 HTTP 请求
  3. ReactJS学习笔记——npm、JSX、webpack
  4. [HTML/CSS]margin属性用法
  5. android获取string.xml的值(转)
  6. 从闲扯开始我的技术博客吧
  7. autofac文档:服务类型,名称和键
  8. 宅男程序员给老婆的计算机课程之9:数据模型
  9. Activity的状态保存
  10. salt-ssh 安装salt-minion 笔记