最近在一个项目碰到一个问题,要用WPF打开并显示打印Office文档。包括Word, Excel, 和PowerPoint文档。找了很多资料,解决方案之一:调用第三方开发的Word, Excel, PowerPoint解析控件,三个不同的人开发的,要使用三个控件才能解决这个问题。而且有些控件对解析表格和图片还存在问题。
所以只好使用第二个解决方案,把Office文档先转换成XPS,然后用DocumentViewer来显示XPS。
所以解决方案的操作流程是:打开Office文档=》转换并在硬盘生成XPS=》加载显示XPS=》任务完成后删除XPS。
以下代码适用于目标计算机已安装Office2007或以上版本,对于Office 2003,需要下载 Office升级插件
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=3C9A983A-AC14-4125-8BA0-D36D67E0F4AD
那我们开始吧:
在一个工程文件添加如下引用:
Microsoft.Office.Interop.Excel(C:/Program Files/Microsoft Visual Studio 10.0/Visual Studio Tools for Office/PIA/Office12/Microsoft.Office.Interop.Excel.dll)
Microsoft.Office.Interop.PowerPoint(C:/Program Files/Microsoft Visual Studio 10.0/Visual Studio Tools for Office/PIA/Office12/Microsoft.Office.Interop.PowerPoint.dll)
Microsoft.Office.Interop.Word(C:/Program Files/Microsoft Visual Studio 10.0/Visual Studio Tools for Office/PIA/Office12/Microsoft.Office.Interop.Word.dll)
OFFICE(C:/Windows/assembly/GAC/office/12.0.0.0__71e9bce111e9429c/OFFICE.DLL)
ReachFramework
(C:/Program Files/Reference Assemblies/Microsoft/Framework/v3.0/ReachFramework.dll
以上的引用可直接在引用窗口点击“浏览”,直接找到相应的DLL,并添加就可以了。
我们先完成最关键的步骤:Office文档转成XPS
首先创建一个转换类:
OfficeToXps.cs
代码如下:
有了这个类,我们可以轻而易举的把Word, Excel和 PPT文档转成XPS。
调用方法如下:
由于有些文档可能很大,为了保证在完全转换后才加载XPS,我们可以接收OfficeToXps.cs里ConversionResult属性,只有在接收到ConversionResult.OK属性的情况下,才能开始加载XPS文件。
为了让用户稍作等待,我们这里姑且用一个比较简陋的方法提示用户等待。
PleaseWait pw =newPleaseWait();
pw.Owner =this;
pw.Show();
我们打开一个无边框的窗体,上面写着“请等待”。大家也可以使用WPFToolKit里的BusyIndicator;
转换完成后,pw.Close();关闭窗体。
加载XPS的代码非常简单:
在窗体的XAML里定义一个DocumentViewer:
<Window x:Class="Office_To_XPS.Xps_Document"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="XpsDocument" Height="413" Width="605" WindowStartupLocation="CenterScreen">
<DocumentViewer x:Name="xpsDoc"/>
</Window>
在C#里:
privatevoid LoadXPSFile(string _xpsfile)
{
using (XpsDocument xpsDoc =new XpsDocument(_xpsfile,FileAccess.Read))
{
var fs = xpsDoc.GetFixedDocumentSequence();
this.xpsDoc.Document = fs;
}
}
大功告成!效果图如下图所示:
可以打开任何Word, Excel, PowerPoint文件,而且支持显示文件内的图形,表格等各类元素!
本文完整代码下载