按照已有的模板输出<一>

普通的发票基本上都是固定模式,所以我们一般写好固定的模板,把其中需要变动的地方,以特定符号来代替。每次打印发票的时候,只需将其中的特定符号转换成我们需要显示的数据。。。

1)  新建一个txt格式的发票模板,如图6.1 发票模板:

图6.1 发票模板

1)我现在模拟相同情况,编写一个对象实体并赋值

Public class  FaPiao{

//合同号

public string Contract { get; set; }

//姓名

public string Name { get; set; }

//站点

public string Site{ get; set; }

//级别 金额等的集合

public List<LevelAndPrice> LevelandPrice{ get; set; }

//总净重

public Decimal Net{ get; set; }

//总皮重

public Decimal Tare{ get; set; }

//总毛重

public Decimal Gross{ get; set; }

//总金额

public Decimal Money { get; set; }

//流水号

public int  Serial{ get; set; }

//当前页数

public int  Page{ get; set; }

//总页数

public int  Pages{ get; set; }

//磅码员

public string   Weighter{ get; set; }

//定级员

public string   Levelter{ get; set; }

//终端

public string   Line{ get; set; }

}

Public  class  LevelandPrice {

//合同号

public string   Contract{ get; set; }

//级别

public string   Level{ get; set; }

//净重

public  Decimal Weight{ get; set; }

//金额

public  Decima  Price{ get; set; }

}

给实体赋值,这里我就不赋值了 。根据实际情况赋值就好。

2)给模板变量赋值

/// <summary>

/// 烟叶收购过磅单模板

/// </summary>

/// <param name="templeteFilePath">模板文件路径</param>

/// <param name=" fapiao ">发票对象</param>

/// <param name=" currentPage ">当前页</param>

/// <param name=" totalPage ">总页数</param>

/// <returns> </returns>

Public  static  string[] GetGdb(string templeteFilePath, FaPiao fapiao, int currentPage, int totalPage)

