基于DevExpress实现对PDF、Word、Excel文档的预览及操作处理

简介:

在一般的管理系统模块里面,越来越多的设计到一些常用文档的上传保存操作,其中如PDF、Word、Excel等文档,有时候是通过分布式的WCF技术实现数据的显示和处理,因此希望直接预览而不需要下载文件,这样能够给我们提供很多的方便。在DevExpress里面,提供了相应的控件来显示和处理这些文档,本文主要介绍如何利用DevExpress的控件实现对PDF、Word、Excel文档的预览和操作处理。

1、PDF的预览和操作

在较早的DevExpress的控件里面,已经提供了对应的PDF文档的显示控件,不过由于其对PDF格式支持不是很好,有些文档是Office导出的,也不是很正常阅读,因此很少使用,本文介绍的DevExpress的PDF查看控件是基于14.1的,测试过很多文档,好像都能正常打开,因此也想在系统中广泛使用了。

为了演示这些控件的处理,我单独编写了一个例子,用来实现对PDF、Word、Excel等文档的处理。

为了显示PDF文档,我们需要在界面里面添加一个XtraPdfViewer.PdfViewer的控件,这个主要是用来显示PDF的,它有很多属性方法,用来实现对PDF的处理操作,测试界面设计好如下所示。

对PDF,我们一般主要是用来打开文件,另存为,或者预览就可以了。相关的操作代码如下所示。

    /// <summary>
    /// PDF测试显示窗体
    /// </summary>
    public partial class PDFViewer : Form
    {
        //记录窗体的名称
        readonly string mainFormText;

        public PDFViewer()
        {
            InitializeComponent();

            //记录窗体的名称,并实现文档变化事件的处理,方便显示新的文件名称
            mainFormText = this.Text;
            pdfViewer1.DocumentChanged += new DevExpress.XtraPdfViewer.PdfDocumentChangedEventHandler(pdfViewer1_DocumentChanged);
        }

        /// <summary>
        /// PDF文档变化后,实现对新文件名称的显示
        /// </summary>
        void pdfViewer1_DocumentChanged(object sender, DevExpress.XtraPdfViewer.PdfDocumentChangedEventArgs e)
        {
            string fileName = Path.GetFileName(e.DocumentFilePath);
            if (String.IsNullOrEmpty(fileName))
            {
                Text = mainFormText;
            }
            else
            {
                Text = fileName + " - " + mainFormText;
            }
        }

        /// <summary>
        /// 打开PDF文件
        /// </summary>
        private void btnOpenFile_Click(object sender, EventArgs e)
        {
            string filePath = FileDialogHelper.OpenPdf();
            if (!string.IsNullOrEmpty(filePath))
            {
                this.pdfViewer1.LoadDocument(filePath);
            }
        }

        /// <summary>
        /// 另存为PDF文件
        /// </summary>
        private void btnSaveAs_Click(object sender, EventArgs e)
        {
            string dir = System.Environment.CurrentDirectory;
            string filePath = FileDialogHelper.SavePdf("", dir);
            if (!string.IsNullOrEmpty(filePath))
            {
                try
                {
                    this.pdfViewer1.SaveDocument(filePath);
                    MessageUtil.ShowTips("保存成功");
                }
                catch (Exception ex)
                {
                    LogTextHelper.Error(ex);
                    MessageUtil.ShowError(ex.Message);
                }
            }
        }

        /// <summary>
        /// PDF文件打印
        /// </summary>
        private void btnPreview_Click(object sender, EventArgs e)
        {
            this.pdfViewer1.Print();
        }
    }

从上面的代码,我们可以看到,对于PDF,我们操作起来很方便,主要就是在界面里面加载文件后,就可以对PDFViewer对象实现相关的操作了。

2、WORD文档的预览和操作

类似于PDF文档,我们对WORD文档,也是通过使用RichEditControl实现文档的显示,不过和PDFViewer不同,这个控件可以实现对文档的修改和保存操作,这种对于我们提供用户对文档进行编辑很方便。

测试例子的界面如下所示。

