您的位置:首页 > 编程语言 > C语言/C++

VC++ Word文档 自动化技术

2011-03-17 14:34 288 查看
VC++6.0向Word文件的指定位置上插入一张图片,需要用到nlineShapes类型的AddPicture方法。

在MSDN中,该方法的声明如下:

**************************************************************************

在文档中添加一幅图片。返回一个 Shape 对象,该对象代表图片,并将其添加至 InlineShapes 集合。

expression.AddPicture(FileName, LinkToFile, SaveWithDocument, Range)
expression 必需。该表达式返回一个 InlineShapes 对象。

FileName String 类型,必需。图片的路径和文件名。

LinkToFile Variant 类型,可选。如果为 True,则将图片链接到创建该对象的文件;如果为 False,则将图片作为该文件的独立副本。默认值是 False。

SaveWithDocument Variant 类型,可选。如果为 True,则将链接的图片与文档一起保存。默认值是 False。

Range Variant 类型,可选。图片置于文本中的位置。如果该区域未折叠,那么图片将覆盖此区域,否则插入图片。如果忽略此参数,则自动放置图片

**************************************************************************

根据该说明的定义,第四个参数Range是用来设置图片位于文本中的位置的。因此,我们可以利用该参数向某一指定位置插入图片。具体方法如下:

Selection sel=m_app.GetSelection();//获取文档的selection
InlineShapes inlineshapes = sel.GetInlineShapes();
inlineshapes.AddPicture("D://cjdz.bmp",COleVariant((short)FALSE),COleVariant((short)TRUE),&_variant_t(sel.GetRange()));//添加图片,并制定其位置为当前光标位置
inlineshapes.ReleaseDispatch();
sel.ReleaseDispatch();

注意上面第四个参数的转换方法,用到了_variant_t变量,使用此种方法可以将LPDISPATCH转换成VARIANT*类型

如此就可将图片直接插入到光标当前所在位置

网上关于办公软件自动化的资源较少,特此收集了一篇供大家学习参考。

(1)View.>Class Wizard一>Add Class⋯.>Form a type library.>Word对象库;Word对象库的位置一般在C:/Program Files\Microsoft Office\OFFICEll中,不同版本的Word对象库名称不同.本例用Word 2003为MSWOI①.OLB.
(2)在CSJSMSApp类中的成员函数Initlnstance()中对自动化操作进行初始化;
加入代码::CoInitialize(NULL);
或是if(!MxOleInit())
(
MxMessageBox(”初始化失败”);
return R6江SE;
)此步也可在3.1中的Setp 3中选择Automation而省去.
经过以上操作将在程序中出现许多Word中的类对象,可通过编程控制Word中的类对象实现Word自动化的各种操作.
3.3建立Word自动化应用程序
(1)在CSJSMSView类中声明要用到的类对象和变量,如下面代码(其余的在此处没列出):
——Application App;
Documents oDocs;
——Document oDoc;
Selection osel;
Paragraphs oParas;
Paragraph oPara;
Range oRange;
.—Font oFont;
Fields oFields;
Field oField;
(2)通过建立CSJSMSView类的成员函数OnWordautomation();
Resource.>Menu一>添加菜单项.>修改properties一>通过Class wizard添加函数.
(3)打开Word应用程序,并建立新的空文档;
if(!ApP.CreateDispatch(一T(”Word.Application”))) //启动Ⅵ,ord
{
MxMessageBox(_T(”你居然连0FFICE2003都没有安装!”));
)
else
{
ApP.Setvisible(TRUE); //设置Word为可见
ApP.SetWindowState(1); //设置Word为最大化
)
COleVariant covTrue((short)TRUE);
COleVariant covFalse((short)FAl5E);
COleVariant covOptional((10ng)DISP E—PARAMNOTFOUND,VT-ERROR);
oDocs=npp.GetDocuments();
oDocs.Add(covOptional,covOptional,covOptional,covOptional).
3.4写入内容
(1)标题、段落、字体格式的设置.标题为一单独段落,实现方法是用Selection类中的TypeText()加
载文字内容,用Paragraphs类中的SetAlignment()设置对齐方式,用Font类设置字体名称、大小、加粗、
颜色等属性,如:
oSel.TypeText(”轮式起重机桁架式臂架结构设计说明书”);

oSel.TypeParagraph();//另起一段
oSel.TypeText(”太原科技大学机电学院”);
oSel.TypeParagraph();
oParas=oDoc.GetParagraphs();
oPara=oParas.Item(1);
oPara.SetAlignment(1);
∥设置文本格式:0左对齐,1居中对齐,2右对齐oRange=oPara.GetRange();
oFont=oRange.GetFont();
oFont.SetSize(14);//表示字体的大小
oFont.SetColor(250);∥表示颜色
oFont.SetBold(1);//0表示是不加粗,1表示加粗
oRange.SetFont(oFont);
(2)插入日期和图片并设置图片格式.插入日期可以利用InsertDateTime()函数实现,其具体的时间
格式可以根据要求自行设置;插入图片可用AddPicture()函数,设置图片的大小和位置是通过把嵌入式
图形转换为Shape对象,利用Shape类对象的方法实现:
COleVariant vTime(”yyyy-肚dd:dddd”);∥时间格式可调整
oSel.InsertDateTime(vTime,covFalse,covOptional,covOptional,covOptional);∥插入当前时间
InlineShapes inlineshapes;
oRange=oSel.GetRange();
inlineshapes=orange.GetlnlineShapes();
COleVariant vRange;
vRange.vt=v,r-DISPATCH;
vRange.pdispVal=orange.rn lpDispatch;
inlineshapes.AddPicture(”D:\VC\Picture.bmp”,&covFalse,&covTrue,&vRange);
inlineshapes=oDoc.GetlnlineShapes();
inlineshape=inlineshapes.Item(1);
Shape oshapel=inlineshape.ConvertToShape();//嵌入式图形转换为Shape对象
oshapel.SetWidth(165);//设置宽度
oshapel.SetHeight(165);∥设置高度
oshapel.ConvertTolnlineShape();
(3)插入表格并对表格进行操作.对表格操作包括插入几行几列的表格,合并单元格,设置单元格的
属性与填写表格.表格也属于段落中的一部分,故对其调整左右居中和段落居中相同,也可以单独对其中
的某一行、某一列和某一单元格的属性进行设置:
oRange=oSel.GetRange();
Tables tabs=oDoc.GetTables();
Table tab=tabs.Add(oRange,9,6,&covFalse,&covTrue);//插入9行6列的表格
borders 5 tab.GetBorders();
borders.SetEnable(1);//显示表框
oRange=tab.GetRange();
oCells=oRange.GetCells();
oCells.SetVerticalAlignment(1);//表格中的文字上下居中
oRows=tab.GetRows();
oRow=oRows.Item(1);
oRange=oRow.GetRange():
oCells=oRange.Geteells();

