一、问题描述
在word开发中有时要求把一个文档的内容拷贝到另一个文档,如下所述。然而,在执行该项工作过程中,曾遇到一个意向不到的情况,查询了好多网站,虽然在bing网站搜寻过程中也有人遇到此问题,但一直没有搜寻到有人给出解决措施。
情况是这样的,在执行Range.Copy()或Range.CopyAsPicture()方法时,出现System.Runtime.InteropServices.ComException异常,并提示:组织策略阻止了该操作。 造成程序运行中断。显然,在调用word模型对象过程中,com调用出现问题。虽然该异常不是每次都出现,但绝大多数时候出现,导致程序根本无法使用。
程序如下所示:
/// <summary>
/// 改方法传入一个文档范围(Range)和新创建文档的名称。就是新创建一个文档copyFileName,将传入的文档范围中的文档拷贝到新文档中,并关闭新文档。
/// </summary>
/// <param name="document">被拷贝文档的范围----Range对象</param>
/// <param name="copyFileName"> 新创建的文档名称(含路径) </param>
public static void SaveACopy(Word.Document document,string copyFileName) //改方法传入两个参数,第一个参数
{
object visible = (object)true; //新创建的文档可见
templateDocument = document.Application.Documents.Add(ref G_Missing, ref G_Missing, ref G_Missing,ref visible); //创建新文档,让其可见
Word.Range original_Range = document.Range(); //获取原有文档全部内容范围Range
original_Range.Select(); //选择
original_Range.CopyAsPicture(); //拷贝到clipboard
Word.Range copy_Range = templateDocument.Range(); //获取新创建文档的范围Range
object collapseDirection = Word.WdCollapseDirection.wdCollapseEnd;
copy_Range.Collapse(ref collapseDirection); //折叠,获取文档尾部位置尾部
copy_Range.Select(); //选中插入位置
copy_Range.Paste(); //粘贴 。。。。。就是这里出现问题,出现"System.Runtime.InteropServices.ComException:组织策略阻止了该操作,组织策略阻止了该操作。” 测试过程中,该异常大多数时候出现,少数时候是不出现该异常的,用的word2016。
object p = (object)copyFileName;
templateDocument.SaveAs(ref p); //保存新创建文档
templateDocument.Close(); //关闭新创建文档
}
二、可用的解决措施
经过反复试验,虽然调整了word信任中心的一些参数,但都无效。后来偶尔发现将修改了新创建文档是否可见的参数后,不在出现这个异常。即将object visible = (object)true 修改为object visible = (object)false。如果需要查看该文档,可以先拷贝保存后再重新打开。虽然该方法有些笨拙,但在一定程度上可以满足使用要求。
/// <summary>
/// 改方法传入一个文档范围(Range)和新创建文档的名称。就是新创建一个文档copyFileName,将传入的文档范围中的文档拷贝到新文档中,并关闭新文档。
/// </summary>
/// <param name="document">被拷贝文档的范围----Range对象</param>
/// <param name="copyFileName"> 新创建的文档名称(含路径) </param>
public static void SaveACopy(Word.Document document,string copyFileName) //改方法传入两个参数,第一个参数
{
object visible = (object)false; //就是把true 改为false,新创建的文档不可见
templateDocument = document.Application.Documents.Add(ref G_Missing, ref G_Missing, ref G_Missing,ref visible); //创建新文档,让其可见
Word.Range original_Range = document.Range(); //获取原有文档全部内容范围Range
original_Range.Select(); //选择
original_Range.CopyAsPicture(); //拷贝到clipboard
Word.Range copy_Range = templateDocument.Range(); //获取新创建文档的范围Range
object collapseDirection = Word.WdCollapseDirection.wdCollapseEnd;
copy_Range.Collapse(ref collapseDirection); //折叠,获取文档尾部位置尾部
copy_Range.Select(); //选中插入位置
copy_Range.Paste(); //把visible改为false后,不在出现原来的ComException异常
object p = (object)copyFileName;
templateDocument.SaveAs(ref p); //保存新创建文档
templateDocument.Close(); //关闭新创建文档
}