一、前言

PageOffice是一款帮助Web应用系统或Web网站实现用户在线编辑Word、Excel、PowerPoint文档,Word/Excel模板动态填充,Word/Excel在线输入提交,系统数据导入导出word、excel文档的Office快速开发组件库,是目前把Office应用到Web平台上的最全面、最先进的解决方案。PageOffice为软件开发者构建了一套简洁高效、统一的Office对象接口,同时无缝支持doc、docx、xls、xlsx、ppt、pptx等流行Office文件格式。

简而言之就是可以在线编写office文件的产品。

二、安装PageOffice

专业版试用序列号: 2C697-4FC8-F274-3DD88

1. 双击运行Setup.exe安装服务器组件。(可以到官网下载安装程序)

2. 如果运行示例,用VS.Net打开MvcApplication4.sln即可运行。

3.  如果新建网站或集成PageOffice到您现有的网站里:

1). 双击运行Setup.exe安装服务器组件;

2). 拷贝“集成文件”目录下的“pageoffice”文件夹到您自己网站的根目录下;

2). VS.NET工具箱拖放PageOffice控件,双击控件,在事件代码中编写代码。

------我的项目是.net MVC4  直接把 “pageoffice”文件夹放到自己网站的根目录下;  

三、使用

使用就分为编辑一个指定路径下的文件,并保存

1、在网中打开一个指定路径下的word

我的文件的路径是:D:\project\A27\A27_Source\Web\OfficeTemp\总结报告.docx

如何打开该路径下的文件,直接上代码吧

 public ActionResult EditReport()
{
ViewBag.Message = "Your contact page.";
System.Web.UI.Page page = new System.Web.UI.Page();
string controlOutput = string.Empty;
PageOffice.PageOfficeCtrl pc = new PageOffice.PageOfficeCtrl();
try
{
string fileName = "总结报告.docx";
string filePath = Server.MapPath("~/OfficeTemp/")+fileName;
string currfilepath = "/" + fileName;
pc.SaveFilePage = Url.Content("SaveDoc") + "?path=" + Server.UrlEncode(currfilepath); if (filePath == null) throw new ApplicationException("配置文件中未找到对应系统的项");
pc.ServerPage = Url.Content("~/pageoffice/server.aspx");
pc.WebOpen(filePath, PageOffice.OpenModeType.docAdmin, "s"); result.IsSuccess = true; page.Controls.Add(pc);
StringBuilder sb = new StringBuilder();
using (StringWriter sw = new StringWriter(sb))
{
using (HtmlTextWriter htw = new HtmlTextWriter(sw))
{
Server.Execute(page, htw, false); controlOutput = sb.ToString();
}
}
ViewBag.EditorHtml = controlOutput; }
catch (Exception err)
{
throw err;
} return PartialView();
}

2、保存编辑后的word, 保存时调用的saveDoc方法和参数正是编辑时这段代码提供的:

pc.SaveFilePage = Url.Content("SaveDoc") + "?path=" + Server.UrlEncode(currfilepath);

public ActionResult SaveDoc(string path)
{
string filePath = Server.MapPath("~/OfficeTemp/" + path);
PageOffice.FileSaver fs = new PageOffice.FileSaver();
fs.SaveToFile(filePath);
fs.Close();
return View();
}

四、根据数据库动态生成word文件

生成word并不是pageoffice的功能,但是会一起与该组件一起使用

1、生成word

 /// <summary>