{

//获得模板

StreamReader objReader = new StreamReader(templeteFilePath, Encoding.UTF8);

//将模板的按照每一行存入到一个string集合中。

string line;

List<string> contents = new List<string>();

while ((line = objReader.ReadLine()) != null)

{

contents.Add(line + "\n");

}

//现在我们需要考虑一下Level,weight,price。因为这个地方一般来说不会只显示一行值,可能有多行值,相当于我们去超市买商品所打的发票,我们买很多商品就会列出很多条目。这是一个动态的。现在我们的考虑如何给这部分动态的赋值。

//查找到level在模板中是第几行,转换来就是查找出在contents集合中的位置,因为上一步代码我们已经按照行数将模板内容存在了contents集合中了。

var index = contents.FindIndex(p => p.Contains("{level}"));

//查找出这一行的模板内容,就是已经找到level所在的行的内容,就是我们需要查找的{level}    {weight}    {price}

var template = contents[index];

//去掉模板中的这一行内容

contents.RemoveAt(index);

//循环给{level}    {weight}    {price}循环赋值,将这动态的几行添加到模板中去。

List<LevelAndPrices > levelandPrices= fapiao.LevelandPrice;

for (int i = 0; i < levelandPrices.Count; i++)

{//级别

var tmp = template.Replace("{level}", levelandPrices[i].Level);

//净重

tmp = tmp.Replace("{weight}", levelandPrices[i].Weight.ToString("0.00"));

//金额

tmp = tmp.Replace("{price}", levelandPrices[i].Price.ToString("0.00"));

contents.Insert(index + i, tmp);

}

//循环部分已经添加完成了,现在给模板剩余部分添加数据

string allLine = string.Empty;

for (int i = 0; i < contents.Count - 2; i++)

{

allLine += contents[i];

}

//合同()

allLine = allLine.Replace("{contract}", fapiao.Contract);

//姓名

allLine = allLine.Replace("{name}", fapiao.Name);

//站点

allLine = allLine.Replace("{site}", fapiao.Site);

//打印时间

allLine = allLine.Replace("{date}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

//总净重

allLine = allLine.Replace("{net}", fapiao.Net.ToString("0.00"));

//总皮重

allLine = allLine.Replace("{tare}", fapiao.Tare.ToString("0.00"));

//毛重

allLine = allLine.Replace("{gross}", fapiao.Gross.ToString("0.00"));

//金额

allLine = allLine.Replace("{money}", fapiao.Money.ToString("0.00"));

//流水号

allLine = allLine.Replace("{serial}", fapiao.Serial);

//磅码员

allLine = allLine.Replace("{weighter}", fapiao.Weihter);

//定级员

allLine = allLine.Replace("{levelter}", fapiao.Levelter);

//终端

allLine = allLine.Replace("{line}", fapiao.Line);

//当前页

allLine = allLine.Replace("{page}", currentPage.ToString());

//总页

allLine = allLine.Replace("{pages}", totalPage.ToString());

//最后一页加几个换行符,多打印几行

return new[] { allLine, contents[contents.Count - 1]+"\n\n" };

}

GetGdb方法已经给模板中的所有的变量赋值,如果要看打印的效果,直接循环引用GetGdb()方法,循环输出每一行查看效果。。。如果要将这个模板发送给打印机,在和打印机约定好协议后,只需要将string[]转化成为二进制流或者GB2312发送给打印机即可,这要看打印机方需要那种格式。

按照已有的模板输出<一>(如发票)的更多相关文章

  1. 按照已有的模板打印小票<二> ——调用windows打印机打印 可设置字体样式

    按照已有的模板打印小票<二> ——调用windows打印机打印 可设置字体样式 之前写过一篇文章<按照已有的模板输出一(如发票)>,是关于如何给已有的模板赋值.在项目的实践过程 ...

  2. thinkphp二维数组模板输出方法

    thinkphp二维数组模板输出方法 先写个记录,有空再整理发上来

  3. 《如何让TT T4模板输出多个文件(VS2010中)》-- access911.net 文章

    <如何让TT T4模板输出多个文件(VS2010中)>-- access911.net 文章   问题:   VS2010中自带的 TT 模板功能挺好用,但是如何定义其输出的目录,或者如何 ...

  4. 已有模板与tp框架的结合 (前台)

    已有模板与tp框架的结合 具体步骤   A.复制模板文件到view指定目录 B. 复合css .js.img.静态资源文件到系统指定目录 C. 把静态资源(css,js,img)文件的路径设置为“常量 ...

  5. 【Thinkphp5】解决模板输出时间戳自动转换为时间格式的问题

    背景: 数据库存储时间为时间戳,格式为varchar,模板输出时未进行时间格式化却输出了时间格式 如下图 (数据库存储的时间戳) (页面输出的时间) (未进行格式化的时间代码) (格式化后的时间代码) ...

  6. 谈谈 Act 的依赖注入 和 模板输出 - 回答 drinkjava 同学提问

    1. 背景 依赖注入工具 jBeanBox 的作者 drinkjava 同学最近在 Actframework gitee 项目 的提出了如下评论: 你这个DI工具的出发点可能有问题,一个MVC工具为什 ...

  7. Django模板输出Dict所有Value的效率问题

    一次跑偏之旅!   对于一个惯用C++的人来说,使用Python这种语言的一大障碍就是许多集合类型的操作效率并不如传统的经典数据结构那样直观可见,以及许多实际上涉及到内存分配.对象复制之类的耗时操作被 ...

  8. thinkphp5.0 模板输出常用内容

    1.在模板获取session和cookie等全局变量 {$Think.session.user_id}//输出$_SESSION['user_id']变量 2.获取请求信息 {$Request.con ...

  9. 已有模板与tp框架结合

    具体实现步骤: ①复制模板文件到view指定文件目录: ②复制css.js.img到view指定文件目录: ③把静态资源(css.js.img)文件的路径设置为“常量”信息(在index.php入口文 ...

随机推荐

  1. mongodb分片(七)

    1.插入负载技术分片架构图 2.片键的概念和用处 看下面这个普通的集合和分片后的结果 3.什么时候用到分片呢? 3.1机器的磁盘空间不足 3.2单个的mongoDB服务器已经不能满足大量的插入操作 3 ...

  2. **Python的函数参数传递 和 global

    函数的参数到底是传递的一份复制的值,还是对内存的引用? 我们看下面一段代码: a = [] def fun(x): x.append(1) fun(a) print(a) 想想一下:如果传递的是一份复 ...

  3. <转>UNIX 共享内存应用中的问题及解决方法

    http://www.ibm.com/developerworks/cn/aix/library/au-cn-sharemem/ 共享内存是一种非常重要且常用的进程间通信方式,相对于其它IPC机制,因 ...

  4. Sqlserver2005中的varchar,varchar,char,nchar的比较

    C#窗体中的TextBox 的MaxLength:与Nvarchar类似,不论是什么,最多只能为2.我我11我1

  5. 前端开发之JavaScript HTML DOM实战篇

    实战案例一: “灯泡发光” <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  6. FreeSWITCH 使用SSL-WebSocket-WebRTC

    阿里上买的域名, 申请了个免费ssl, 然后开始折腾,,,, 申请了ssl证书, 但是不提供 .pem 格式的下载(*/ω\*) 然后 把一堆 提供的 都下载下来了,  然后 又到网上 搜 crt/c ...

  7. linux fg&bg

    [linux fg&bg] Linux 提供了 fg 和 bg 命令,让我们调度正在运行的任务. 假设你发现前台运行的一个程序需要很长的时间,但是需要干其他的事情,你就可以用 Ctrl-Z , ...

  8. centos7 更新源 安装ifconfig

    centos7最小化安装后,ifconfig是不可用的,可以使用ip addr或ip link查看网络信息. 更新源之前,先确定网络是否连通.我用的虚拟机,因为桥接受公司ip限制,换成了NAT模式,确 ...

  9. Java方法重写与super关键字

    ----------siwuxie095                     方法的重写:     (1)在继承中也存在着重写的概念,其实就是子类定义了和父类同名的方法     (2)定义:方法名 ...

  10. 钉钉开发笔记(5)android系统中html软键盘的适配

    最近项目中发现个别Android手机中存在弹出的软键盘会遮挡输入框的现象,最后自己写了一个方法(如下),问题基本解决. 记录下来,防止忘记.有什么不对的地方欢迎指正.O(∩_∩)O 1 //键盘适配 ...