codeArt

codeArt

c++操作word接口

注意事项:1多用Range,少用Selection,因为Word中,Selection对象只有一个。
【1】开启word
_ApplicationPtr word_app;
HRESULT hr 
= word_app.CreateInstance("Word.Application", NULL); 
【2】新建一个文档
COleVariant vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
DocumentsPtr docs;
_DocumentPtr oDoc;
docs 
= word_app->GetDocuments();
doc 
= docs->Add(vOpt, vOpt, vOpt, vOpt);  
【3】设置文档的页面布局
PageSetupPtr page_setup = doc->GetPageSetup();
page_setup
->PutTopMargin(0);
page_setup
->PutBottomMargin(0);
page_setup
->PutRightMargin(0);
page_setup
->PutLeftMargin(0);
【4】插入文本
SelectionPtr selection;
selection 
= word_app->GetSelection();
_ParagraphFormatPtr parafmt 
= selection->GetParagraphFormat();
parafmt
->PutLineSpacingRule(wdLineSpaceExactly);
parafmt
->PutLineSpacing(50);
_FontPtr font;
font 
= oSel->GetFont();
font
->PutBold(1);
font
->PutColor(wdColorGreen);
font
->PutSize(20);
font
->PutName(_T("宋体"));
selection
->TypeText("ABC");
oSel
->TypeParagraph();
oSel
->TypeText("12345678901234567890");
oSel
->TypeParagraph();
【5】插入文本框
ShapesPtr shapes = doc->GetShapes();
ShapePtr textbox 
=  shapspp->AddTextbox(Office::msoTextOrientationHorizontal, 11100100);
【6】文本框中插入文本
 1ShapesPtr shapes = doc->GetShapes();
 2ShapePtr textbox =  shapspp->AddTextbox(Office::msoTextOrientationHorizontal, 11100100);
 3TextFramePtr textframe = textbox->GetTextFrame();
 4RangePtr range = textframe->GetTextRange();
 5long insert_before_count = range->Characters->GetCount();
 6range->InsertAfter("TEXT");
 7if (insert_before_count != 1)
 8    range->MoveStart(COleVariant((long)Word::wdCharacter), COleVariant(insert_before_count-1));
 9if(range != 0)
10{
11    _FontPtr font = range->GetFont();
12    font->PutBold(isBold);
13    font->PutItalic(isItalic);
14    font->PutColor((Word::WdColor)FontColor());
15    font->PutSize(FontSize);
16    font->PutName(FontType().c_str());
17}
【7】设置文本框的属性
1textbox->GetTextFrame()->PutAutoSize(Office::msoAutoShape);
2textbox->GetTextFrame()->PutMarginBottom(0);
3textbox->GetTextFrame()->PutMarginTop(0);
4textbox->GetTextFrame()->PutMarginLeft(0);
5textbox->GetTextFrame()->PutMarginRight(0);
6textbox->GetLine()->PutVisible(Office::msoFalse);
7textbox->GetFill()->PutTransparency(1);
【8】插入图片,这里需要注意,必须得先用InlineShape,这样可以把图片插入到指定的页中,不然,所有的图片只在第一页。
 1ShapesPtr shapes = m_WordDoc->GetShapes();
 2InlineShapesPtr inline_shapes = selection_doc->GetRange()->GetInlineShapes();
 3InlineShapePtr inline_shape = inline_shapes->AddPicture(“picture_path”, COleVariant((long)0), COleVariant((long)1));
 4ShapePtr shape = inline_shape->ConvertToShape();
 5shape->PutWidth(width);
 6shape->PutHeight(hehight());
 7shape->PutTop(Y);
 8shape->PutLeft(X);
 9if(shape->GetType() == Office::msoPicture)
10{
11    Word::WrapFormatPtr wrapp = shape->GetWrapFormat();
12    wrapp->PutType(Word::wdWrapBehind);
13}

14
【9】插入直线
1ShapesPtr shapes = doc->GetShapes();
2Word::ShapePtr line = shapes->AddLine(x1,y1, x2,y2);
3if (line->GetType() == Office::msoLine)
4{
5    Word::LineFormatPtr LineFmt = line->GetLine();
6    LineFmt->PutWeight(lr->weight_);
7}
【10】插入分隔符
selection->InsertBreak(COleVariant((long)wdColumnBreak));
selection
->InsertBreak(COleVariant((long)wdSectionBreakContinuous));
selection
->InsertBreak(COleVariant((long)wdPageBreak));

【11】设置栏目个数和栏目的宽度
这里一定要注意add函数的逻辑
1SectionsPtr word_sections = doc->GetSections();
2long num = word_sections->GetCount();
3SectionPtr word_section = word_sections->Item(num-1);
4PageSetupPtr page_setup = word_section->GetPageSetup();
5TextColumnsPtr text_cols = page_setup>GetTextColumns();
6text_cols->PutEvenlySpaced(0);
7text_cols->Add(COleVariant(col_width), COleVariant((long)0), COleVariant((long)false));
【12】插入表格
 1TablesPtr tables = oSel->GetTables();    
 2TablePtr table = tables->Add(oSel->GetRange(), 25);
 3    
 4BordersPtr bords = table->GetBorders();
 5bords->PutOutsideLineStyle(wdLineStyleSingle);
 6bords->PutInsideLineStyle(wdLineStyleSingle);
 7for (int i = 1; i<=2; i++)
 8{
 9    for (int j = 1; j<=5; j++)
10    {
11        table->Cell(i,j)->GetRange()->PutText("20");
12    }

13}

14
15CellPtr cell = table->Cell(1,1);
16cell->Merge(table->Cell(1,2));
【13】保存文档并退出
1COleVariant vTrue((short)TRUE),vFalse((short)FALSE),vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
2_DocumentPtr active_doc; 
3active_doc = word_app->GetActiveDocument();
4active_doc->SaveAs(COleVariant("D:\\doc1.doc"), 
5                   COleVariant((short)0),
6                   vFalse, COleVariant(""), vTrue, COleVariant(""),
7                   vFalse, vFalse, vFalse, vFalse, vFalse);
8word_app->Quit(vOpt, vOpt, vOpt);
在word优秀的构架中还有许许多多的接口,上面只是举例实现一个普通的文档,希望对大家有用。

posted on 2010-08-31 19:35 codeArt 阅读(8905) 评论(4)  编辑 收藏 引用 所属分类: COM

评论

# re: c++操作word接口 2010-10-26 17:51 tch

so good ,3q
  回复  更多评论   

# re: c++操作word接口 2012-02-29 22:25 徐世富

你用的是word哪个版本?生成app后,如果没有装.net还需要哪些dll,如果本身开着一个word,保存的时候会不会出现无法保存的问题,出现rfc服务器错误
希望能发我邮箱543483382@qq.com,谢谢
  回复  更多评论   

# re: c++操作word接口[未登录] 2012-08-07 17:35 刘伟

太好了。多谢博主  回复  更多评论   

# re: c++操作word接口 2014-04-21 17:08 仔仔

vs2010怎么使用能不能提供一下啊!我的邮箱是min0073@163.com  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

文章档案

编程与开源

搜索

最新评论

阅读排行榜

评论排行榜