C#调用EXCEL实现门诊电子病历的打印
2015-11-17刘德军
刘德军
摘要:该文针对医院信息建设中门诊电子病历的打印格式问题,通过调用EXCEL,用最简单方法来快速实现电子病历的格式化打印功能。
关键词:c#;EXCEL;电子病历;打印
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)24-0132-02
C# Call EXCEL to Achieve the Electronic Medical Records Of the Printing
LIU De-jun
(Sheyang County People's Hospital Information Branch, Yancheng 224300, China)
Abstract: This paper is aimed at the problem of the electronic medical record in hospital information construction, through calling EXCEL, using the most simple method to achieve the electronic medical records of the format printing function.
Key words: c#; EXCEL; electronic medical record; print
门诊病历是医务人员对门急诊患者疾病的发生、发展、转归,进行检查、诊断、治疗等医疗活动过程的按规定的格式和要求书写的记录。我院门诊病历电子化以后,电子病历的打印功能的实现势在必行。
经过对《病历书写规范》的认真研究,发现电子病历打印因多种内容、格式混合导致存在如下问题:① 病历行数不固定;② 打印位置控制复杂,有的左对齐,有的右对齐,有的居中;③ 跨页控制复杂,可能涉及一段文字中间换页;④ 字体格式控制;⑤ 如何做好病历防伪功能。
设计之初准备用C#控制处理打印,具体开发过程中发现很多问题,特别是页面控制处理起来相当复杂,而且达不到预想的效果。因此转变思路,改调用EXCEL,利用EXCEL的强大编辑和处理功能,解决了上述问题,顺利完成了系统的开发工作。
1 方法简介
要解决上述问题,必须实现以下几个功能:
1)按电子病历格式设计好EXCEL文件作为模板(包括字体大小、对齐方式、自动换行、页眉页脚、顶端标题行等);
2)创建一个EXCEL进程,并加载设计好的模板文件;
3)从系统调出相关的病历信息填写进对应单元格;
4)控制EXCEL打印出填写的内容,完成后关闭创建的EXCEL进程。
2 程序实现
2.1 准备工作
1)准备一张具有防伪底纹标志的背景图片,大小根据病历纸大小自行设置。
2)新建一个名为“门诊电子病历模板.xlsx”的EXCEL工作簿,只保留sheet1表。具体格式如表1。
3)创建一个C#Windows窗体应用程序。在“解决方案资源管理器”→“引用”右击→“添加引用”→“.NET”选项卡,选择组件名称为“Microsoft.Office.Interop.Excel”,版本号为“12.0.0.0”。
4)在程序命名空间中添加如下内容:
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Office.Interop.Excel;
using System.Data;
using System.Windows.Forms;
using System.Collections;
using System.Reflection;
2.2 程序主要代码
public int OmrPrint(string clinicNo,string id)
{ //clinicNo为病员就诊号, ID为病历序号,根据这两个参数查询门诊基本信息
ClinicRecordPrint.OracleLobData queryBase = new OracleLobData();
//根据病历ID查询门诊病历信息
DataSet dsMain = queryBase.DefineDataSet(id);
//根据挂号流水号查询诊断信息
DataSet dsDiag = queryBase.GetClinicDiag(clinicNo);
DataSet dsOrder = queryBase.GetClinicOrder(clinicNo);
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();//创建一个Excel进程
app.Visible = false; //不显示EXCEL界面,显示可方便调试
Workbooks wbks = app.Workbooks;
Workbook _wbk = wbks.Add(System.Windows.Forms.Application.StartupPath + @"\门诊电子病历模板.xlsx");//打开电子病历模板
Worksheet WS1 = (Worksheet)_wbk.Worksheets[1];//设置当前工作表
if (dsMain.Tables[0].Rows.Count > 0)
{//填写日期、科室、姓名、性别、病历号、主诉、现病史、既往史、过敏史、体检、辅助检查、处理意见,dsMain为患者病历信息记录集。
WS1.Cells[2, 1] = "日期:" + dsMain.Tables[0].Rows[0]["保存日期"].ToString() + " " + "科室:" + dsMain.Tables[0].Rows[0]["专科"].ToString() + " " + "姓名:" + dsMain.Tables[0].Rows[0]["姓名"].ToString() + " " + "性别:" + dsMain.Tables[0].Rows[0]["性别"].ToString() + " " + "病历号:" + dsMain.Tables[0].Rows[0]["门诊号"].ToString();
WS1.Cells[3, 2] = dsMain.Tables[0].Rows[0]["主诉"].ToString();
...(略)
WS1.Cells[9, 2] = dsMain.Tables[0].Rows[0]["处理意见"].ToString();}
else
{ return -1; }
//填写患者诊断信息
if (dsDiag.Tables[0].Rows.Count > 0)
{ try
{worksheet1.Cells[10, 2] = "初步诊断:";
int j = 1;
foreach (DataRow dr in dsDiag.Tables[0].Rows)
{if (j == 1)//单条诊断填写
{ worksheet1.Cells[10, 2] = " 初步诊断:" + dr[0].ToString();}
else
{ if (dsDiag.Tables[0].Rows.Count == j)//多条诊断中最后一条追加填写。
{worksheet1.Cells[10, 2] = " " + ((Microsoft.Office.Interop.Excel.Range)worksheet1.Cells[10, 2]).Text.ToString() + " " + dr[0].ToString();}
Else //多条诊断中间部分追加填写并加回车换行
{worksheet1.Cells[10, 2] = " " + ((Microsoft.Office.Interop.Excel.Range)worksheet1.Cells[10, 2]).Text.ToString() + " " + dr[0].ToString() + "\r\n";} }
j++;}}
catch (Exception ee)
{MessageBox.Show(ee.Message);
//后续处理:退出和释放
_wbk.Close(null, null, null);
wbks.Close();
//释放掉多余的excel进程
app.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
app = null; }}
else
{return -1; } }
//填写医生签名(ordIndex为增加的行)
WS1.Cells[12 + ordIndex, 2] = "医生签名:" + dsMain.Tables[0].Rows[0]["医生签名"].ToString();
WS1.Range[WS1.Cells[12 + ordIndex, 2], WS1.Cells[12 + ordIndex, 2]].HorizontalAlignment = 4;//右对齐
WS1.Cells.EntireRow.AutoFit();//自动调整所有行的行高
//屏蔽掉系统跳出的Alert
app.AlertBeforeOverwriting = false;
app.DisplayAlerts = false;
WS1.PrintOutEx(1, 1, 1, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);//打印病历
//后续处理:退出和释放
_wbk.Close(null, null, null);
wbks.Close();
//释放掉多余的excel进程
app.Quit();
app = null;
return 1; }
3 结束语
选择EXCEL,基于以下几点考虑:① 可设置底纹图片且可打印;② 可设置顶端标题行;③ 可自动调整行高;④ 模板格式编辑方便。本系统在windows XP,VS2010+office 2007环境下调试通过。
参考文献:
[1] 明日科技,C#从入门到精通[M]. 3版.清华大学出版社,2012.
[2] Nagel C, Evjen B.C#高级编程[M]. 李铭.译. 8版.清华大学出版社,2013.
[3] Walkenbach J.中文版Excel 2007高级VBA编程宝典[M]. 冯飞,焦瑜净,译.清华大学出版社,2011.