/// 报告word
/// </summary>
/// <param name="wellboreId"></param>
/// <returns></returns>
public string OutPutDoc(Guid wellboreId, string appendixTypes, string wellboreNo)
{
try
{ string filePathNew = Server.MapPath("~/OfficeTemp/") + wellbore_No + "/" + HttpContext.User.Identity.Name + "/";//Server.MapPath("~/Upload/LogReportTemp/") +"\\" + HttpContext.User.Identity.Name;
//生成文件夹 Directory.CreateDirectory(filePathNew); string fullfileName = filePathNew + fileName;
string mainDocPath = Server.MapPath("~/Upload/LogReportTemp/GeoSummaryReport_template.docx");//Server.MapPath("~/Upload/LogReportTemp/LS25-1-5测井作业总结报告01.docx using (var mainDoc =WordprocessingDocument.Open(mainDocPath, false))
using (var resultDoc = WordprocessingDocument.Create(fullfileName, WordprocessingDocumentType.Document))
{ MainDocumentPart mainPart = resultDoc.MainDocumentPart;
foreach (var part in mainDoc.Parts)
{
if (part.OpenXmlPart.ContentType != "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml")
resultDoc.AddPart(part.OpenXmlPart, part.RelationshipId);
else if (mainPart == null)
{
mainPart = (MainDocumentPart)resultDoc.AddPart(part.OpenXmlPart, part.RelationshipId);
//通过替换OuterXml中的占位符替换文本
mainPart.Document.Body = new Body(GeoSummaryReportHelper.XmlStringReplace(wellboreId, wellbore_No, mainDoc.MainDocumentPart.Document.Body.OuterXml, appendixTypes));
var bookMarks = GeoSummaryReportHelper.FindBookmarks(resultDoc.MainDocumentPart.Document);
//替换书签中的内容
foreach (var end in bookMarks)
{
//为了满足甲方格式要求,使用模板生成方式
if (end.Key == "SuizuanTypeMark") GeoSummaryReportHelper.CreateSuiZuanTable(end,resultDoc ,wellbore_No, "LWD",wellboreId);
if (end.Key == "DianLanTypeMark") GeoSummaryReportHelper.CreateDianLanTable(end, resultDoc, wellbore_No, "RUN", wellboreId); if (end.Key.Contains("DrillAndCasing")) GeoSummaryReportHelper.DrawingDrillAndCasingInfoTb(end, wellboreId);//绘制基本信息井身结构模块表格 }
}
}
string headerText = string.Format("{0}总结报告", wellbore_No);
GeoSummaryReportHelper.AddHeader(resultDoc, headerText);//添加页眉
} string url = Request.Url.ToString().Replace(Request.Url.AbsolutePath,"");
//返回生成的文档的信息
string ahref = url + "/OfficeTemp/" + wellbore_No + "/" + HttpContext.User.Identity.Name + "/" + fileName;//Server.MapPath("~/OfficeTemp/") + wellboreId + "/" + HttpContext.User.Identity.Name + "/" + fileName; //Url.Content(Server.MapPath("~/OfficeTemp/")) + wellboreId + "/" + HttpContext.User.Identity.Name + "/" + fileName; string createTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm");
string returnValues = string.Format(
@"<a href='{0}'>{1}</a>&nbsp;&nbsp;&nbsp;
生成时间:{2} &nbsp;&nbsp&nbsp;&nbsp;<a href=javascript:EditReport('{1}')>【编辑】</a>
&nbsp;&nbsp&nbsp;&nbsp;<a href='javascript:BuildReport()'>【重新生成】</a>
&nbsp;&nbsp;<a href='javascript:ExpToZip()'>【打包下载】</a>", ahref, fileName, createTime);
return returnValues;
// string.Format(
// @"<a href='{0}'>{1}</a>&nbsp;&nbsp;&nbsp;
// 生成时间:{2} &nbsp;&nbsp&nbsp;&nbsp;<a href=javascript:EditReport('{1}')>【编辑】</a>
// &nbsp;&nbsp&nbsp;&nbsp;<a href='javascript:BuildReport()'>【重新生成】</a>
// &nbsp;&nbsp;<a href='javascript:ExpToZip()'>【打包下载】</a>
// &nbsp;&nbsp;<a href=javascript:DeleteWellboresById('{3}')>【删除】</a>", ahref, fileName, createTime, wellboreId); }
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}

2、替换占位符方法

/// <summary>
/// 替换文本
/// </summary>
/// <param name="WellboreId"></param>
/// <param name="OuterXml"></param>
/// <returns></returns>
public static string XmlStringReplace(Guid WellboreId, string wellbore_No, string OuterXml, string appendixTypes)
{
try
{string retVal = OuterXml;
#region 标题第一页数据占位符替换
retVal = retVal.Replace("{AREA}", 888);
#endregion return retVal;
}
catch (Exception ex)
{
throw new ApplicationException(string.Format("替换附表数据失败:错误原因是:{0}", ex.Message));
} }

3、上面还用到一个设置页眉的方法

 /// <summary>
/// 添加页眉
/// </summary>
/// <param name="doc">文档对象</param>
/// <param name="HeaderTxt">页眉标题</param>
public static void AddHeader(WordprocessingDocument doc, string HeaderTxt)
{
countheader = ;
string newHeaderText = HeaderTxt;
MainDocumentPart mainDocPart = doc.MainDocumentPart;
mainDocPart.DeleteParts(mainDocPart.HeaderParts);
HeaderPart newHeaderPart = mainDocPart.AddNewPart<HeaderPart>();
string rId = mainDocPart.GetIdOfPart(newHeaderPart);
GeneratePageHeaderPart(newHeaderText).Save(newHeaderPart);
foreach (SectionProperties sectProperties in
mainDocPart.Document.Descendants<SectionProperties>())
{
countheader++;
int count=sectProperties.Count();
foreach (HeaderReference headerReference in
sectProperties.Descendants<HeaderReference>())
{
sectProperties.RemoveChild(headerReference);
HeaderReference newHeaderReference =
new HeaderReference() {Id = rId, Type = HeaderFooterValues.Default}; sectProperties.Append(newHeaderReference);
} }
}

4、生成word中还有一个获取所有书签的方法

 /// <summary>
/// 获取所有书签
/// </summary>
/// <param name="documentPart"></param>
/// <param name="results"></param>
/// <param name="unmatched"></param>
/// <returns></returns>
public static Dictionary<string, BookmarkEnd> FindBookmarks(OpenXmlElement documentPart,
Dictionary<string, BookmarkEnd> results = null, Dictionary<string, string> unmatched = null)
{
results = results ?? new Dictionary<string, BookmarkEnd>();
unmatched = unmatched ?? new Dictionary<string, string>();
foreach (var child in documentPart.Elements())
{
if (child is BookmarkStart)
{
var bStart = child as BookmarkStart;
if (!unmatched.ContainsKey(bStart.Id))
{
unmatched.Add(bStart.Id, bStart.Name);
}
}
if (child is BookmarkEnd)
{
var bEnd = child as BookmarkEnd;
foreach (var orphanName in unmatched)
{
if (bEnd.Id == orphanName.Key && !results.ContainsKey(orphanName.Value))
results.Add(orphanName.Value, bEnd);
}
}
FindBookmarks(child, results, unmatched);
}
return results;
}

更多该组件的欢迎大家一起讨论交流。。。。

PageOffice 使用Dome的更多相关文章

  1. maven_spring mvc_mina_dome(实体,文件,批传)(spring mina 初学dome)

    看我们群里经常有人在问mina心跳问题,虽然俺是菜鸟可是觉得挺简单的啊,就写了个dome,希望大家多多提意见. 俺做过一段时间网络协议.所以觉得挺简单的吧.哎呀,反正技术就那样了没啥难的. 废话不多说 ...

  2. Java反射机制DOME

    Java反射机制 public class TestHibernate { @Test public void TestHb(){ try { Class cs = Class.forName(&qu ...

  3. ListView上拉刷新和分页加载完整的Dome

    很多人工作的过程中都会碰到ListView下拉刷新和分页加载,然后大多数公司都已经把框架写好了,大家直接用就可以了,有些人一直对这个事情处于迷茫状态,为了让大家对上拉刷新和分页加载有一个比较全面的认识 ...

  4. ios 上拉载入下拉刷新Dome

    为练手写了一个小的上拉载入很多其它下拉刷新的小的Dome . 没有太多的技术含量,仅仅是作为新手的启示用.是上一篇下拉载入的扩展.先看一下那个再看这个就easy非常多. Dome下载:http://d ...

  5. iOS 搜索框控件 最简单的dome

    刚学习搜索框控件,写了个最简单的dome #import <UIKit/UIKit.h> .h @interface ViewController : UIViewController&l ...

  6. [UWP小白日记-2]SQLite数据库DOME

    数据库说简单点就是增删改查,但是对新手来说也是要爆肝的.作为一个新手爆肝无数次啊, 血的教训啊现在UWP的教程又少,说多了都是泪.留下来免得以后又爆肝.还有:一定要写注释!一定要写注释!一定要写注释! ...

  7. pageoffice 开发笔记

    开发环境:vs2015,mvc,razor pageoffice版本:Server-Version=3.2.0.1 OCX-Version=2,0,4,6 开发模式:pageofficeLink方式 ...

  8. Easyui设置动态表格,动态导出数据实例,附Dome

    最近碰到一个需求,需要提供一个弹出页面选择列表页面需要显示的列,页面确认之后需要修改列表页面显示的表格,导出的数据也需要同步变化. 下面直接上代码 1.设置需要显示的列columus为全局对象,用于子 ...

  9. 【淘宝客】根据淘客联盟精选清单(淘宝天猫内部优惠券)随机显示淘宝天猫优惠券dome

    也许大家在生活中经常淘宝看到[淘宝天猫内部优惠券]的网站,或者在微博中经常有博主发券,让大家生活中购物便宜许多,作为一个站长,我们也希望自己的网站也能有这样的一个功能,现在就分享给大家,还是免后台哦. ...

随机推荐

  1. nowcoder(牛客网)OI测试赛3 解题报告

    昨天因为胡搞了一会儿社团的事情,所以错过(逃过)了nowcoder的测试赛..... 以上,听说还是普及组难度qwq,而且还有很多大佬AK(然而我这么蒻肯定还是觉得有点难度的吧qwq) 不过我还是日常 ...

  2. 201621123012《Java程序设计》第八周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 答:如果为空的时候 ...

  3. Mysql内置功能《一》流程控制

    delimiter // CREATE PROCEDURE proc_if () BEGIN declare i int default 0; if i = 1 THEN SELECT 1; ELSE ...

  4. KVM虚拟机的日常管理与配置

    1. 查看KVM虚拟机配置文件及运行状态(1) KVM虚拟机默认配置文件位置: /etc/libvirt/qemu/ autostart目录是配置kvm虚拟机开机自启动目录. (2) virsh命令帮 ...

  5. bzoj2754:[SCOI2012]喵星球上的点名(后缀自动机)

    Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣.   假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串 ...

  6. Redis + Redis-sentinel + keepalived部署过程

    1   Redis缓存服务 Redis是一个key-value存储系统.与memcached一样,为了保证效率,数据都是缓存在内存中的.区别的是redis支持周期性的把更新的数据写入磁盘或者把修改操作 ...

  7. jquery源码解析:jQuery原型方法init的详解

    先来了解几个jQuery方法: <li></li> <li></li> <li></li> $("li") ...

  8. [Swift]字符串大小写转换,同时实现本地化或设置语言环境

    在NSString中提供了3种字符串大小写转换方式:1. 转换字符串大小写2. 转换字符串大小写,并实现本地化3. 转换字符串大小写,并设置语言环境. 一. 转换字符串大小写如果只是想单纯的将字符串进 ...

  9. Angularjs2 学习笔记

    angularjs2 学习笔记(一) 开发环境搭建   开发环境,vs2013 update 5,win7 x64,目前最新angular2版本为beta 17 第一步:安装node.js 安装nod ...

  10. KEY

    typedef struct st_key { uint key_length; /* Tot length of key */ ulong flags; /* dupp key and pack f ...