视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
WinForm中如何预览Office文件
2020-11-27 22:35:18 责编:小OO
文档


本文为大家分享了WinForm预览Office文档的方法,供大家参考,具体内容如下

使用WinForm, WPF, Office组件

原理:使用Office COM组件将Word,Excel转换为XPS文档, 将WPF的DocumentViewer控件寄宿到WinForm中, 实现预览.

1. 新建WinForm项目

2. 新建WPF用户控件, 注意是WPF控件

3. 编辑WPF用户控件

<UserControl ...
 ...>
 <Grid>
 <DocumentViewer x:Name="documentViewer"/>
 </Grid>
</UserControl>

VS设计预览显示效果如下:

如果不需要自带的工具栏, 可以添加以下资源隐藏工具栏:

<!--隐藏DocumentViewer边框-->
<UserControl.Resources>
 <Style x:Key="{x:Type DocumentViewer}" TargetType="{x:Type DocumentViewer}">
 <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}" />
 <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
 <Setter Property="FocusVisualStyle" Value="{x:Null}" />
 <Setter Property="Template">
 <Setter.Value>
 <ControlTemplate TargetType="{x:Type DocumentViewer}">
 <Border BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Focusable="False">
 <Grid KeyboardNavigation.TabNavigation="Local">
 <Grid.Background>
 <SolidColorBrush Color="{DynamicResource ControlLightColor}" />
 </Grid.Background>
 <Grid.RowDefinitions>
 <RowDefinition Height="Auto" />
 <RowDefinition Height="*" />
 <RowDefinition Height="Auto" />
 </Grid.RowDefinitions>
 <ScrollViewer Grid.Row="1" CanContentScroll="true" HorizontalScrollBarVisibility="Auto" x:Name="PART_ContentHost" IsTabStop="true">
 <ScrollViewer.Background>
 <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
 <GradientStop Color="{DynamicResource ControlLightColor}" Offset="0" />
 <GradientStop Color="{DynamicResource ControlMediumColor}" Offset="1" />
 </LinearGradientBrush>
 </ScrollViewer.Background>
 </ScrollViewer>
 </Grid>
 </Border>
 </ControlTemplate>
 </Setter.Value>
 </Setter>
 </Style>
</UserControl.Resources>

4. 新建WinForm用户控件

在WinForm上添加ElementHost

将WPF用户控件添加到ElementHost上,设计器代码XpsPreviewer.Designer.cs如下

 //ElementHost
 private System.Windows.Forms.Integration.ElementHost elementHost1;
 //XpsPreviewer变量
 private WPF.XpsPreviewer xpsPreviewer1;

 private void InitializeComponent()
 {
 this.elementHost1 = new System.Windows.Forms.Integration.ElementHost();
 this.xpsPreviewer1 = new WPF.XpsPreviewer();

 //初始化
 //其他属性初始化...
 this.elementHost1.Child = this.xpsPreviewer1;
 //其他属性初始化...
 }

在XpsPreviewer.cs后台代码中定义方法:

 /// <summary>
 /// 加载XPS文件
 /// </summary>
 /// <param name="fileName">XPS文件名</param>
 internal void LoadXps(string fileName)
 {
 var xpsDocument = new XpsDocument(fileName, FileAccess.Read);
 this.xpsPreviewer1.documentViewer.Document = xpsDocument.GetFixedDocumentSequence();
 xpsDocument.Close();
 }

5. 将Excel(Word类似)转换为XPS文件

通过Nuget包管理控制台安装COM组件:

PM> Install-Package Microsoft.Office.Interop.Excel

转换为XPS:

 /// <summary>
 /// 将Excel文件转换为XPS文件
 /// </summary>
 /// <param name="execelFileName">Excel文件名</param>
 /// <param name="xpsFileName">转换的xps文件名</param>
 public void ConvertExcelToXps(string excelFileName, string xpsFileName)
 {
 if (string.IsNullOrWhiteSpace(excelFileName))
 throw new ArgumentNullException(excelFileName);
 if (string.IsNullOrWhiteSpace(xpsFileName))
 throw new ArgumentNullException(xpsFileName);

 var fileInfo = new FileInfo(xpsFileName);
 if (!fileInfo.Directory.Exists)
 fileInfo.Directory.Create();

 //删除已存在的文件
 if (File.Exists(xpsFileName))
 File.Delete(xpsFileName);

 Excel.Application app = new Excel.Application();
 app.DisplayAlerts = false;
 Excel.Workbooks wbs;
 Excel.Workbook wb;

 wbs = app.Workbooks;
 wb = wbs.Add(excelFileName);
 dynamic Nothing = System.Reflection.Missing.Value;
 wb.ExportAsFixedFormat(Excel.XlFixedFormatType.xlTypeXPS, xpsFileName, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing);
 wb.Close(true);
 wbs.Close();
 app.Quit();
 KillExcelProcess(app);
 }

扩展: 每次调用Excel打开文件,均会产生一个进程, 在网络上收集的释放Excel进程方式均不起作用. 因此选择直接结束进程, 根据Excel句柄结束进程, 而不是根据进程名称杀死全部正在运行的Excel.

 [DllImport("User32.dll")]
 private static extern int GetWindowThreadProcessId(IntPtr hWnd, out int ProcessId);

 /// <summary>
 /// 结束Excel进程
 /// </summary>
 /// <param name="obj"></param>
 private void KillExcelProcess(Excel.Application app)
 {
 if (app == null)
 return;
 try
 {
 IntPtr intptr = new IntPtr(app.Hwnd);
 int id;
 GetWindowThreadProcessId(intptr, out id);
 var p = Process.GetProcessById(id);
 p.Kill();
 }
 catch { }
 }

现在已经可以正常的预览Excel文件了. 由于Excel另存为XPS文件会耗费一定的时间, 因此建议在后台线程中提前异步生成, 在预览时可直接调取XPS文件.

下载本文
显示全文
专题