相关的操作代码,也和PDF的操作类似,不同的是,它在文档变化后,不能很容易从参数里面获取到对应的文档的路径,需要特殊的处理才能得到。

    /// <summary>
    /// WORD控件的测试例子
    /// </summary>
    public partial class WordViewer : Form
    {
        //记录窗体的名称
        readonly string mainFormText;

        public WordViewer()
        {
            InitializeComponent();

            //记录窗体的名称,并实现文档变化事件的处理,方便显示新的文件名称
            mainFormText = this.Text;
            this.richEditControl1.DocumentLoaded += new EventHandler(richEditControl1_DocumentLoaded);
        }

        /// <summary>
        /// WORD文档变化后,实现对新文件名称的显示
        /// </summary>
        void richEditControl1_DocumentLoaded(object sender, EventArgs e)
        {
            string fileName = Path.GetFileName(this.richEditControl1.Options.DocumentSaveOptions.CurrentFileName);
            if (String.IsNullOrEmpty(fileName))
            {
                Text = mainFormText;
            }
            else
            {
                Text = fileName + " - " + mainFormText;
            }

            //修改默认字体
            DocumentRange range = richEditControl1.Document.Range;
            CharacterProperties cp = this.richEditControl1.Document.BeginUpdateCharacters(range);
            cp.FontName = "新宋体";
            //cp.FontSize = 12;
            this.richEditControl1.Document.EndUpdateCharacters(cp);
        }

        /// <summary>
        /// 打开WORD文件
        /// </summary>
        private void btnOpenFile_Click(object sender, EventArgs e)
        {
            string filePath = FileDialogHelper.OpenWord();
            if (!string.IsNullOrEmpty(filePath))
            {
                richEditControl1.LoadDocument(filePath);//, DocumentFormat.Doc);
            }
        }

        /// <summary>
        /// 保存WORD文件
        /// </summary>
        private void btnSaveFile_Click(object sender, EventArgs e)
        {
            this.richEditControl1.SaveDocument();
        }

        /// <summary>
        /// 另存为WORD文件
        /// </summary>
        private void btnSaveAs_Click(object sender, EventArgs e)
        {
            try
            {
                richEditControl1.SaveDocumentAs();
                MessageUtil.ShowTips("保存成功");
            }
            catch (Exception ex)
            {
                LogTextHelper.Error(ex);
                MessageUtil.ShowError(ex.Message);
            }
        }

        /// <summary>
        /// WORD文件打印
        /// </summary>
        private void btnPreview_Click(object sender, EventArgs e)
        {
            this.richEditControl1.ShowPrintPreview();
        }
    }

加载文档后,界面显示内容如下所示:

文档控件很容易支持打印预览功能,打印预览的界面如下所示

不过话说回来,这个RichEditControl虽然能够较好显示Word文档,不过也有一些字体显示的不是很好,格式和微软的Word软件显示的有些不太一样,格式有所损失。

因此如果对于格式要求比较严谨的,建议还是只是做显示为佳,不要保存原有的文档。如果对格式不是特别严格,倒是可以作为一个文档服务器实现文档的新建、保存处理。

3、Excel文档的预览和操作

对于Excel文档的预览和操作,DevExpress控件在最近版本中增加的XtraSpreadsheet.SpreadsheetControl控件就可以实现Excel的显示和处理操作,这个控件很强大,可以处理很复杂格式的Excel文档,虽然我原来使用了另外一个FarPoint Spread控件组,不过这个XtraSpreadsheet控件组,如果集成在DevExpress也就很方便了。

这个DevExpress的控件,可以在其中进行Excel的新建、保存、打印预览等操作,当然也可以打开我们已有的Excel文件了。

打开文件后,界面效果如下所示。

界面的相关功能操作代码如下所示。

    /// <summary>
    /// Excel控件的测试例子
    /// </summary>
    public partial class ExcelViewer : Form
    {
        //记录窗体的名称
        readonly string mainFormText;

        public ExcelViewer()
        {
            InitializeComponent();

            //记录窗体的名称,并实现文档变化事件的处理,方便显示新的文件名称
            mainFormText = this.Text;
            this.spreadsheetControl1.DocumentLoaded += new EventHandler(spreadsheetControl1_DocumentLoaded);
        }

        /// <summary>
        /// 文档变化后,实现对新文件名称的显示
        /// </summary>
        void spreadsheetControl1_DocumentLoaded(object sender, EventArgs e)
        {
            string fileName = Path.GetFileName(this.spreadsheetControl1.Document.Path);
            if (String.IsNullOrEmpty(fileName))
            {
                Text = mainFormText;
            }
            else
            {
                Text = fileName + " - " + mainFormText;
            }
        }

        /// <summary>
        /// 打开Excel文件
        /// </summary>
        private void btnOpenFile_Click(object sender, EventArgs e)
        { 
            string filePath = FileDialogHelper.OpenExcel();
            if (!string.IsNullOrEmpty(filePath))
            {
                IWorkbook workbook = spreadsheetControl1.Document;
                workbook.LoadDocument(filePath);
            }
        }

        /// <summary>
        /// 保存Excel文件
        /// </summary>
        private void btnSaveFile_Click(object sender, EventArgs e)
        {
            spreadsheetControl1.SaveDocument();
        }

        /// <summary>
        /// 另存为Excel文件
        /// </summary>
        private void btnSaveAs_Click(object sender, EventArgs e)
        {
            string dir = System.Environment.CurrentDirectory;
            string filePath = FileDialogHelper.SaveExcel("", dir);
            if (!string.IsNullOrEmpty(filePath))
            {
                try
                {
                    IWorkbook workbook = spreadsheetControl1.Document;
                    workbook.SaveDocument(filePath);

                    MessageUtil.ShowTips("保存成功");
                }
                catch (Exception ex)
                {
                    LogTextHelper.Error(ex);
                    MessageUtil.ShowError(ex.Message);
                }
            }
        }

        /// <summary>
        /// Excel文件打印
        /// </summary>
        private void btnPreview_Click(object sender, EventArgs e)
        {
            this.spreadsheetControl1.ShowPrintPreview();
        }
    }

预览也很方便,和Word的预览操作类似。

以上就是几个常用文档的显示和操作案例,有了这些我们很容易整合到我们的附件管理里面了。

如我在我的《Winform开发框架》、《混合式开发框架里面》使用的通用附件管理模块,就是基于这些特点,实现图片、Excel文档、Word文档和PDF等文档的在线预览和管理操作,界面截图如下所示。

 本文转自博客园伍华聪的博客,原文链接:基于DevExpress实现对PDF、Word、Excel文档的预览及操作处理,如需转载请自行联系原博主。



目录
相关文章
|
14天前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
70 5
|
1月前
|
前端开发
PDF文件上传转成base64编码并支持预览
PDF文件上传转成base64编码并支持预览
120 12
|
3月前
|
XML 缓存 JSON
为什么浏览器中有些图片、PDF等文件点击后有些是预览,有些是下载
为什么浏览器中有些图片、PDF等文件点击后有些是预览,有些是下载
255 0
|
5天前
|
API C#
在.NET中使用QuestPDF高效地生成PDF文档
在.NET中使用QuestPDF高效地生成PDF文档
|
1月前
|
JSON 数据格式
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
LangChain-20 Document Loader 文件加载 加载MD DOCX EXCEL PPT PDF HTML JSON 等多种文件格式 后续可通过FAISS向量化 增强检索
70 2
|
3月前
|
Web App开发 iOS开发 容器
Vue3PDF预览(vue3-pdf-app)
`vue3-pdf-app` 插件提供了一个简单而强大的 PDF 预览解决方案。通过 `&lt;a&gt;` 标签即可快速预览 PDF 文件。为满足更复杂的定制需求,提供了 `PDFViewer.vue` 组件,基于 `vue3-pdf-app@1.0.3` 封装,支持多种功能如缩放、旋转、全屏预览、打印等,并可自定义主题颜色与语言。组件属性包括文件地址 (`src`)、预览容器尺寸 (`width`, `height`)、默认缩放规则 (`pageScale`) 和主题 (`theme`) 等。适用于多种浏览器,方便集成到项目中。
553 2
Vue3PDF预览(vue3-pdf-app)
|
3月前
|
移动开发 资源调度 JavaScript
Vue移动端网页(H5)预览pdf文件(pdfh5和vue-pdf)
这篇文章介绍了在Vue移动端网页中使用`pdfh5`和`vue-pdf`两个插件来实现PDF文件的预览,包括滚动查看、缩放、添加水印、分页加载、跳转指定页数等功能。
2664 0
Vue移动端网页(H5)预览pdf文件(pdfh5和vue-pdf)
|
3月前
|
C# 开发者 Windows
WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
240 0
|
3月前
|
C# 开发者 Windows
WPF与PDF文档:解锁创建和编辑PDF文件的新技能——从环境配置到代码实践,手把手教你如何在WPF应用中高效处理PDF,提升文档管理效率
【8月更文挑战第31天】随着数字文档的普及,PDF因跨平台兼容性和高保真度成为重要格式。WPF虽不直接支持PDF处理,但借助第三方库(如iTextSharp)可在WPF应用中实现PDF的创建与编辑。本文通过具体案例和示例代码,详细介绍了如何在WPF中集成PDF库,并展示了从设计用户界面到实现PDF创建与编辑的完整流程。不仅包括创建新文档的基本步骤,还涉及在现有PDF中添加页眉页脚等高级功能。通过这些示例,WPF开发者可以更好地掌握PDF处理技术,提升应用程序的功能性和实用性。
140 0
|
3月前
[PDF提取重命名]提取识别文字并对PDF文件批量重命名,提取PDF指定可复制的内容并批量重命名PDF,批量PDF文档指定识别提取区域
本文介绍一款实用工具,能快速从可复制内容的PDF中提取指定区域信息并据此重命名文件。设置提取坐标及导入PDF文档、设定新文件名后启动提取流程,即可高效批量处理。保存坐标设置以便重复使用,适用于需频繁修改大量PDF文件名的场景。
309 0
[PDF提取重命名]提取识别文字并对PDF文件批量重命名,提取PDF指定可复制的内容并批量重命名PDF,批量PDF文档指定识别提取区域