http://www.cnblogs.com/wuhuacong/p/4175266.html

在一般的管理系统模块里面,越来越多的设计到一些常用文档的上传保存操作,其中如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,我们一般主要是用来打开文件,另存为,或者预览就可以了。相关的操作代码如下所示。

复制代码

///



/// PDF测试显示窗体

///

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的操作类似,不同的是,它在文档变化后,不能很容易从参数里面获取到对应的文档的路径,需要特殊的处理才能得到。

复制代码

///



/// WORD控件的测试例子

///

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文件了。

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

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

复制代码

///



/// Excel控件的测试例子

///

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文档的预览及操作处理的更多相关文章

  1. 基于MVC4+EasyUI的Web开发框架经验总结(8)--实现Office文档的预览

    在博客园很多文章里面,曾经有一些介绍Office文档预览查看操作的,有些通过转为PDF进行查看,有些通过把它转换为Flash进行查看,但是过程都是曲线救国,真正能够简洁方便的实现Office文档的预览 ...

  2. [转载]基于MVC4+EasyUI的Web开发框架经验总结(8)--实现Office文档的预览

    在博客园很多文章里面,曾经有一些介绍Office文档预览查看操作的,有些通过转为PDF进行查看,有些通过把它转换为Flash进行查看,但是过程都是曲线救国,真正能够简洁方便的实现Office文档的预览 ...

  3. Java实现word文档在线预览,读取office文件

    想要实现word或者其他office文件的在线预览,大部分都是用的两种方式,一种是使用openoffice转换之后再通过其他插件预览,还有一种方式就是通过POI读取内容然后预览. 一.使用openof ...

  4. (转)基于MVC4+EasyUI的Web开发框架经验总结(8)--实现Office文档的预览

    http://www.cnblogs.com/wuhuacong/p/3871991.html 基于MVC4+EasyUI的Web开发框架经验总结(8)--实现Office文档的预览 在博客园很多文章 ...

  5. java 实现word文档在线预览

    一.准备工具 1.通过第三方工具openoffice,将word.excel.ppt.txt等文件转换为pdf文件 下载地址:http://www.openoffice.org/download/in ...

  6. word文档在线预览解决方案

    花了一整天在网上翻关于 “word文档在线预览解决方案” 相关的资料,感觉实现难度比较大还是用PDF来解决好了.. 下面列一下比较好的参考资料吧 参考资料 前端实现在线预览pdf.word.xls.p ...

  7. 基于CA认证(结合文档在线预览)的电子签章解决方案

    分享一个基于CA认证(结合文档在线预览)的电子签章实现思路,恰巧是最近项目中遇到的,欢迎大家一起讨论. 一. 项目背景 在公司业务系统中,按照传统的签章方式,存在以下痛点: 1.成本高,体现在纸质合同 ...

  8. asp.net如何实现word文档在线预览

    原文:asp.net如何实现word文档在线预览 实现方式:office文档转html,再在浏览器里面在线浏览 1.首先引入com组件中office库,然后在程序集扩展中引入word的dll 2.将M ...

  9. 文档在线预览开源实现方案二:OpenOffice + pdf.js

    文档在线预览的另一种实现方式采用的技术栈是OpenOffice + pdf.js, office文档转换为pdf的工作依然由OpenOffice的服务来完成,pdf生成后我们不再将其转换为其他文件而是 ...

随机推荐

  1. bzoj1492 斜率优化|cdq分治

    #include <stdio.h> #include <bitset> #include <string.h> #include <stack> #i ...

  2. JQuery EasyUI DataGrid根据条件设置表格行样式(背景色)

    1.javascript定义函数返回样式 <script type="text/javascript"> //根据条件设置表格行背景颜色 function setRow ...

  3. sublime3 的安装

    1.官网下载 2.无耻的注册码(help) https://www.douban.com/note/539496964/ 常用 —– BEGIN LICENSE —–Alexey PlutalovSi ...

  4. JS学习:第一周——NO.4继承

    1.[关于call] 作用:是用来改变this指向的,有两种参数 第一种:第一个参数,用来改变this指向 第二种:给call前面的函数传参,从第二个参数开始,给call前面的函数从左到右一个个的传参 ...

  5. 设置session生存时间问题

    // 在 php.ini 中设置 session.gc_maxlifetime = 1440 (默认) // 或者在 session_start() 前,设置 $lifetime = 86400 , ...

  6. 操作系统课程设计--Linux平台哲学家问题

    哲学家问题是操作系统中资源分配的经典问题 linux平台下的系统api不同于Windows下的实现 要求:一个正确的哲学家程序(不会发生死锁) 一个错误的哲学家程序(会发生死锁) 系统环境:Eleme ...

  7. PXE+Kickstart+DHCP+TFTP实现无人值守安装操作系统

    PXE+Kickstart+DHCP+TFTP实现无人值守安装操作系统 PXE + Kickstart PXE的工作流程及配置文件 Kickstart的配置文件 Linux安装大致可以分为2个阶段 第 ...

  8. 大型App要搞的几个系统

    路由模块: 解耦各个业务,统一收敛页面跳转,动态决策跳转实现:   鉴权模块:收敛鉴权项目(比如登录.输入密码.短信验证.扫脸),后台动态控制鉴权项目:   收银台:收敛支付,统一到收银台:   开关 ...

  9. oracle 学习笔记(三)

    1. SQL(基础查询) 1.1. 基本查询语句 1.1.1. FROM子句 SQL查询语句的语法如下:   SELECT <*, column [alias], -> FROM tabl ...

  10. 原生js封装ajax,实现跨域请求

    描述: 需要ajax跨域请求,用cors跨域方案.服务端设置: header('Access-Control-Allow-Origin: http://front.ls-la.me'); header ...