辽宁省高速公路桥梁安全监测月度报告生成系统研究

2021-01-19 06:27:54
北方交通 2021年1期
关键词:月度文档模板

王 超

(辽宁省交通规划设计院有限责任公司公路养护技术研发中心 沈阳市 110111)

针对当前辽宁省安全监测系统中,依靠人工做成月度报告存在的效率低、容易出错的问题,提出一套highcharts结合phantomjs的技术方案,开发了辽宁省高速公路桥梁安全监测系统月度报告生成系统,解决了需要通过前端网页请求才能生成安全监测月度数据统计图片,使安全监测月度报告通过程序自动生成,提高了报告做成的效率,对安全监测系统的推广应用提供了保障。

1 需求分析

多年来,桥梁结构的安全状况一直是公众特别关心的问题。桥梁结构在服役期间,不可避免地要受到自然环境(大气腐蚀、温湿度变化、地震、风)和使用环境(荷载作用频率增加、材料与结构的疲劳)的影响,必然会逐渐产生损坏现象,进而导致自身结构性能降低,可能导致桥梁发生倒塌等事故;在桥梁上安装安全监测系统,是指利用现场安装的且对结构安全无损的传感器元件,对桥梁结构进行长期的在线监测,实时地监控桥梁结构的运营状态,并做成月度报告和年度报告对桥梁上所有传感器的变化趋势进行展示和分析,及时客观地评价桥梁结构的状况,进一步提高桥梁的运营安全性。

在安装安全监测系统时,会在桥梁的不同位置上安装很多传感器,如图1所示。

图1 安全监测系统传感器布置图

做桥梁安全监测月度报告的时候,需要技术人员登录桥梁安全监测管理系统,手动查询每个传感器的月度的数据变化图,并且收集每个月传感器典型日的特定时间的数据,做成对比表格,将传感器变化图和数据对比表格添加到Word中。随着安装安全监测系统的桥梁数量越来越多,人工做成安全监测月度报告效率低,容易出错的缺陷越来越突出,如何提高安全监测月度报告的做成效率成为亟待考虑和解决的问题。

2 系统设计思路

MicoSoft Word提供的强大的编程接口技术使得我们利用编程工具通过程序对Word进行控制,自动添加数据生成报告成为了可能:添加COM引用,将word的类库DLL组件导入到C#.net中,在源代码中引入相应的命名空间,这样就可以调用各种Word的操作函数。

生成桥梁安全监测月度报告的时候,主程序首先需要创建一个空白的Word文档,将模板中的内容拷贝到空白Word文档中,模板通过书签规定了不同类型传感器数据在Word中的放置位置,根据用户选择的桥梁,连接部署该桥梁安全监测系统的下位机,从下位机中取得所有传感器的月度数据,利用phantomjs[1],将传感器的月度数据生成统计图片,再利用Word类库组件中的操作函数[2],将统计图片插入到文档对应位置中,然后再将传感器典型日的特定时间的数据,利用Word类库组件中的操作函数,做成对比表格插入到Wrod文档中,完成后,将安全监测报告保存到服务器端以便用户下载使用,系统处理流程如图2所示。

图2 安全监测报告生成流程

以上便是安全监测报告生成的主要逻辑框架,在下一节中将具体说明主要部分的实现方法。

3 系统实现

根据系统设计,生成桥梁安全监测月度报告主要包含了如下的几个操作:创建打开Word空白文档,拷贝模板数据[3];通过定位书签位置确定月度数据统计图需要插入的Word中的位置;取得传感器月度数据,生成统计图,插入到Word中;插入典型日的对比数据表格;关闭及下载安全监测报告,下面分别介绍这些操作的实现方法。

3.1 创建Word文档

创建、获取一个Word文档对象是对Word操作的基础,再生成Wrod报告的时候,需要首先在内存中创建一个Word文档对象,关键的调用函数如下:

using MsWord =Microsoft.Office.Interop.Word;

MsWord.Application WordApp = new MsWord.ApplicationClass();

使用Word文档对象,创建一个Word文档,关键的调用函数如下:

MsWord.Document WordDoc = WordApp.Documents.Add(missing, missing, missing, missing);

将监测报告模板中的内容拷贝到新建的Wrod文档中,并打开Word文档,关键的调用函数如下:

File.Copy(TemplateFile, FileName);

WordDoc = WordApp.Documents.Open(Obj_FileName, missing, ReadOnly, missing);

WordDoc.Activate();

3.2 定位书签的位置

程序使用了Word的标签将不同传感器数据插入到检测报告不同的位置,向监测报告模板中添加标签的方法:将光标定位在监测报告文档相应的位置,然后选择Word菜单中的“插入”->“书签”,定义书签名,点击“添加”按钮,书签添加成功,这里需要注意,“书签名”是书签的唯一标识,不允许重复。

定位书签位置的时候,首先需要取得书签名,即首先确定当前的数据或者图片需要添加在监测报告的位置,调用Word文档对象定位书签位置,关键的调用函数:

object BookMarkName = strBookMarkName;

WordDoc.ActiveWindow.Selection.GoTo(ref what, ref missing, ref missing, ref BookMarkName);

3.3 向文档中插入月度图片

安全监测系统中使用highcharts插件进行图表展示[4],人工做成安全监测月度报告时,通过操作安全监测系统中的按钮来向后台发起请求,后台获取到图片的SVG信息时,生成对应的图片,也就是说图片生成必须依赖前端来触发。

自动生成安全监测报告时,没有系统前端,如果通过模拟前端自动向后台发送请求,效率非常的差。经过充分的调研,系统通过引入phantomjs来解决这个问题,它是个javascript引擎库,基于webkit内核,能解析前台的HTML及javascript并生成对应的图片,而且能够以服务的形式独立运行在后端,不需要前端触发。

