博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WinForm中预览Office文件
阅读量:5348 次
发布时间:2019-06-15

本文共 3553 字,大约阅读时间需要 11 分钟。

WinForm预览Office文档

使用WinForm, WPF, Office组件

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

1. 新建WinForm项目

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

764262-20171013141856012-872036150.png

3. 编辑WPF用户控件

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

764262-20171013141929840-339280136.png

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

4. 新建WinForm用户控件

764262-20171013141948371-320686273.png

在WinForm上添加ElementHost

764262-20171013142004684-231099522.png

将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后台代码中定义方法:

///     /// 加载XPS文件    ///     /// XPS文件名    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:

///     /// 将Excel文件转换为XPS文件    ///     /// Excel文件名    /// 转换的xps文件名    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);    ///     /// 结束Excel进程    ///     ///     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文件.

补充: Word 转换为 PDF

Word.Application app = new Word.Application();    Word.Document document = null;    object missing = System.Reflection.Missing.Value;    app.Visible = false;    document = app.Documents.Open(sourcePath);    document.ExportAsFixedFormat(targetPath, Word.WdExportFormat.wdExportFormatPDF);    object saveChanges = Word.WdSaveOptions.wdDoNotSaveChanges;    document.Close(ref saveChanges, ref missing, ref missing);    ((Word._Application)app).Quit(ref missing, ref missing, ref missing);

转载于:https://www.cnblogs.com/aning2015/p/7660958.html

你可能感兴趣的文章
[工具] Sublime Text 使用指南
查看>>
Web服务器的原理
查看>>
常用的107条Javascript
查看>>
#10015 灯泡(无向图连通性+二分)
查看>>
mysql统计一张表中条目个数的方法
查看>>
ArcGIS多面体(multipatch)解析——引
查看>>
css3渐变画斜线 demo
查看>>
JS性能DOM优化
查看>>
HAL层三类函数及其作用
查看>>
Odoo 去掉 恼人的 "上午"和"下午"
查看>>
web@h,c小总结
查看>>
java编程思想笔记(一)——面向对象导论
查看>>
Data Structure 基本概念
查看>>
Ubuntu改坏sudoers后无法使用sudo的解决办法
查看>>
NEYC 2017 游记
查看>>
[搬运] 写给 C# 开发人员的函数式编程
查看>>
Python之旅Day14 JQuery部分
查看>>
core--线程池
查看>>
redux-effect
查看>>
Android轻量级的开源缓存框架ASimpleCache
查看>>