oCells.Merge();∥把第一行所有的列合为一列
oCell=tab.Cell(2,1);∥合并第一列中的第二行与第三行
oCell.Merge(tab.Cell(3,1));
tabs=oDoc.GetTables();∥填写表格内容
tab=tabs.Item(1);
oCell=tab.Cell(1,1);
oRange=oCell.Get_Range();
oRange.InsertAfter(”原始参数”);
(4)光标的移动方式.在产品设计说明书编写过程中,通过Selection类对象的方法对光标进行上下,
左右等移动,实现对光标的定位功能:
oSel.MoveRight(C0leVariant((short)1),COleVariant((short)1),COleVariant((short)0)); ∥向右
移动鼠标到下一个字符
oSel.MoveDown(COleVariant((short)5),covOptional,covOptional);∥向下移动鼠标到下一行
COleVariant vUnit((short)5); ∥光标移动方式为行
COleVariant vCount((short)3);
oSel.Move(&vUnit,&vCount); ∥移动3行
COleVarlant vEnd((short)5);
oSel.EndKey(&vEnd,&vopt); ∥将光标移动到行尾
(5)插入特殊符号与公式.在Word中运用公式编辑器插入特殊符号和公式,而公式编辑器不是基于
COM技术,不能被Visual C++中直接调用.本文通过调用Word中的域,其中用得最多的“EQ域”,根据要
求选用域开关,实现特殊符号与公式录入(常用的“EQ域”开关为分数:\f(,);上标或下标:ks(,);数组开
关:\a();根号:\r(,);积分:hi(,,);列表:\l()).
oFields=oSel.GetFields();
oSel.InsertSymbol(945,oFontName,covTrue,covOptional);∥插人特殊符号口
Text=”EQ ks\d04(q)”;
oFields.Add(oRange,covOptional,Text,covFalse);∥插入下标g
Text=”EQ L=\f(A,cos0)=\f(14,coM5。)≈19.8m“;
。Fields.Add(。Range covOpti。naI,Text,coyFalse);∥插入公式L=三笔=鬲£面≈19.8 m(L为臂
架长度;A为臂架端点到货物中心线的距离;0为臂架仰角)
Text=”EQ盯=\f(N\s\d02(1),4A\s\d02(j))+\f(IVlX,s\d02(x(1/2)),2hA\s\d02(j))+\f(M\s\
d02(y(1/2)),2bA\s\d02(j))”
oFields.妣Range,covOptional,Text,covFalse);∥插入公式盯=若+訾+訾(曲臂架
中央截面强度;N,为臂架中点轴力;M砌/z)为臂架中点X平面总弯矩;My(1/z,臂架中点y平面总弯矩5
Af为主肢净截面面积;h为四主肢形成矩形的宽度,b为四主肢形成矩形的长度)
(6)插人分页符、设置页眉页脚、设置页边距:
oSel.InsertBreak(covOptional);∥插入分页符
Window oWind;//以下代码是设置页眉页脚
oWind=oDoc.GetActiveWindow();
Pane oPane;
oPane=oWind.GetActivePane();
oView=oPane.GetView();
oView.SetSeekView(9); ∥设置页眉
oSel.TypeText(”太原科技大学”);

oView.SetSeekView(10); ∥设置页脚
oSel.TypeText(”轮式起重机产品设计说明书”);
oView.SetSeekView(0); //关闭页眉页脚
oDoc=App.GetActiveDocument(); ∥以下代码是设置页边距
PageSetup oPageSetup=oDoc.GetPageSetup();
oPageSetup.SetTopMargin((const)56.7);
oPageSetup.SetBottomMargin((const)56.7);
oPageSetup.SetLeftMargin((const)56.7);
oPageSetup.SetRightMargin((const)56.7);
(7)文件的保存.当程序自动执行完成后,采用文件另存的方式函数为oDoc.SaveAs(),其参数较多.
但只需提供第一个参数——保存文件的路径与名称,其他参数可以缺省:
C01eVariant filenamepath(”D:\vc\轮式起重机桁架式臂架结构设计说明书.doc”,VLBSTR);
oDoc.SaveAs(filenamepath,covOptional,⋯);
(8)程序的打印与关闭.当需要打印是可以用ODoc.PrintOut()函数,其参数可以缺省.关闭时首先关
闭文档然后关闭、Ⅳord应用程序:
ODoc.PrintOut();
ODoc.Close(covFalse,covOptional,covOptional);
App.Quit(covFa lse,covOptional,covTrue);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: