C# 标签打印示例 1
具体需求是:一个订单一页纸打印4行分录,如果超过4行,则再次按照原格式换纸打印,如果行数未满4行,则补空行。
一、实现步骤:
1、首先在EXCEL 画好模版 (后缀名是 .xlt )
2、在程序中调用EXCEL 填充数据
3、调用EXCEL打印方法打印
二、源码重点讲解:
1、List<> 泛型集合保存打印的数据,通过它可以删除已经打印过的数据
for (int i = 0; i <= list.Count; i++)
{
if (i > 0) i--; //每当执行完下一次的时候,将这个值初始化为0,即i--
if (nindex == Convert.ToInt32(pagesize)) break; //如果超过指定的行数,则跳出循环
FitemData model = list[i];
..........
list.Remove(model); //移除当前行
}
示例:
while (list.Count > 0)
{
PrintExccel(ref list, damountcount.ToString(), FirstPageText.ToString(), PageCount.ToString(), PageSize.ToString(), ref strmes);
FirstPageText++; }
=========================源码讲解==============================
/// <summary>
/// 打印方法
/// </summary>
/// <param name="dt">打印的数据</param>
/// <param name="strmes">bug返回的异常信息</param> private void Print(DataTable dt, ref string strmes)
{
List<FitemData> list = new List<FitemData>();
decimal damountcount = 0.00M; //合计小写金额
try
{
foreach (DataRow dr in dt.Rows)
{
FitemData model = new FitemData();
model.F_106 = dr["F_106"].ToString();
model.FAmount = Convert.ToDecimal(dr["FAmount"].ToString()).ToString("f2");
model.FPrice = Convert.ToDecimal(dr["FPrice"].ToString()).ToString("f2");
model.FUnitName = dr["FUnitName"].ToString();
model.Fdate = dr["fdate"].ToString();
model.Fbillno = dr["fbillno"].ToString();
model.FQty = dr["FQty"].ToString();
damountcount += Convert.ToDecimal((model.FAmount));
list.Add(model);
}
int PageSize = Convert.ToInt32(ConfigurationManager.AppSettings["PageSize"]); //每页行数
int PageCount = 0; //总页数
int FirstPageText = 1; //首页
PageCount = list.Count % PageSize > 0 ? list.Count / PageSize + 1 : list.Count / PageSize;
while (list.Count > 0)
{
PrintExccel(ref list, damountcount.ToString(), FirstPageText.ToString(), PageCount.ToString(), PageSize.ToString(), ref strmes);
FirstPageText++;
}
}
catch (Exception ex)
{
strmes = ex.Message;
}
}
/// <summary>
/// excel 打印
/// </summary>
/// <param name="list">总记录数</param>
/// <param name="damountcount">小写金额总计</param>
/// <param name="firsrpagetext">页码数</param>
/// <param name="pagesize">每页行数</param>
/// <param name="strmes">错误参数回写</param>
private void PrintExccel(ref List<FitemData> list, string damountcount, string firsrpagetext, string pagecount, string pagesize, ref string strmes)
{
try
{ int rowBase = 4,colBase = 1,rowIndex = rowBase,colIndex = colBase, nindex = 0; decimal dfamount = 0.0M;
Excel.Application excelapp;
excelapp = new Microsoft.Office.Interop.Excel.Application();
Excel.Workbook book = excelapp.Workbooks.Open(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"\ReportFile\Report.xlt",
Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
Excel.Worksheet st1 = (Excel.Worksheet)book.Worksheets[1]; // 选择的工作表,序号默认是从1开始即(Sheet0) st1.Cells[2, 2] = list[0].Fdate;
st1.Cells[2, 7] = list[0].Fbillno;
st1.Cells[3, 1] = "商品名称"; for (int i = 0; i <= list.Count; i++)
{
if (i > 0) i--;
if (nindex == Convert.ToInt32(pagesize)) break; //如果超过指定的行数,则跳出循环
FitemData model = list[i];
//复制格式 插入一个新行
Excel.Range range = (Excel.Range)st1.Rows[rowBase, Missing.Value];
range.Insert(Excel.XlInsertShiftDirection.xlShiftDown, Missing.Value);
st1.Cells[rowBase, colIndex] = model.F_106;
colIndex = colIndex + 2;
st1.Cells[rowBase, colIndex] = model.FUnitName;
colIndex++;
st1.Cells[rowBase, colIndex] = "'" + model.FQty;
colIndex++;
st1.Cells[rowBase, colIndex] = "'" + model.FPrice;
colIndex++;
st1.Cells[rowBase, colIndex] = "'" + model.FAmount;
rowBase++;
colIndex++;
rowIndex++;
colIndex = colBase;
dfamount += Convert.ToDecimal(model.FAmount);
nindex++;
list.Remove(model);
}
if (nindex < Convert.ToInt32(pagesize))
{
for (int i = 0; i < Convert.ToInt32(pagesize) - nindex; i++)
{
//复制格式 插入一个新行
Excel.Range range = (Excel.Range)st1.Rows[rowBase, Missing.Value];
range.Insert(Excel.XlInsertShiftDirection.xlShiftDown, Missing.Value);
rowBase++;
colIndex++;
rowIndex++;
colIndex = colBase;
}
}
Excel.Range rangedel = (Excel.Range)st1.Rows[rowIndex, Missing.Value];
rangedel.EntireRow.Delete(Excel.XlDeleteShiftDirection.xlShiftUp); //删除多余行 (即固定订单分录行数下多出的一行)
st1.Cells[rowIndex, 2] = "'" + damountcount; //dfamount.ToString("f2");
st1.Cells[rowIndex, 6] = "'" + dfamount.ToString("f2");
st1.Cells[rowIndex + 1, 2] = MoneyToUpper(Convert.ToDecimal(damountcount).ToString("f2"));
st1.Cells[rowIndex + 1, 7] = "第 " + firsrpagetext + " 联";
st1.Cells[rowIndex + 2, 7] = "共 " + pagecount + " 联";
excelapp.Visible = false; //不显示出来
string strprintpath = ConfigurationManager.AppSettings["PrinterName"]; //打印机名称
st1.PrintOut(Type.Missing, Type.Missing, Type.Missing, Type.Missing, strprintpath, Type.Missing, Type.Missing, Type.Missing); //直接打印
book.Saved = true;
excelapp.Workbooks.Close();
excelapp.Visible = false;
excelapp.Quit();
GC.Collect();
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
}
catch (Exception ex)
{
strmes = ex.Message;
}
}
C# 标签打印示例 1的更多相关文章
- PHPCMS 标签与示例
一.SEO优化: 获取栏目的关键字:{$SEO['keyword']} 获取栏目的描述:{$SEO['description']} 判断栏目的title是否存在或为空,如果是的话,则用站点的title ...
- Virgo标签打印
去年刚换新的公司,熟悉新的业务和代码,在修改公司打印标签的时候,感觉到无比烦躁与头痛.只因为不好维护,所有的标签打印,全部是GDI+绘制,每次修改微调,都只能全部运行才能看到效果.程序过大,编译过慢, ...
- 生鲜配送管理系统_升鲜宝V2.0 小标签打印功能【代配送商品打印小标签功能】说明_15382353715
小标签打印说明 小标签打印可以打印本系统的订单商品数量,也可以把外部的订单商品导入本系统进行打印. 打印本系统中的订单商品操作说明[上篇文章已经讲解相关的操作说明] 打印本系统之外的订单商品明细清单 ...
- 生鲜配送管理系统_升鲜宝V2.0 小标签打印功能说明_15382353715
小标签打印说明 小标签打印可以打印本系统的订单商品数量,也可以把外部的订单商品导入本系统进行打印. 打印本系统中的订单商品操作说明 1.1 界面说明 1.2 查询条件 1.2.1 ...
- java continue break 关键字 详解 区别 用法 标记 标签 使用 示例 联系
本文关键词: java continue break 关键字 详解 区别 用法 标记 标签 使用 示例 联系 跳出循环 带标签的continue和break 嵌套循环 深入continue ...
- JSTL中forEach标签应用示例【转】【补】
forEach样例 <%@ page language="java" import="java.util.*" pageEncoding="ut ...
- 使用FastReport报表工具生成标签打印文档
在我们实际开发报表的时候,我们需要按一定的业务规则组织好报表的模板设计,让报表尽可能的贴近实际的需求,在之前的随笔中<使用FastReport报表工具生成报表PDF文档>介绍了FastRe ...
- jsp的三种自定义标签 写法示例
1.自定义方法标签 引入方式示例: <%@ taglib prefix="fns" uri="/WEB-INF/tlds/fns.tld" %> 写 ...
- 让pre标签自动换行示例代码
pre 元素可定义预格式化的文本.被包围在 pre 元素中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre> 标签的一个常见应用就是用来表示计算机的源代码.对于技术博客经 ...
随机推荐
- iOS_SN_CoreData数据迁移
最开始使用CoreData的时候碰到一个问题,就是当增加一个字段的时候再次运行APP会发生崩溃,一开始不知道什么原因,只知道是里面的表结构发生改变,就重新删掉APP再次安装是可以运行的,这样调试完后觉 ...
- WPF采用MVVM模式(绑定:纯前台、命令:触发器绑定命令)
MVVM绑定 view-viewModel-model,模型介绍省略,就是创建类,添加字段封装属性.注:控件的绑定只能绑定到属性上,不能绑定到字段上: 接下来就是代码 (view): <Wind ...
- 求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字
#include <iostream> using namespace std; int main() {long long s,n,i,j,p;s=0; cin>>n; ...
- php生成批次唯一code(转)
/** * @param int $no_of_codes//定义一个int类型的参数 用来确定生成多少个优惠码 * @param array $exclude_codes_array//定义一个ex ...
- ecstore生成二维码
利用phpqrcode库生成二维码: /* *二维码添加 */ ////////////////////////////////////// /*引入文件*/ @include(APP_DIR.'/i ...
- css中“zoom:1”是什么意思
继承性: 无 兼容性: IE 基本语法 zoom : normal | number 语法取值 normal : 默认值.使用对象的实际尺寸 number : 百分数 | 无符号浮点实数.浮点实数 ...
- python 如何重新加载有修改过的模块(module)
写 Python 程序的时候,一边写模块一边调试.调试是在 Python 自身的命令行终端进行的.但当对模块里的代码进行修改后,在原调试终端上执行到模块中新修改上去的内容. 我之前是一直用退出再重新进 ...
- Selenium2Library关键字
对Selenium2Library关键字的整理和翻译.英文不好,仅供参考. 1.Add Cookie [ name | value | path=None | domain=None | secure ...
- PYTHON线程知识再研习F---队列同步Queue
让我们考虑更复杂的一种场景:产品是各不相同的.这时只记录一个数量就不够了,还需要记录每个产品的细节.很容易想到需要用一个容器将这些产品记录下来. Python的Queue模块中提供了同步的.线程安全的 ...
- 面试题 43 n 个骰子的点数
; void printfProbability(int number) { ) return; ]; p[] = ]; p[] = ]; memset(p[], , )); memset(p[], ...