温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

WinForm中预览Office文件的方法

发布时间:2021-02-07 15:06:26 来源:亿速云 阅读:1176 作者:小新 栏目:开发技术

小编给大家分享一下WinForm中预览Office文件的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

WinForm预览Office文档的方法,具体内容如下

使用WinForm, WPF, Office组件

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

1. 新建WinForm项目

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

WinForm中预览Office文件的方法

3. 编辑WPF用户控件

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

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

WinForm中预览Office文件的方法

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

<!--隐藏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中预览Office文件的方法

在WinForm上添加ElementHost

WinForm中预览Office文件的方法

将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文件.

以上是“WinForm中预览Office文件的方法”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI