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

在通常的管理系统模块里面,愈来愈多的设计到一些经常使用文档的上传保存操做,其中如PDF、Word、Excel等文档,有时候是经过分布式的WCF技术实现数据的显示和处理,所以但愿直接预览而不须要下载文件,这样可以给咱们提供不少的方便。在DevExpress里面,提供了相应的控件来显示和处理这些文档,本文主要介绍如何利用DevExpress的控件实现对PDF、Word、Excel文档的预览和操做处理。服务器

一、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对象实现相关的操做了。this

 

二、WORD文档的预览和操做

相似于PDF文档,咱们对WORD文档,也是经过使用RichEditControl实现文档的显示,不过和PDFViewer不一样,这个控件能够实现对文档的修改和保存操做,这种对于咱们提供用户对文档进行编辑很方便。spa

测试例子的界面以下所示。设计

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

    /// <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();
        }
    }

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

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

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

所以若是对于格式要求比较严谨的,建议仍是只是作显示为佳,不要保存原有的文档。若是对格式不是特别严格,却是能够做为一个文档服务器实现文档的新建、保存处理。

 

三、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等文档的在线预览和管理操做,界面截图以下所示。

相关文章
相关标签/搜索