导出目录结构
如果说统计文档页数是文档统计操作中最常用的操作,那么导出文档目录结构就是在文档导出操作中最常用的操作,通过TablesOfContents类的Add方法可以导出文档的目录结构,Add方法的语法如下: LPDISPATCH TablesOfContents::Add( 参数说明如表1所示。 表1 Add方法的参数说明表
下面通过实例来看一下,如何导出Word文档的目录结构,步骤如下: (1)创建一个基于对话框的应用程序,设置对话框标题为“导出Word文档目录结构”。 (2)向对话框中添加一个静态控件、一个编辑框控件和一个按钮控件。界面布局如图1所示。 图1 界面设计 (3)在应用程序类(CDirectoryOutApp)的InitInstance函数中初始化COM环境,代码如下。 ::CoInitialize(NULL); (4)按<Ctrl+W>组合键打开类向导,向工程中添加_Application类、Documents类和_Document类。并为控件关联变量,如图2所示。 图2 类向导 (5)在CCountSpaceDlg类中应用需要使用的头文件,代码如下。 #include "msword9.h" #include "atlbase.h" #include <comdef.h> (6)处理“选择目录”按钮的单击事件,在该事件的处理函数中,通过文件打开对话框获得选择的Word文档路径,并将打开文档,计算空格数量,代码如下。 void CDirectoryOutDlg::OnButout() { CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "All Files(*.doc)|*.doc||",AfxGetMainWnd()); //构造文件打开对话框 CString strPath; //声明变量 if (dlg.DoModal() == IDOK) //判断是否按下"打开"按钮 { strPath = dlg.GetPathName(); //获得文件路径 m_Path.SetWindowText(strPath); //显示文件路径 _Application app; Documents docs,ndocs; _Document doc,ndoc; Range range,nrange; Selection sel,nsel; TablesOfContents tocs; CComVariant a (_T(strPath)),b(false),c(0),d(true),e(_T("")); //初始化连接 app.CreateDispatch("word.Application"); docs.AttachDispatch(app.GetDocuments()); doc.AttachDispatch(docs.Add(&a,&b,&c,&d)); sel.AttachDispatch(app.GetSelection()); range.AttachDispatch(sel.GetRange()); tocs.AttachDispatch(doc.GetTablesOfContents()); tocs.Add(range,&_variant_t(true),&_variant_t((long)1),&_variant_t((long)2) ,&_variant_t(false),&_variant_t(""),&_variant_t(true),&_variant_t(true) ,&_variant_t(""),&_variant_t(false),&_variant_t(false)); //导出目录 Paragraphs pgraphs; pgraphs.AttachDispatch(doc.GetParagraphs()); CString szText = ""; long pgraphCount = pgraphs.GetCount(); //段落数 for (long i = 1; i<= pgraphCount; i++) { Paragraph pgraph; pgraph.AttachDispatch(pgraphs.Item(i)); Range pragRange; pragRange.AttachDispatch(pgraph.GetRange()); //获得选区 _ParagraphFormat format; format.AttachDispatch(pragRange.GetParagraphFormat()); CComVariant value; Style style; value = format.GetStyle(); //获得格式 style.AttachDispatch(value.pdispVal); CString szHeaderName = style.GetNameLocal(); char szName[10] = {0}; strncpy(szName, szHeaderName.GetBuffer(0), 6); szHeaderName.ReleaseBuffer(0); if (strcmp(szName, "目录 1") != 0 && strcmp(szName, "目录 2") != 0 && strcmp(szName, "目录 3") != 0) //如果是目录格式 { sel.SetRange(0,i); range.AttachDispatch(sel.GetRange()); //获得区域 CString str = range.GetText(); //获得文本 range.Cut(); //剪切 nrange.AttachDispatch(doc.GetContent()); //设置选区 nrange.Paste(); //粘贴 i = pgraphCount + 1; } pgraph.ReleaseDispatch(); pragRange.ReleaseDispatch(); format.ReleaseDispatch(); style.ReleaseDispatch(); } app.SetVisible(true); range.ReleaseDispatch(); nrange.ReleaseDispatch(); doc.ReleaseDispatch(); docs.ReleaseDispatch(); app.ReleaseDispatch(); } } 运行程序,效果如图3所示。 图3 运行结果 导出效果如图4所示。 图4 导出目录结构
|