VC++ 生成WORD 有300个学生资料,存放在ACCESS表格中.每个学生都要生成一页WORD文件(如图),其中红色部分是从ACCESS中提取的数据.如果将图中WORD文档当做模板,怎样实现->先将模板拷贝到下一页(即为填写下一个学生做准备),然后用数据替换红色标记的部分,依次循环300个学生.都用到什么函数?比如说:m_Sel.MoveXXX(???);希望得到尽量全一些的函数. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在www.vckbase.com 有一些关于office 操作的文章, 应该对你有用 COM组件调用和OLE调用 看过了,都是转载的,也就几篇,而且是VC++操作简单的WORD表格.我要求的这种比较复杂 一般途径是操作office自动化。不过还有个简单的方式,可以完全脱离office。 就是利用最新版office提供的开放标准格式;或者旧版本的支持保存为xml格式的也行。先保存一个模板。由于是xml格式,直接按照文本读取进来即可。然后在每个做好标记的地方直接字符串替换。 我做的这个东西要大概300多页,而空白的文档模板只有一页,我想是不是应该先把第一页的空文档拷贝到第2页,然后往第1页里填写数据,依次类推,而我现在做了一大半了,已经用了这样的方式. Documents oDocs;_Document oDoc;oDocs=oWordApp.GetDocuments();oDoc=oDocs.Add(vOpt,vOpt,vOpt,vOpt); 这种方式一般move到某个位子,在插入是比较繁琐的。而且一旦模板有个小小的文字变更就需要改代码。稍微改进的方式应该是 search and replace。把每个需要输入的地方预先天上关键字, 如 $%UserName%$, $%UserID%$, ......具体的形式可以自己发挥想象力定义,保证唯一就可以了。 然后直接全文查找替换。至于添加页,方法太多了。也可以每页一个文档,最后在利用words的合并文档的功能合成一个。找个自己喜欢的方式就可以。 这个思路挺好的,除了xml,word还可以存为htm格式的。 不用vc++直接用Access和Word的邮件合并功能很方便就可以实现了。能不能用VC操作Word的邮件合并功能呢?? 我只是能给你一个建议,我做过类似的项目,我是这样做的:在一个目录下面存放word的模板(需要填数据(表外的)的部分用的是Label标签);在程序中打开这个word模板(也就是说载入到了内存当中)然后用Selection的WholeStory()选中模板的所有内容在用它的Copy()函数拷贝由于第一页的已经打开所以你只要用 _Document m_doc //然后分成两部分 1。表外的部分 InlineShapes m_InlineShapes=m_Doc.GetInlineShapes(); int inlinecount=(m_InlineShapes.GetCount());//得到标签的个数 for(i=1;i<=inlinecount;i++) { InlineShape m_InlineShape=m_InlineShapes.Item(1);//由于m_InlineShapes.GetCount()随着赋值而变化,所以每次只给第一个item赋值 m_InlineShape.Select(); m_Sel.TypeText(str);//为标签赋值 } 2。表中的部分 Tables m_tables;Table m_table;m_Tables=m_Doc.GetTables(); m_Table=m_Tables.Item(tableNum); (tablenum就是表的个数的编号,你的是一页一个表 ) Celll m_Cell=m_Table.Cell(m,i); (m,i就是你要填的表中数据所在表格的行列下标好象是从1开始) m_Cell.Select(); m_Sel.TypeText(tableData[i-1]);//为表格赋值当然还有 MoveDown,MoveRight函数了,在表格里面移动要用到的,用法你可以查查资料; 操作完一页后用: m_Sel.EndKey(COleVariant((short)6),COleVariant((short)0));//将光标移动到最后一页(wdStory,wdMove) m_Sel.InsertBreak(COleVariant((long)7));//插入分页符(wdPageBreak) 从第二页开始用Selection的Paste()粘贴表格模板,再按照上面的1。2。进行操作,就这样一直重复下去;等所有的数据操作完了将word保存到一个目录下,打印完了再删除这个临时的word就可以了 不过你页数挺多的,会很慢的,呵呵 最后说明下,数据的读取你可以一次都读出来存放,这个就根据你的想法了,怎么读随你了这只是我的建议,我做的时候大致是这样的,我只能告诉你这些了,其它的我也就不是很精通了,呵呵 这是最为正确的方式我们的所有报表均采用此方式产生只不过我们没有使用开放标准格式或xml, 而是使用rtf制作一个rtf模版, 直接文本替换内容一个复杂报表只需半小时就可以完成 串口OnComm事件可否放在其他.cpp文件里 一个关于虚函数表的问题! 一个网络方面的问题 各位兄弟姐妹过年好!请问有谁知道如何用"空手机号"给对方发短信? 向DLL中的函数传入CString参数的问题! 菜鸟求一简单代码,让初学者参考! 小弟正要学网络编程,前高手指点几部好书 如果将两个CTime表示的时间相减后存入一个CString中? 請給個最簡單的發送email的源碼 [求助]谁会sql server2000帮帮我,好吗? 如何将一个类封装在一个DLL中,使用这类时,如何导出这个类 ? cnzdgs 请进来下,有问题!
Documents oDocs;
_Document oDoc;
oDocs=oWordApp.GetDocuments();
oDoc=oDocs.Add(vOpt,vOpt,vOpt,vOpt);
这个思路挺好的,除了xml,word还可以存为htm格式的。
直接用Access和Word的邮件合并功能很方便就可以实现了。
能不能用VC操作Word的邮件合并功能呢??
_Document m_doc
//然后分成两部分 1。表外的部分
InlineShapes m_InlineShapes=m_Doc.GetInlineShapes();
int inlinecount=(m_InlineShapes.GetCount());//得到标签的个数
for(i=1;i<=inlinecount;i++)
{
InlineShape m_InlineShape=m_InlineShapes.Item(1);//由于m_InlineShapes.GetCount()随着赋值而变化,所以每次只给第一个item赋值 m_InlineShape.Select();
m_Sel.TypeText(str);//为标签赋值
} 2。表中的部分
Tables m_tables;
Table m_table;m_Tables=m_Doc.GetTables();
m_Table=m_Tables.Item(tableNum); (tablenum就是表的个数的编号,你的是一页一个表 )
Celll m_Cell=m_Table.Cell(m,i); (m,i就是你要填的表中数据所在表格的行列下标好象是从1开始)
m_Cell.Select();
m_Sel.TypeText(tableData[i-1]);//为表格赋值
当然还有 MoveDown,MoveRight函数了,在表格里面移动要用到的,用法你可以查查资料;
操作完一页后用: m_Sel.EndKey(COleVariant((short)6),COleVariant((short)0));//将光标移动到最后一页(wdStory,wdMove) m_Sel.InsertBreak(COleVariant((long)7));//插入分页符(wdPageBreak)
从第二页开始用Selection的Paste()粘贴表格模板,再按照上面的1。2。进行操作,就这样一直重复下去;
等所有的数据操作完了将word保存到一个目录下,打印完了再删除这个临时的word就可以了 不过你页数挺多的,会很慢的,呵呵 最后说明下,数据的读取你可以一次都读出来存放,这个就根据你的想法了,怎么读随你了这只是我的建议,我做的时候大致是这样的,我只能告诉你这些了,其它的我也就不是很精通了,呵呵
这是最为正确的方式
我们的所有报表均采用此方式产生
只不过我们没有使用开放标准格式或xml, 而是使用rtf制作一个rtf模版, 直接文本替换内容
一个复杂报表只需半小时就可以完成