批量生成word文档TABLE列表时自动跳过密码输入

批量生成word文档TABLE列表时自动跳过密码输入

背景介绍

在进行word文档Table目录批量自动生成过程中,有个最讨厌的环节就是有的文档加密,这个时候通常就会跳出一个对话框让你输入密码,但是这个就让整个目录生成流程编程了半自动的,对于大量的文档目录生成过程,这简直是灾难性的。现在需要自动识别文档是否加密,对于加密的文档直接跳过就好了。于是搜索了网上的一些材料,加上自己的实验得到如下的解决方法:

总体思路:

1.设定随意性的word文档开启密码;
2.用Documents类的open方法打开word文档(之前是使用add方法打开的,可是这样就不能有下面的密码错输触发机制),由于使用了随意性的密码(比如“空格”),所以会导致文档打开失败消息发出;
3.文档打开失败的消息被try{}捕获,交给catch{}处理,处理就是文档关闭、指针释放之类的操作,自动进行下一个文档处理;

具体步骤的关键代码如下:

1.参数定义:

COleVariant covTrue((short)TRUE),
                covFalse((short)FALSE),
                covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);	
		COleVariant password(" ");
'''
特别注意password的定义,初始化是一个空格;
2.用Documents类的open方法打开word文档
'''
doc.AttachDispatch(docs.Open(
                               COleVariant(strFilePath,VT_BSTR),
                               covFalse,    // Confirm Conversion.
                               covFalse,    // ReadOnly.
                               covFalse,    // AddToRecentFiles.
                               password, // PasswordDocument.
                               covOptional, // PasswordTemplate.
                               covFalse,    // Revert.
                               password, // WritePasswordDocument.
                               covOptional, // WritePasswordTemplate.
                               covOptional, // Format. // Last argument for Word 97
                                  covOptional, // Encoding // New for Word 2000/2002
                                  covTrue
                                  )  // Close Open parameters
                                  ); // Close AttachDispatch(?)

可见在“PasswordDocument”和“WritePasswordDocument”这两个参数位置使用了参数password。
3.消息处理
当打开一个加密文档之后,会被try{}捕获密码错误异常(除非恰好这个文档的密码就是空格),然后提交给catch{}处理,这个就不多说了,在程序里面都有,下面把程序的代码一段段粘贴上来。

(1)首先建立一个对话框,关于对话框内的内容就不多说了:
对话框,选择和输入待批量处理的文件夹和生成索引的文件
(2)新建一个对话框按钮“制作索引”,表示开始进行Table抽取,按钮双击后代码:








void CMyDlgExDlg::OnBnClickedMakeTable()
{
	// TODO: 在此添加控件通知处理程序代码
	
	GetDlgItem(IDC_TABLE_PATH)->GetWindowText(StrTableFilePath);
	if(StrTableFilePath == "")
	{
		MessageBox("请输入索引文件路径");
		return;
	}
	else
	{
		if(!MyTableFile.Open(StrTableFilePath,CFile::modeCreate|CFile::modeReadWrite,NULL))
		{
			MessageBox("打开文件操作失败","信息提示",MB_OK);
		}
		else
		{
			//MessageBox(StrTableFilePath+"文件创建成功","信息提示",MB_OK);
			FindFile(StrFolder);
			m_bTableStop=FALSE;			
			MessageBox("目录索引生成完毕","信息提示",MB_OK);
			MyTableFile.Close();
		}
				 
	   }
	   

		

	}


(3)FindFile()函数

void CMyDlgExDlg::FindFile(CString MyPath)
{//查找文件
	CString MyTempPath;
	if(MyPath.Right(1)!="\\")
		MyTempPath.Format("%s\\*.*",MyPath);
	else
		MyTempPath.Format("%s*.*",MyPath);
	CFileFind MyFindFile;
	BOOL bMyFind=MyFindFile.FindFile(MyTempPath);
	while(bMyFind)
	{
		bMyFind=MyFindFile.FindNextFile();
		CString cstemp=MyFindFile.GetFileName();
		if(!MyFindFile.IsDots())
		{
			if(MyFindFile.IsDirectory())
				FindFile(MyFindFile.GetFilePath());
			else
			{//提取table list
				int i = 0;
				CString strPath = MyFindFile.GetFilePath();
				GetTable(strPath);

			}
		}
		if(m_bTableStop)
			return;
				

	}
}

(4)GetTable()函数


void CMyDlgExDlg::GetTable(CString strFilePath)
{//建立索引文件
	if( ((strFilePath.Find(".doc")>=0) || (strFilePath.Find(".docx")>=0))&&(strFilePath.Find("~$")<0))
		{
					/处理文档

				//m_Path.SetWindowText(strPath);		//显示文件路径
		bool bReleased=false;
		_Application app;	
		Documents docs,ndocs;
		_Document doc,ndoc;
		Range range,nrange;
		Selection sel,nsel;
		TablesOfContents tocs;
		CString str ;
		COleVariant covTrue((short)TRUE),
                covFalse((short)FALSE),
                covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);	
		COleVariant password(" ");
	
		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.Open(
                               COleVariant(strFilePath,VT_BSTR),
                               covFalse,    // Confirm Conversion.
                               covFalse,    // ReadOnly.
                               covFalse,    // AddToRecentFiles.
                               password, // PasswordDocument.
                               covOptional, // PasswordTemplate.
                               covFalse,    // Revert.
                               password, // WritePasswordDocument.
                               covOptional, // WritePasswordTemplate.
                               covOptional, // Format. // Last argument for Word 97
                                  covOptional, // Encoding // New for Word 2000/2002
                                  covTrue
                                  )  // Close Open parameters
                                  ); // Close AttachDispatch(?)

				
				//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)6)
					,&_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();
				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//

			}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值