调用phantomjs的关键函数如下:

Process p = new Process();

p.StartInfo.FileName=System.AppDomain.CurrentDomain.BaseDirectory+"jsphantomjs.exe";

string ExcuteArg = System.AppDomain.CurrentDomain.BaseDirectory + "jshighcharts-convert.js-infile " + infile + "-outfile " + outfile + "-scale 2.5-width 300-constr Chart";

p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;

infile是输入图片的参数,是json文件,将json的路径传入,phantomjs会根据 highcharts-convert.js 去解析json文件生成图片,json模板文本格式比较常见,由于篇幅限制不再列出。

首先连接部署该桥梁安全监测系统的下位机,从下位机中取得传感器的月度数据,替换json模板文件中的数据,以温度传感器SCT001为例,统计数据图中的横坐标为时间,需要将时间按如下格式′(1-1)0:00:00′添加到json模板文件的xAxis-> categories标签中,该传感器的采集频率为1min,下一条数据为′(1-1)0:01:00′,依次类推,以“,”分割数据;统计数据图中的纵坐标为温度,取得横坐标所有时刻对应的温度数据,添加到json模板文件的series-> data标签中,在更新完横坐标和纵坐标的数据后,还需要取得纵坐标中所有温度数据的最大值和最小值,加权后,添加到json模板文件的gridLineDashStyle-> max/min标签中,如何不设置这个内容,会因为图中显示的最大值/最小值过大,导致统计数据是一条横线,看不出变化趋势。

做成json文件后,调用phantomjs.exe 传入图片生成的路径、json文件,即可在指定的路径下,生成如图3所示的图片:

图3 传感器月度数据统计图

接下来,取得要插入统计数据图片位置的书签名,调用Word文档对象将生成的图片插入到对应位置,调用的关键函数:

WordDoc.Application.ActiveDocument.InlineShapes.AddPicture(outfile, ref LinkToFile, ref SaveWithDocument, ref Anchor);

生成月度图片添加到Word文档中的详细处理流程如图4所示。

图4 生成图片流程图

需要说明的是:将WebService部署到IIS上时,IIS上通常运行的账户是“NetWork Service”,权限比较小,使用账户“NetWrok Service”无法正常启动phantomjs.exe进程生成统计数据图片,所以需要将IIS程序池中运行账户修改为管理员。修改IIS程序池中运行账户的方法:打开IIS,选择你要更改的应用程序池,右键选择“高级设置”,“标识”,“自定义账户”,“设置”,输入本机中有管理员权限的用户即可。

3.4 向Word文档中插入表格及文字

向Word中插入文字的方法比较简单,调用Word文档对象TypeText函数即可,调用的关键函数如下:

WordDoc.ActiveWindow.Selection.TypeText(reader["PictureName"].ToString());

向Word中插入一个二维表格,其形式如表1所示:

表1 典型时刻数据统计表格

首先根据表格的行数和列数,在文档的光标位置插入一个二维表格,调用的关键函数如下所示:

Microsoft.Office.Interop.Word.Table newTable = WordDoc.Tables.Add(WordApp.Selection.Range, iRowCount, iColumnCount, ref missing, ref missing);

创建表格后,循环遍历每一行,对当前行中各个列的数据设置内容,调用的关键函数如下所示:

for(int iLoop = StartRowIndex + 1; iLoop <= iRowCount; iLoop++)

{

newTable.Cell(iLoop, 1).Range.Text =(iCurrentMonth).ToString()+ "月";

newTable.Cell(iLoop, 2).Range.Text = strSensorName;

newTable.Cell(iLoop, 3).Range.Text = listFittingContainer2.First().Value.YValue;

}

在对单元格合并的时候,记录开始单元格位置和结束单元格位置,直接进行合并,则会将从开始单元格位置到结束单元格位置的所有单元格合并成一个单元格,关键函数如下:

newTable.Cell(1, 1).Merge(newTable.Cell(1, 3));

3.5 关闭Word文档及下载Word文档

在报告做成之后,需要关闭Word文档,关键的调用函数:

WordDoc.Close(ref missing, ref missing, ref missing);

WordApp.Quit(ref missing, ref missing, ref missing);

然后将Word保存在服务器的指定位置,用户在使用的时候,需要下载到本地,下载Word文档的关键的调用函数:

FileInfo fileInfo = new FileInfo(FileName);

Response.WriteFile(fileInfo.FullName);

Response.Flush();

本文列举的所有程序使用Visual Studio 2010和Micosoft word2007调试通过。

4 结束语

利用C#.net开发工具可以高效地操作Word文档,为自动生成专业格式的Word报告提供了可能,本文利用highcharts结合phantomjs,以服务的形式独立运行在后端,不需要前端触发即可生成传感器的月度数据统计图片,然后利用C#.net对Word的控制技术,向Word报告中插入传感器数据统计图片和变化统计表格,自动生成辽宁省公路桥梁安全监测月度报告。解决了人工做成桥梁安全监测月度报告效率低,容易出错的问题,为安全监测系统的推广应用提供了有效的保障。

猜你喜欢
月度文档模板
铝模板在高层建筑施工中的应用
铝模板在高层建筑施工中的应用
有人一声不吭向你扔了个文档
基于RI码计算的Word复制文档鉴别
铝模板在高层建筑施工中的应用
Persistence of the reproductive toxicity of chlorpiryphos-ethyl in male Wistar rat
城市综改 可推广的模板较少
中国卫生(2015年9期)2015-11-10 03:11:10
月度聚焦
中国记者(2015年8期)2015-05-09 08:30:35
月度聚焦
中国记者(2014年4期)2014-05-14 06:04:39
月度聚焦
中国记者(2014年9期)2014-03-01 01:44:22