Virgo标签打印

去年刚换新的公司,熟悉新的业务和代码,在修改公司打印标签的时候,感觉到无比烦躁与头痛。只因为不好维护,所有的标签打印,全部是GDI+绘制,每次修改微调,都只能全部运行才能看到效果。程序过大,编译过慢,这个修改过程真的是痛不欲生。

经过半年的调查,和整理,准备做个标签打印的配置工具,现在已经完成了大半,基本可用,准备将新版本程序嵌入这个标签工具,以方便日后标签的维护。

 

下面介绍下这个工具:

  1 工具采用GDI+绘制,利用xml保存配置文件。这里我们叫它《标签配置文件

   主要包括String,Image,Table Line,四个标签样式,通过图形化处理,拖拽方式设置位置。

   每个标签都有自己一系列的属性,通过属性面板可以设置对应的属性,例如String的Font。

 

  2 工具配置数据绑定

  考虑到直连数据库的问题,我没有直接绑定到数据库,而是采取读取另外一个配置文件 (这里我们叫它《数据配置文件》)。将对应的数据的ID绑定到标签配置配置文件中去。第三方调用的时候通过工具自带方法先《数据配置文件》 

  生成配置文件的对象。第三方更具他本身的条件对这个对象进行赋值,

 

  3 生成标签并且打印

   第三方生成数据对象后,读取需要打印的标签配置文件,传入工具自带方法,并且开始打印。

下面提供些工具截图和代码。

 

 

标签配置文件

<DrawReport Color="White" Size="800,700" NowBindFileDescription="" ID="">
<DrawLine StartPoint="81,44" EndPontY="231,44" PenW="1" LineColor="Black" />
<DrawImage Point="54,62" Size="200,87" Image="" NowBindFileDescription="" ID="" />
<DrawString Font="宋体, 12pt" Point="100,13" Width="0" Margin="4" IsRectangleF="False" Formart="名称:{0}" NowBindFileDescription="" ID="" />
<DrawImage Point="98,134" Size="114,164" Image="" NowBindFileDescription="" ID="" />
</DrawReport>
数据配置文件
<?xml version="1.0" encoding="utf-8"?>
<Report Note="Name为其他系统识别标识,SysName为本系统绑定数据显示标识。此文件应该不断完善,后期改动比较小
        在配置的时候需要读取某个节点。绑定到ID,
        第三方调用时  这里填入对应的数据,
        打印的时候将这里数据对应的到界面上去。
        ">



  <Type Name="用户标签"  ID="Type004">
    <String ID="S00001" SysName="名称" Name="用户名称" Note=" " Value="" />
    <String ID="S00002" SysName="条码" Name="用户条码" Note=" " Value="" />
    <Image ID="I00001" SysName="条码" Name="用户条码" Value="这里应该填入二进制"  />
  </Type>

  <Type Name="科室标签"  ID="Type005">
    <String ID="S00001" SysName="名称" Name="科室名称" Note=" " Value="" />
    <String ID="S00002" SysName="条码" Name="科室条码" Note=" " Value="" />
    <Image ID="I00001" SysName="条码" Name="科室条码" Value="这里应该填入二进制"  />
  </Type>

  

  <Type Name="测试"  ID="Type008">
    <String ID="S00001" SysName="产品类型" Name="产品类型" Note="打印包名称" Value="" />
    <String ID="S00002" SysName="产品名称" Name="产品名称" Note=" " Value="" />
    <String ID="S00003" SysName="包条码" Name="包条码" Note=" " Value=""  />
    <String ID="S00004" SysName="回收数量" Name="回收数量" Note=" " Value="" />
    <String ID="S00005" SysName="配包人" Name="配包人" Note=" " Value="" />
    <String ID="S00006" SysName="审核人" Name="审核人" Note=" " Value="" />
    <String ID="S00007" SysName="失效日期" Name="失效日期" Note=" " Value="" />
    <String ID="S00008" SysName="灭菌日期" Name="灭菌日期" Note=" " Value=""/>
    <Table Name="器械明细" ID="Table001" >
      <Columns>
        <Column ID="T001" SysName="器械名称"  Name="器械名称"   />
        <Column ID="T002" SysName="器械数量" Name="器械数量"   />
        <Column ID="T003" SysName="器械类型" Name="器械类型"   />
        <Column ID="T004" SysName="器械条码" Name="器械条码"   />
      </Columns>
    </Table>
    <Image ID="I00001" SysName="医院Logo" Name="医院Logo" Value="这里应该填入二进制"  />
    
    <Image ID="I00003" SysName="包条码" Name="包条码" Value="这里应该填入二进制"  />

  </Type>

</Report>

  

第三代调用

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Virgo.ReportPrint;
using Virgo.ReportPrint.Common;

