根据Word模板生成动态网页
总体设计思路:
1、 手工在Word模板内对应的填写位置放置书签,书签名为英文有意义的词语
2、 将Word通过office的另存功能保存为网页html
3、 去除垃圾属性,保留必要属性。由于生成的网页有很多无意义的样式属性。所以必须去除这些垃圾属性,同时保留必要的属性比如name、colspan、rowspan
4、 在网页中找到书签。以xml格式读取网页,找到含有name属性的节点即为书签节点
5、 根据书签的描述生成包含对应控件的用户控件ascx文件
6、 根据书签的名称,描述类型生成数据库表和字段
7、 生成和ascx文件对应的后台代码文件.cs文件
文档结构:
共有8个文件夹:
Codematic 动软代码类,此文件夹内的类均属于动软开源的生成BLL/DAL/Model的方法
Create文件 创建类 又分
Control创建控件类, 和控件相关的创建都放在该文件夹内
Page创建文件级类 包含创建前台ascx文件和后台代码,创建BLL/DAL/Model类
SQLData创建和数据库表和数据的类
Exception文件夹 异常类 定义一些已知的异常 暂未补充全
Filter文件夹 放置过滤HTML文本的类 该类包含一些过滤特定对象的函数
Global文件夹 该类放置一些公共的既定方法和类一边生成的文件使用和生成时使用
Office文件夹 和Office相关的类 目前就有一个OfficeToHtmlOperate.cs功能为将Word导出为Html文件
Sql文件夹 放置sql脚本
Xml文件夹 放置和xml相关的类 包括操作类和数据类
Word.cs文件主体类
具体设计文档
设计的主题流程类为Word类
Word.cs内的GetWordTextModel方法包含整个设置流程的框架思路
一共分为七步,其中五和七和到一起,每一个步骤都是调用单独的模块,各部分除了为xml服务的类(放在xml文件夹下的类文件)以外其他部分均不相关
1、第一步: 调用xml文件夹内方法
//1.1加载doc书签描述文档到bookmarks
LoadBookmarksByXml.Load(GetServerMapPath(filexml.XmlPath),bookMarks);
调用xml文件夹内方法将xml描述文档加载到BookMarks对象中,实现预加载
2、第二步 调用Office文件夹内方法
将word文件导出到对应的Html文档存放位置
OfficeToHTML(filexml.HtmlPath,filexml.DocPath);
注: 导出的HTML文档为GBK(简体中文)编码,需要将其转化为UTF8编码,否则生成出的网页在浏览器中会出现乱码
3、第三步过滤标签,保留必要的标签属性 调用Filter文件夹内方法
FilterHTML();
//过滤Html的标签属性
content = fh.filterAttribute(content);
//过滤无意义或空标签
content = fh.filterEmptyTags(content);
//过滤无意义的head头内容
content = fh.filterHead(content);
//过滤无意义的内容
content = fh.filterEmptyContent(content);
4、第四步
//4.1将控件文本放入Html中
FindBookMarkAndInsertControl(GetServerMapPath(filexml.HtmlPath));
使用操作xml的方法类来操作生成的HTML文档
1、递归遍历整个HTML文档书,找到存在name属性的节点,该节点即为Word中书签
2、找到和该节点对应的描述书签,然后根据书签调用CreateControl内的控件生成方法来得到控件前台文本,并将其插入到书签节点内
注:此处以插入文本的形式来插入控件文本,以该方式插入需要在方法FindBookMarkAndInsertControl执行结束后将HTML文本进行HtmlDecode。
5、第六步
//第六步 生成对应的数据库表
///生成sql建表的语句
CTDB.CreateTableText(filexml,bookMarks);
调用create/SQLData文件夹下的类,进行和数据库表和数据的预准备
//生成主体表
//生成基础数据表语句
//将基础数据加载到基础数据表
6、第五和七步
//第五步 第七步生成对应类型的前台页面
cp.Create(filexml, bookMarks, content);
分为:
//将前台文本保存为对应文件
File.WriteAllText(HttpContext.Current.Server.MapPath(fx.PagePath),pagecon,System.Text.Encoding.UTF8);
//将后台文本保存为对应的文件
File.WriteAllText(HttpContext.Current.Server.MapPath(fx.PagePath + ".cs"), behindcode,System.Text.Encoding.UTF8);
生成BLL,DAL,Model文件
cb.createBllCode(bmks, fx, HttpContext.Current.Server.MapPath("App_Code"));
cd.createBllCode(bmks, fx, HttpContext.Current.Server.MapPath("App_Code"));
cm.createdalCode(bmks, fx, HttpContext.Current.Server.MapPath("App_Code"));