基於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等文檔的在線預覽和管理操做,界面截圖以下所示。

相關文章
相關標籤/搜索