namespace Virgo.Demo40
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void buttonPrint_Click(object sender, EventArgs e)
        {
            System.Xml.XmlDocument xml = GetXml();

            if (xml != null)
            {
                ReportData rd = ReportData.InitReportData();
                //开始给rd赋值
                LoadReportData(rd);

                Virgo.ReportPrint.Print print = new Print();


                print.PrintReport(rd, xml);
            }
            else
            {
                MessageBox.Show(this, "请选择对应的配置文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
        private void btnPrintShow_Click(object sender, EventArgs e)
        {
            System.Xml.XmlDocument xml = GetXml();
            if (xml != null)
            {
                ReportData rd = ReportData.InitReportData();
                //开始给rd赋值
                LoadReportData(rd);
                Virgo.ReportPrint.Print print = new Print();
                print.PreviewReport(rd, xml);
            }
            else
            {

                MessageBox.Show(this, "请选择对应的配置文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

        }

        private System.Xml.XmlDocument GetXml()
        {
            OpenFileDialog fileDialog = new OpenFileDialog();
            fileDialog.Multiselect = true;
            fileDialog.Title = "请选择文件";
            fileDialog.Filter = "配置文件(*.xml)|*.xml";
            if (fileDialog.ShowDialog() == DialogResult.OK)
            {
                string file = fileDialog.FileName;
                System.Xml.XmlDocument xml = new System.Xml.XmlDocument();

                xml.Load(file);
                return xml;
            }

            return null;
        }
        private void btnDesgin_Click(object sender, EventArgs e)
        {

            Virgo.ReportPrint.frmDesign fd = new Virgo.ReportPrint.frmDesign();
            fd.ShowDialog(this);


        }

        private void LoadReportData(ReportData rd)
        {
            foreach (ReportType rt in rd.ListReportType)
            {
                switch (rt.Name)
                {
                    case "包标签":
                        LoadReportTypePackage(rt);
                        break;
                    case "灭菌标签":
                        break;
                    default:
                        break;
                }
            }
        }

        /// <summary>
        /// </summary>
        /// <param name="rt"></param>
        private void LoadReportTypePackage(ReportType rt)
        {
            foreach (KeyValuePair<string, ReportString> key in rt.DicReportString)
            {

                switch (key.Value.Name)
                {
                    case "包名称":
                        key.Value.Value = "测试的包名称";
                        break;
                    case "产品名称":
                        key.Value.Value = "测试的产品名称";
                        break;
                    case "包条码":
                        key.Value.Value = "600201709130524";
                        break;
                    case "包类型":
                        key.Value.Value = "测试的类型";
                        break;
                    case "配包人":
                        key.Value.Value = "言护士";
                        break;
                    case "灭菌人":
                        key.Value.Value = "张护士";
                        break;
                    case "生产日期":
                        key.Value.Value = "2017-09-26 09:56";
                        break;
                    case "灭菌日期":
                        key.Value.Value = "2017-09-25 09:56";
                        break;
                    default:
                        break;
                }

            }

            foreach (KeyValuePair<string, ReportImage> key in rt.DicReportImage)
            {
                switch (key.Value.Name)
                {
                    case "医院Logo":
                        key.Value.Value = Image.FromFile(@"F:\测试图片\1.jpg").ConvertToString();
                        break;
                 
                    case "包条码":

                        key.Value.Value = Image.FromFile(@"F:\测试图片\A.png").ConvertToString();
                        break;
                    default:
                        break;
                }
            }

            ReportTableRow rtr = null;
            foreach (KeyValuePair<string, ReportTable> key in rt.DicReportTable)
            {
                switch (key.Value.Name)
                {
                    case "器械明细":  //器械明细表

                        if (key.Value.ListReportTableRow == null)
                            key.Value.ListReportTableRow = new List<ReportTableRow>();

                        for (int i = 0; i < 5; i++)
                        {
                            rtr = new ReportTableRow("0", key.Value.DicReportTableColumn);

                            foreach (KeyValuePair<string, ReportTableColumn> key1 in rtr.DicReportTableColumn)
                            {
                                switch (key1.Value.Name)
                                {
                                    case "器械名称":
                                        key1.Value.Value = "测试名称" + i.ToString();
                                        break;
                                    case "器械数量":
                                        key1.Value.Value = ReportCommon.GetRandKey(1, 999).ToString();
                                        break;
                                    case "器械类型":
                                        key1.Value.Value = "类型" + i.ToString();
                                        break;
                                    case "器械条码":
                                        key1.Value.Value = "600000000" + i.ToString();
                                        break;
                                    default:
                                        break;

                                }
                            }

                            key.Value.ListReportTableRow.Add(rtr);
                        }

                        break;
                    default:
                        break;
                }
            }


        }




    }
}

  

  第一次写,不要喷!,不足之处共同学习。

                 谢谢!

 

posted @ 2017-10-15 19:07  Virgo.App_jsp  阅读(176)  评论(0)    收藏  举报