用C#来合并WORD文档

diskonline 2008-04-09 11:40:40

程序代码

介绍:
在我当前的项目中,客户希望管理者可以在网站上发布文件,客户的文章(不管是改动或添加什么)都可以将改过的版本上传回网站。然后,管理员可以浏览课余关于文章修改的摘要,允许他可以批准或否定。
尽管我开始以为会很难实现,翻了一些资料,发现除了对单词“跟踪变化”这一特性之外,将几个文档合并为一个是可以做到的,这样一个文档里的所有变化都是允许的。当然可以通过VBA来应用该方法;.net也可以实现。
解决方法:

为了做到这些,我用Visual Studio .NET 2003建立了一个C# ASP.NET项目:
在一个外壳里,Default.apsx页面是主页,DocMerger实现了真正的合并操作,是在 "files"文件夹中("OriginalDoc"包含了文件的原始版本,"Copies"保存的是用户上传的文件,"Output"是添加了摘要的文档)。
网站允许每个人下载原始的文档,上传一个修改的版本并建立输出文档。

服务器通过选择"Track Changes"选项发布引入版本,这样用户的每个变化将被轻易识别。
以下是实现代码:

private void btnGo_Click(object sender, System.EventArgs e)
{
string strBaseDir = Server.MapPath("files/copies");
string strFileName = Guid.NewGuid().ToString().Replace("{","").Replace("}","");
upload.PostedFile.SaveAs(Path.Combine(strBaseDir, strFileName + ".doc"));
}
下面是先前的例子,三个用户分别对文档做了改动。
User 1



User 2



User 3



"copies"文件夹里是不同用户上传的拷贝文档


DocMerger类有一个Merge方法,是用来进行文党的合并,我写的是一个文件夹的过载操作而不是文件的列表。
Collapse



/// <summary>
/// 用一些复制的文件合并一个文党
/// </summary>
/// <param name="strOrgDoc">
/// 原始文件名
/// </param>
/// <param name="arrCopies">
/// 修改过的文件名
/// </param>
/// <param name="strOutDoc">
/// 结果文件名
/// </param>
public void Merge(string strOrgDoc, string[] arrCopies, string strOutDoc)
{
ApplicationClass objApp = null;

//boxing of default values for COM interop purposes
//为COM组件设初值
object objMissing = Missing.Value;
object objFalse = false;
object objTarget = WdMergeTarget.wdMergeTargetSelected;
object objUseFormatFrom = WdUseFormattingFrom.wdFormattingFromSelected;

try
{
objApp = new ApplicationClass();
object objOrgDoc = strOrgDoc;

Document objDocLast = null;
Document objDocBeforeLast = null;

objDocLast = objApp.Documents.Open(
ref objOrgDoc, //文件名
ref objMissing, //确认版本
ref objMissing, //只读
ref objMissing, //添加到最近的文件
ref objMissing, //密码文件
ref objMissing, //密码摸板
ref objMissing, //回复
ref objMissing, //写密码文件
ref objMissing, //写密码摸板
ref objMissing, //格式
ref objMissing, //加密
ref objMissing, //可视
ref objMissing, //打开并修复
ref objMissing, //直接文党
ref objMissing, //没加密的对话框
ref objMissing //XML传输
);

foreach(string strCopy in arrCopies)
{
Debug.WriteLine("Merging file " + strCopy);
objDocLast.Merge(
strCopy, // 文件名
ref objTarget, //目标合并
ref objMissing, //检测格式变化
ref objUseFormatFrom, //使用格式表格
ref objMissing //添加到最近到文党中
);
objDocBeforeLast = objDocLast;
objDocLast = objApp.ActiveDocument;
Debug.WriteLine("The active document is " + objDocLast.Name);

if (objDocBeforeLast != null)
{
Debug.WriteLine("Closing " + objDocBeforeLast.Name);
objDocBeforeLast.Close(
ref objFalse, //保存变化
ref objMissing, //原始格式
ref objMissing //路径文党
);
}


}

object objOutDoc = strOutDoc;

objDocLast.SaveAs(
ref objOutDoc, //文件名
ref objMissing, //文件格式
ref objMissing, //锁定目录
ref objMissing, // 密码
ref objMissing, //添加到当前文件
ref objMissing, //写密码
ref objMissing, //推荐只读
ref objMissing, //嵌入TRUE类型
ref objMissing, //保存本地图片格式
ref objMissing, //保存表格数据
ref objMissing, //S保存为AOCE
ref objMissing, //加密
ref objMissing, //插入行结束
ref objMissing, //允许替换
ref objMissing, //行结束
ref objMissing //添加BiDi标签
);

foreach(Document objDocument in objApp.Documents)
{
objDocument.Close(
ref objFalse, //保存变化
ref objMissing, //原始格式
ref objMissing //路径文党
);
}

}
finally
{
objApp.Quit(
ref objMissing, //保存变化
ref objMissing, //原始格式
ref objMissing //路径文党
);
objApp = null;
}
}

/// <summary>
/// 用一些复制的文件合并一个文党
/// </summary>
/// <param name="strOrgDoc">
/// 原始文件名
/// </param>
/// <param name="arrCopies">
/// 修改过的文件名
/// </param>
/// <param name="strOutDoc">
/// 结果文件名
/// </param>
public void Merge(string strOrgDoc, string strCopyFolder, string strOutDoc)
{
string[] arrFiles = Directory.GetFiles(strCopyFolder);
Merge(strOrgDoc, arrFiles, strOutDoc);
}


The WebForm invokes this method:

private void btnMerge_Click(object sender, System.EventArgs e)
{
string strOrigFile = Server.MapPath("files/originaldoc/thedocument.doc");
string strCopiesDir = Server.MapPath("files/copies");
string strOutputDir = Server.MapPath("files/output/output.doc");
DocMerger objMerger = new DocMerger();
objMerger.Merge(strOrigFile, strCopiesDir, strOutputDir);
lnkResult.NavigateUrl = "files/output/output.doc";
lnkResult.Visible = true;
}

最终的输出是一个由所有用户修改过合并的文党:

用这种方式,管理员可以一次性检查所有的修改,批准或否决。
这里的代码包含了所有文章里描述的内容,但你还需要在思想中保留:
我扩展了Office 2003的功能。你必须从新导入Office的类型库(我想应该运行在Office XP,2000甚至97)并从新编译该项目
微软在Office网络自动化方面有不足之处。但是,我做的所有测试是有必要的。可是,如果需要,DocMerger类可以被移植到其它项目中,将主页变成程序界面。
结论:
使用.NET framework的自动化,完成Office进一步的操作是很容易的,并且它允许快速的传输并出色的完成操作。
...全文
558 点赞 收藏 2
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
meiZiNick 2008-05-01
这个简单啊,网上搜一下就得到答案了.
回复
UltraBejing 2008-05-01
不明LZ在说什么
回复
相关推荐
发帖
企业信息化
创建于2007-08-27

1742

社区成员

企业开发 企业信息化
申请成为版主
帖子事件
创建了帖子
2008-04-09 11:40
社区公告
暂无公告