自动抽取的结果是到三级标题为止,这样远远不能满足对文章内容了查询了解。
查看了一下代码:
/////////////////处理文档////////////////////
//m_Path.SetWindowText(strPath); //显示文件路径
bool bReleased=false;
_Application app;
Documents docs,ndocs;
_Document doc,ndoc;//注意这里1
Range range,nrange;
Selection sel,nsel;
TablesOfContents tocs;//注意这里2
CString str ;
CComVariant a (_T(strFilePath)),b(false),c(0),d(true),e(_T(""));
try
{
// CComVariant a (_T("d:\\test.docx")),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());//注意这里3
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));//注意这里4
Paragraphs pgraphs;
pgraphs.AttachDispatch(doc.GetParagraphs());
CString szText = "";
long pgraphCount = pgraphs.GetCount();
str = strFilePath;
nFilesCnt++;
CString strNum;
strNum.Format("%d",nFilesCnt);
str= "\n\n\n\n=========== Files No : "+strNum+" ==========================================\n"+str;
MyTableFile.Write(str,::strlen(str)+1);
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());
str = range.GetText();
str += "\n";
MyTableFile.Write(str,::strlen(str)+1);
range.Cut();
nrange.AttachDispatch(doc.GetContent());
nrange.Paste();
i = pgraphCount + 1;
}
pgraph.ReleaseDispatch();
pragRange.ReleaseDispatch();
format.ReleaseDispatch();
style.ReleaseDispatch();
}
app.SetVisible(false);
app.Quit(&b,&c,&c);
range.ReleaseDispatch();
nrange.ReleaseDispatch();
doc.ReleaseDispatch();
docs.ReleaseDispatch();
app.ReleaseDispatch();
bReleased = true;
}
catch(...)
{
int iii=0;
if(!bReleased)
{
app.SetVisible(false);
app.Quit(&b,&c,&c);
range.ReleaseDispatch();
nrange.ReleaseDispatch();
doc.ReleaseDispatch();
docs.ReleaseDispatch();
app.ReleaseDispatch();
bReleased = true;
}
}
////////////////////处理文档End//////////////////////////
看代码当中注明的“//注意这里i”,关键点就是对对象_Document的操作:
单文档对象_Document,目录集合对象TablesOfContents,目录对象TableOfContents及Range对象。操作流程如下:
使用_Document:: GetTablesOfContents返回TablesOfContents对象。
TablesOfContents::Add返回TableOfContents对象。
LPDISPATCH TablesOfContents::Add(LPDISPATCH Range, VARIANT* UseHeadingStyles, VARIANT* UpperHeadingLevel, VARIANT* LowerHeadingLevel, VARIANT* UseFields, VARIANT* TableID, VARIANT* RightAlignPageNumbers, VARIANT* IncludePageNumbers, VARIANT* AddedStyles, VARIANT* UseHyperlinks, VARIANT* HidePageNumbersInWeb, VARIANT* UseOutlineLevels)
参数说明如下:
Range 插入目录的Range对象。通常目录是文档生成结束时进行插入的,因此必须事先指定插入目录的区域Range对象。
UseHeadingStyles 使用制表符前导符,设为TRUE
UpperHeadingLevel 顶级目录,通常设为1
LowerHeadingLevel 底级目录,根据需要赋值
UseFields 使用区域,设为FALSE
TableID 目录索引,以1起始
RightAlignPageNumbers 页码右对齐,设为TRUE
IncludePageNumbers 包含页码,
AddedStyles 增加类型,设为NULL
UseHyperlinks 使用超链接,设为TRUE
HidePageNumbersInWeb Web页中隐藏页码,设为TRUE
UseOutlineLevels 使用大纲级别,设为TRUE
使用TableOfContents:: GetRange获取区域对象,进行其他例如文字大小控制等操作。
TableOfContents:: UpdatePageNumbers更新页码。
可见,重点就是修改
“UpperHeadingLevel 顶级目录,通常设为1
LowerHeadingLevel 底级目录,根据需要赋值”
好吧,修改一下,将LowerHeadingLevel修改成6,好啦,结果很美好!