有300个学生资料,存放在ACCESS表格中.
每个学生都要生成一页WORD文件(如图),其中红色部分是从ACCESS中提取的数据.
如果将图中WORD文档当做模板,怎样实现->先将模板拷贝到下一页(即为填写下一个学生做准备),然后用数据替换红色标记的部分,依次循环300个学生.
都用到什么函数?
比如说:
m_Sel.MoveXXX(???);
希望得到尽量全一些的函数.

解决方案 »

  1.   

    在www.vckbase.com 有一些关于office 操作的文章, 应该对你有用 COM组件调用和OLE调用
      

  2.   

    看过了,都是转载的,也就几篇,而且是VC++操作简单的WORD表格.我要求的这种比较复杂
      

  3.   

    一般途径是操作office自动化。不过还有个简单的方式,可以完全脱离office。 就是利用最新版office提供的开放标准格式;或者旧版本的支持保存为xml格式的也行。先保存一个模板。由于是xml格式,直接按照文本读取进来即可。然后在每个做好标记的地方直接字符串替换。
      

  4.   

    我做的这个东西要大概300多页,而空白的文档模板只有一页,我想是不是应该先把第一页的空文档拷贝到第2页,然后往第1页里填写数据,依次类推,而我现在做了一大半了,已经用了这样的方式.
    Documents oDocs;
    _Document oDoc;
    oDocs=oWordApp.GetDocuments();
    oDoc=oDocs.Add(vOpt,vOpt,vOpt,vOpt);
      

  5.   

    这种方式一般move到某个位子,在插入是比较繁琐的。而且一旦模板有个小小的文字变更就需要改代码。稍微改进的方式应该是 search and replace。把每个需要输入的地方预先天上关键字, 如 $%UserName%$, $%UserID%$, ......具体的形式可以自己发挥想象力定义,保证唯一就可以了。 然后直接全文查找替换。至于添加页,方法太多了。也可以每页一个文档,最后在利用words的合并文档的功能合成一个。找个自己喜欢的方式就可以。
      

  6.   


    这个思路挺好的,除了xml,word还可以存为htm格式的。
      

  7.   

    不用vc++
    直接用Access和Word的邮件合并功能很方便就可以实现了。
    能不能用VC操作Word的邮件合并功能呢??
      

  8.   

    我只是能给你一个建议,我做过类似的项目,我是这样做的:在一个目录下面存放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就可以了 不过你页数挺多的,会很慢的,呵呵 最后说明下,数据的读取你可以一次都读出来存放,这个就根据你的想法了,怎么读随你了这只是我的建议,我做的时候大致是这样的,我只能告诉你这些了,其它的我也就不是很精通了,呵呵 
      

  9.   


    这是最为正确的方式
    我们的所有报表均采用此方式产生
    只不过我们没有使用开放标准格式或xml, 而是使用rtf制作一个rtf模版, 直接文本替换内容
    一个复杂报表只需半小时就可以完成