一:c#代码直接打印pdf文件(打印质保书pdf文件)
引用:
代码注释很详细了。
private void btn_pdf_click(object sender, routedeventargs e) { string filepath = system.appdomain.currentdomain.setupinformation.applicationbase + "resource\\川ax5572 904080d005000.pdf"; printshow(filepath); } /// <summary> /// 打印的代码 /// </summary> /// <param name="url">要打印的pdf路径</param> private int printshow(string url) { int isok = 0; pdffile file = pdffile.open(url); printersettings settings = new printersettings(); system.drawing.printing.printdocument pd = new system.drawing.printing.printdocument(); settings.printername = "npi84ffaf (hp laserjet mfp m436)"; // 打印机名称 settings.printtofile = false; //设置纸张大小(可以不设置,取默认设置)3.90 in, 8.65 in papersize ps = new papersize("test", 4, 9); ps.rawkind = 9; //如果是自定义纸张,就要大于118,(a4值为9,详细纸张类型与值的对照请看http://msdn.microsoft.com/zh-tw/library/system.drawing.printing.papersize.rawkind(v=vs.85).aspx) o2s.components.pdfrender4net.printing.pdfprintsettings pdfprintsettings = new o2s.components.pdfrender4net.printing.pdfprintsettings(settings); pdfprintsettings.papersize = ps; pdfprintsettings.pagescaling = o2s.components.pdfrender4net.printing.pagescaling.fittoprintermarginsproportional; pdfprintsettings.printersettings.copies = 1; try { file.print(pdfprintsettings); isok = 1; } catch (exception) { isok = -1; throw; } finally { file.dispose(); } return isok; }
二:先生成excel在调用打印(生成excel主要在于布局)
按钮事件代码:
private void btn_zbs_click(object sender, routedeventargs e) { // 准备好数据 list<dynamicmodel> dm = new list<dynamicmodel>() { new dynamicmodel(){batchnumber="319040027",relmpa = "470",rmpa = "655",a="29.0",agt = "16.0",rmrel = "1.40",relrel = "1.18",directbendingone="",resultone = "",directbendingtwo = "i", resulttwo = "合格", metallography = "合格", weightdeviation="合格", surfacequality="合格", sizeandappearance="合格", packing="合格", }, new dynamicmodel(){batchnumber="319040027",relmpa = "450",rmpa = "650",a="27.0",agt = "15.4",rmrel = "1.45",relrel = "1.13",directbendingone="",resultone = "",directbendingtwo = "i", resulttwo = "合格", metallography = "合格", weightdeviation="合格", surfacequality="合格", sizeandappearance="合格", packing="合格", }, new dynamicmodel(){batchnumber="319040027",relmpa = "435",rmpa = "640",a="28.0",agt = "15.7",rmrel = "1.47",relrel = "1.09",directbendingone="",resultone = "",directbendingtwo = "i", resulttwo = "合格", metallography = "合格", weightdeviation="合格", surfacequality="合格", sizeandappearance="合格", packing="合格", }, new dynamicmodel(){batchnumber="319040027",relmpa = "460",rmpa = "645",a="26.0",agt = "16.2",rmrel = "1.40",relrel = "1.15",directbendingone="",resultone = "",directbendingtwo = "i", resulttwo = "合格", metallography = "合格", weightdeviation="合格", surfacequality="合格", sizeandappearance="合格", packing="合格", }, new dynamicmodel(){batchnumber="319040027",relmpa = "470",rmpa = "655",a="29.0",agt = "16.0",rmrel = "1.40",relrel = "1.18",directbendingone="",resultone = "",directbendingtwo = "i", resulttwo = "合格", metallography = "合格", weightdeviation="合格", surfacequality="合格", sizeandappearance="合格", packing="合格", }, }; list<chemistrymodel> cm = new list<chemistrymodel>() { new chemistrymodel(){batchnumber="319040027",bales="2",constituent="熔炼",c="0.22",si= "0.37",mn = "1.32",p="0.020",s="0,030",ceq = "0.46"}, new chemistrymodel(){batchnumber="319040027",bales="2",constituent="熔炼",c="0.22",si= "0.37",mn = "1.32",p="0.020",s="0,030",ceq = "0.46"}, new chemistrymodel(){batchnumber="319040027",bales="2",constituent="熔炼",c="0.22",si= "0.37",mn = "1.32",p="0.020",s="0,030",ceq = "0.46"}, new chemistrymodel(){batchnumber="319040027",bales="2",constituent="熔炼",c="0.22",si= "0.37",mn = "1.32",p="0.020",s="0,030",ceq = "0.46"}, }; warrantymodel wm = new warrantymodel() { licencenumber = "xk05-001-00066", orderunit = "。。。。。。限公司", receivingunit = "。。。。有限责任公司", contractcode = "d9s0379001", varietyname = "钢筋混凝土用热轧带肋钢筋(盘卷)", technical = "gb/t1499.2-2018", fixedlength = "", brandname = "hrb400r", diameter = "10", addresschina = " 中 国 攀 枝 花", addressenglish = " pan zhi hua china ", knotnumber = "904080d005000", deliverystute = "热扎", certificateno = "1904db00384", arrivestation = "汽车自提", licensenumber = "川a09901", delivergoodsdata = "2019年4月8日", tabulationtime = "2019年04月08日 15时08分13分", remark = "\n1、兹证明本产品按供货标准检验各项指标均符合供货标准规定。 \n2、质量证明书原件是验收依据,复印件仅供参考,不作为验收凭证。 \n3、弯芯直径①:c▁d=a、g▁3d、h▁4d、i▁5d、j▁6d、k▁7d、l▁8d、m▁9d。", explain = "", personincharge = "" }; wm.dynamic = dm; wm.chemistry = cm; // 调用打印 printhelper printhelper = new printhelper(wm); printhelper.datatoexcel(); }
printhelper.cs文件代码
/// <summary> /// 打印 /// </summary> public class printhelper { /// <summary> /// 文件生成路径 /// </summary> private string _filepath = system.appdomain.currentdomain.setupinformation.applicationbase + "file\\" + datetime.now.tostring("yyyymmddhhmmss");//datetime.now.tofiletimeutc().tostring(); /// <summary> /// 打印质保书数据实体 /// </summary> private warrantymodel _warranty; /// <summary> /// /// </summary> private int _maxremarklength = int.minvalue; public printhelper(warrantymodel warranty) { _warranty = warranty; } /// <summary> /// 动态生成excel /// </summary> public void datatoexcel() { int max = int.minvalue; var remarklist = _warranty.chemistry.select(m => m.batchnumber).tolist(); for (int i = 0, length = remarklist.count; i < length; i++) { var remark = remarklist[i]; if (remark != null && remark.length > max) { max = remarklist[i].length; } } if (max > 10) _maxremarklength = (max / 4 + 1) * 20; else _maxremarklength = 40; application excelapp = new application(); workbook worksbook = excelapp.workbooks.add(); worksheet worksheet = (worksheet)worksbook.worksheets[1]; if (worksheet == null) { system.diagnostics.debug.writeline("error: worksheet == null"); return; } worksheet.name = "deliveryorderbills"; worksheet.cells.wraptext = true; worksheet.cells.entirerow.autofit(); rangemark(worksheet, "a1", "d1", "qg/js jl(y)042-2017", 10, 30, 1, 0); rangemark(worksheet, "h1", "k1", "产 品 质 量 保 证 书", 26, 30, 3, 0); rangemark(worksheet, "a3", "a3", "许可证号:", 12, 30, 3, 0); rangemark(worksheet, "b3", "d3", _warranty.licencenumber, 12, 30, 1, 0); rangemark(worksheet, "o3", "o3", "结齐单号:", 12, 30, 3, 0); rangemark(worksheet, "p3", "q3", _warranty.knotnumber, 12, 30, 1, 0); rangemark(worksheet, "a4", "a4", "订货单位:", 12, 30, 3, 0); rangemark(worksheet, "b4", "c4", _warranty.orderunit, 12, 30, 1, 0); rangemark(worksheet, "i4", "k4", "quality certificate", 12, 30, 3, 0); rangemark(worksheet, "o4", "o4", "交货状态:", 12, 30, 3, 0); rangemark(worksheet, "p4", "q4", _warranty.deliverystute, 12, 30, 1, 0); rangemark(worksheet, "a5", "a5", "收获单位:", 12, 30, 3, 0); rangemark(worksheet, "b5", "c5", _warranty.receivingunit, 12, 30, 1, 0); rangemark(worksheet, "h5", "k5", "攀钢集团攀枝花金属制品有限公司", 16, 30, 3, 0); rangemark(worksheet, "o5", "o5", "证明书号:", 12, 30, 3, 0); rangemark(worksheet, "p5", "q5", _warranty.certificateno, 12, 30, 1, 0); rangemark(worksheet, "a6", "a6", "合同编号:", 12, 30, 3, 0); rangemark(worksheet, "b6", "c6", _warranty.contractcode, 12, 30, 1, 0); rangemark(worksheet, "f6", "f6", "定尺长度\n(mm):", 12, 30, 3, 0); rangemark(worksheet, "g6", "g6", _warranty.fixedlength, 12, 30, 3, 0); rangemark(worksheet, "i6", "m6", "pangang group panzhihua metal products co., ltd.", 12, 20, 3, 0); rangemark(worksheet, "o6", "o6", "到 站:", 12, 30, 3, 0); rangemark(worksheet, "p6", "q6", _warranty.arrivestation, 12, 30, 1, 0); rangemark(worksheet, "a7", "a7", "品种名称:", 12, 30, 3, 0); rangemark(worksheet, "b7", "d7", _warranty.varietyname, 12, 30, 1, 0); rangemark(worksheet, "f7", "f7", "牌 号", 12, 30, 3, 0); rangemark(worksheet, "g7", "g7", _warranty.brandname, 12, 20, 3, 0); rangemark(worksheet, "j7", "j7", "地 址:", 12, 30, 3, 0); rangemark(worksheet, "k7", "m7", _warranty.addresschina, 12, 30, 3, 0); rangemark(worksheet, "o7", "o7", "车 号:", 12, 30, 3, 0); rangemark(worksheet, "p7", "q7", _warranty.licensenumber, 12, 30, 1, 0); rangemark(worksheet, "a8", "a8", "技术条件:", 12, 30, 3, 0); rangemark(worksheet, "b8", "d8", _warranty.technical, 12, 30, 1, 0); rangemark(worksheet, "f8", "f8", "直径(mm):", 12, 30, 3, 0); rangemark(worksheet, "g8", "g8", _warranty.diameter, 12, 30, 3, 0); rangemark(worksheet, "j8", "j8", "address:", 12, 30, 3, 0); rangemark(worksheet, "k8", "m8", _warranty.addressenglish, 12, 30, 3, 0); rangemark(worksheet, "o8", "o8", "发货日期:", 12, 30, 3, 0); rangemark(worksheet, "p8", "q8", _warranty.delivergoodsdata, 12, 30, 1, 0); // 化学成分表单(表头部分) rangemark(worksheet, "a9", "a10", "批号"); rangemark(worksheet, "b9", "b10", "捆(包)数"); rangemark(worksheet, "c9", "c10", "成分项目"); rangemark(worksheet, "d9", "o9", "化 学 成 分 chemical composition"); rangemark(worksheet, "p9", "p9", ""); rangemark(worksheet, "q9", "q9", ""); rangemark(worksheet, "r9", "r9", ""); rangemark(worksheet, "d10", "d10", "c"); rangemark(worksheet, "e10", "e10", "si"); rangemark(worksheet, "f10", "f10", "mn"); rangemark(worksheet, "g10", "g10", "p"); rangemark(worksheet, "h10", "h10", "s"); rangemark(worksheet, "i10", "i10", "ceq"); rangemark(worksheet, "j10", "j10", ""); rangemark(worksheet, "k10", "k10", ""); rangemark(worksheet, "l10", "l10", ""); rangemark(worksheet, "m10", "m10", ""); rangemark(worksheet, "n10", "n10", ""); rangemark(worksheet, "o10", "o10", ""); rangemark(worksheet, "p10", "r10", ""); // 化学成分表单(内容部分) var rowtwonum = 0;// 力学性能表单开始行索引 if (_warranty.chemistry.any()) { for (int i = 0; i < _warranty.chemistry.count; i++) { // 行数索引 var rowonenum = 11 + i; // 数据实体 var item = _warranty.chemistry[i]; rangemark(worksheet, string.format("a{0}", rowonenum), string.format("a{0}", rowonenum), item.batchnumber); rangemark(worksheet, string.format("b{0}", rowonenum), string.format("b{0}", rowonenum), item.bales); rangemark(worksheet, string.format("c{0}", rowonenum), string.format("c{0}", rowonenum), item.constituent); rangemark(worksheet, string.format("d{0}", rowonenum), string.format("d{0}", rowonenum), item.c); rangemark(worksheet, string.format("e{0}", rowonenum), string.format("e{0}", rowonenum), item.si); rangemark(worksheet, string.format("f{0}", rowonenum), string.format("f{0}", rowonenum), item.mn); rangemark(worksheet, string.format("g{0}", rowonenum), string.format("g{0}", rowonenum), item.p); rangemark(worksheet, string.format("h{0}", rowonenum), string.format("h{0}", rowonenum), item.s); rangemark(worksheet, string.format("i{0}", rowonenum), string.format("i{0}", rowonenum), item.ceq); rangemark(worksheet, string.format("j{0}", rowonenum), string.format("j{0}", rowonenum), ""); rangemark(worksheet, string.format("k{0}", rowonenum), string.format("k{0}", rowonenum), ""); rangemark(worksheet, string.format("l{0}", rowonenum), string.format("l{0}", rowonenum), ""); rangemark(worksheet, string.format("m{0}", rowonenum), string.format("m{0}", rowonenum), ""); rangemark(worksheet, string.format("n{0}", rowonenum), string.format("n{0}", rowonenum), ""); rangemark(worksheet, string.format("o{0}", rowonenum), string.format("o{0}", rowonenum), ""); rangemark(worksheet, string.format("p{0}", rowonenum), string.format("p{0}", rowonenum), ""); rangemark(worksheet, string.format("q{0}", rowonenum), string.format("q{0}", rowonenum), ""); rangemark(worksheet, string.format("r{0}", rowonenum), string.format("r{0}", rowonenum), ""); } // 空行索引 var krowindex = _warranty.chemistry.count + 11; rangemark(worksheet, string.format("a{0}", krowindex), string.format("r{0}", krowindex), "", 12, 15); rowtwonum = krowindex + 1; } else { rangemark(worksheet, string.format("a{0}", 11), string.format("r{0}", 11), "", 12, 15); rowtwonum = 12; } // 力学性能表单(表头部分) rangemark(worksheet, string.format("a{0}", rowtwonum), string.format("a{0}", rowtwonum + 1), "批号"); rangemark(worksheet, string.format("b{0}", rowtwonum), string.format("g{0}", rowtwonum), "力学性能"); rangemark(worksheet, string.format("h{0}", rowtwonum), string.format("i{0}", rowtwonum), "冷弯 / 180°"); rangemark(worksheet, string.format("j{0}", rowtwonum), string.format("k{0}", rowtwonum), "反向弯曲 ②"); rangemark(worksheet, string.format("l{0}", rowtwonum), string.format("l{0}", rowtwonum + 1), "金相组织"); rangemark(worksheet, string.format("m{0}", rowtwonum), string.format("m{0}", rowtwonum + 1), ""); rangemark(worksheet, string.format("n{0}", rowtwonum), string.format("n{0}", rowtwonum + 1), ""); rangemark(worksheet, string.format("o{0}", rowtwonum), string.format("o{0}", rowtwonum + 1), "重量偏差"); rangemark(worksheet, string.format("p{0}", rowtwonum), string.format("p{0}", rowtwonum + 1), "表面质量"); rangemark(worksheet, string.format("q{0}", rowtwonum), string.format("q{0}", rowtwonum + 1), "尺寸和\n外形"); rangemark(worksheet, string.format("r{0}", rowtwonum), string.format("r{0}", rowtwonum + 1), "包装"); rangemark(worksheet, string.format("b{0}", rowtwonum + 1), string.format("b{0}", rowtwonum + 1), "rel /mpa"); rangemark(worksheet, string.format("c{0}", rowtwonum + 1), string.format("c{0}", rowtwonum + 1), "rm /mpa"); rangemark(worksheet, string.format("d{0}", rowtwonum + 1), string.format("d{0}", rowtwonum + 1), "a / %"); rangemark(worksheet, string.format("e{0}", rowtwonum + 1), string.format("e{0}", rowtwonum + 1), "rgt / %"); rangemark(worksheet, string.format("f{0}", rowtwonum + 1), string.format("f{0}", rowtwonum + 1), " r°m / r°el"); rangemark(worksheet, string.format("g{0}", rowtwonum + 1), string.format("g{0}", rowtwonum + 1), "r°el/rel"); rangemark(worksheet, string.format("h{0}", rowtwonum + 1), string.format("h{0}", rowtwonum + 1), "弯芯直径①"); rangemark(worksheet, string.format("i{0}", rowtwonum + 1), string.format("i{0}", rowtwonum + 1), "结果"); rangemark(worksheet, string.format("j{0}", rowtwonum + 1), string.format("j{0}", rowtwonum + 1), "弯芯直径①"); rangemark(worksheet, string.format("k{0}", rowtwonum + 1), string.format("k{0}", rowtwonum + 1), "结果"); // 力学性能表单(内容部分) var totalrowindex = rowtwonum + 2;// 统计行索引 if (_warranty.dynamic.any()) { for (int i = 0; i < _warranty.dynamic.count; i++) { // 内容索引 var rowthreenum = i + rowtwonum + 2; totalrowindex = rowthreenum + 1; // 数据实体 var item = _warranty.dynamic[i]; rangemark(worksheet, string.format("a{0}", rowthreenum), string.format("a{0}", rowthreenum), item.batchnumber); rangemark(worksheet, string.format("b{0}", rowthreenum), string.format("b{0}", rowthreenum), item.relmpa); rangemark(worksheet, string.format("c{0}", rowthreenum), string.format("c{0}", rowthreenum), item.rmpa); rangemark(worksheet, string.format("d{0}", rowthreenum), string.format("d{0}", rowthreenum), item.a); rangemark(worksheet, string.format("e{0}", rowthreenum), string.format("e{0}", rowthreenum), item.agt); rangemark(worksheet, string.format("f{0}", rowthreenum), string.format("f{0}", rowthreenum), item.rmrel); rangemark(worksheet, string.format("g{0}", rowthreenum), string.format("g{0}", rowthreenum), item.relrel); rangemark(worksheet, string.format("h{0}", rowthreenum), string.format("h{0}", rowthreenum), item.directbendingone); rangemark(worksheet, string.format("i{0}", rowthreenum), string.format("i{0}", rowthreenum), item.resultone); rangemark(worksheet, string.format("j{0}", rowthreenum), string.format("j{0}", rowthreenum), item.directbendingtwo); rangemark(worksheet, string.format("k{0}", rowthreenum), string.format("k{0}", rowthreenum), item.resulttwo); rangemark(worksheet, string.format("l{0}", rowthreenum), string.format("l{0}", rowthreenum), item.metallography); rangemark(worksheet, string.format("m{0}", rowthreenum), string.format("m{0}", rowthreenum), ""); rangemark(worksheet, string.format("n{0}", rowthreenum), string.format("n{0}", rowthreenum), ""); rangemark(worksheet, string.format("o{0}", rowthreenum), string.format("o{0}", rowthreenum), item.weightdeviation); rangemark(worksheet, string.format("p{0}", rowthreenum), string.format("p{0}", rowthreenum), item.surfacequality); rangemark(worksheet, string.format("q{0}", rowthreenum), string.format("q{0}", rowthreenum), item.sizeandappearance); rangemark(worksheet, string.format("r{0}", rowthreenum), string.format("r{0}", rowthreenum), item.packing); } } // 添加统计行 rangemark(worksheet, string.format("a{0}", totalrowindex), string.format("a{0}", totalrowindex), ""); rangemark(worksheet, string.format("b{0}", totalrowindex), string.format("b{0}", totalrowindex), "总捆(包)数 "); rangemark(worksheet, string.format("c{0}", totalrowindex), string.format("c{0}", totalrowindex), "计算"); rangemark(worksheet, string.format("d{0}", totalrowindex), string.format("d{0}", totalrowindex), ""); rangemark(worksheet, string.format("e{0}", totalrowindex), string.format("e{0}", totalrowindex), ""); rangemark(worksheet, string.format("f{0}", totalrowindex), string.format("f{0}", totalrowindex), ""); rangemark(worksheet, string.format("g{0}", totalrowindex), string.format("g{0}", totalrowindex), ""); rangemark(worksheet, string.format("h{0}", totalrowindex), string.format("i{0}", totalrowindex), "实际总重量(t)"); rangemark(worksheet, string.format("j{0}", totalrowindex), string.format("j{0}", totalrowindex), "计算"); rangemark(worksheet, string.format("k{0}", totalrowindex), string.format("l{0}", totalrowindex), ""); rangemark(worksheet, string.format("m{0}", totalrowindex), string.format("n{0}", totalrowindex), ""); rangemark(worksheet, string.format("o{0}", totalrowindex), string.format("q{0}", totalrowindex), ""); rangemark(worksheet, string.format("r{0}", totalrowindex), string.format("r{0}", totalrowindex), ""); // 合并横着的单元格 columnsspan(worksheet, "f1", "g1"); columnsspan(worksheet, "f2", "g2"); columnsspan(worksheet, "f3", "g3"); columnsspan(worksheet, "f4", "g4"); columnsspan(worksheet, "f5", "g5"); columnsspan(worksheet, "l1", "m1"); columnsspan(worksheet, "l2", "m2"); columnsspan(worksheet, "l3", "m3"); columnsspan(worksheet, "l4", "m4"); columnsspan(worksheet, "l5", "m5"); // 合并竖着的单元格 rowsspan(worksheet, "f1", "f5"); rowsspan(worksheet, "g1", "g5"); rowsspan(worksheet, "l1", "l5"); rowsspan(worksheet, "m1", "m5"); // 插入图片 savepic(worksheet, "g1", directory.getcurrentdirectory() + "/pq.jpg"); savepic(worksheet, "l1", directory.getcurrentdirectory() + "/s.jpg"); //------------------------打印页面相关设置-------------------------------- worksheet.pagesetup.papersize = microsoft.office.interop.excel.xlpapersize.xlpapera4;//纸张大小 worksheet.pagesetup.orientation = microsoft.office.interop.excel.xlpageorientation.xllandscape;//页面横向 //worksheet.pagesetup.zoom = 75; //打印时页面设置,缩放比例百分之几 worksheet.pagesetup.zoom = false; //打印时页面设置,必须设置为false,页高,页宽才有效 worksheet.pagesetup.fittopageswide = 1; //设置页面缩放的页宽为1页宽 worksheet.pagesetup.fittopagestall = false; //设置页面缩放的页高自动 worksheet.pagesetup.centerfooter = "第 &p 页,共 &n 页";//页面下标 worksheet.pagesetup.footermargin = 5; worksheet.pagesetup.printgridlines = false; //打印单元格网线 worksheet.pagesetup.topmargin = 15; //上边距为2cm(转换为in) worksheet.pagesetup.bottommargin = 20; //下边距为1.5cm worksheet.pagesetup.leftmargin = 30; //左边距为2cm worksheet.pagesetup.rightmargin = 30; //右边距为2cm worksheet.pagesetup.centerhorizontally = true; //文字水平居中 //------------------------打印页面设置结束-------------------------------- ///http://blog.csdn.net/wanmingtom/article/details/6125599 /// // 生成excel文件 worksheet.saveas(_filepath, type.missing, type.missing, type.missing, xlsaveasaccessmode.xlnochange, 1, false, type.missing, type.missing, type.missing); //另存表 //// 直接打印放开下面两个注释即可 //excelapp.visible = false; //是否显示excel文档 //worksheet.printoutex(); killprocess(excelapp); //杀掉生成的进程 gc.collect(); //垃圾回收机制 } private void columnsspan(worksheet worksheet, string start, string end) { microsoft.office.interop.excel.range eg1 = worksheet.get_range(start, end); eg1.mergecells = true; eg1.verticalalignment = microsoft.office.interop.excel.xlvalign.xlvaligncenter; eg1.horizontalalignment = microsoft.office.interop.excel.xlvalign.xlvaligncenter; } private void rowsspan(worksheet worksheet, string start, string end) { range pqpricrange = worksheet.get_range(start, end); pqpricrange.application.displayalerts = false; //pqpricrange.merge(missing.value); pqpricrange.mergecells = true; pqpricrange.application.displayalerts = true; pqpricrange.verticalalignment = microsoft.office.interop.excel.xlvalign.xlvaligncenter; pqpricrange.horizontalalignment = microsoft.office.interop.excel.xlvalign.xlvaligncenter; } /// <summary> /// 创建单元格 /// </summary> /// <param name="worksheet">worksheet对象</param> /// <param name="startcell">开始格子号</param> /// <param name="endcell">终止格子号</param> /// <param name="strtext">文本</param> /// <param name="fontsize">字体大小</param> /// <param name="rowheight">行高</param> /// <param name="horizontalalignment">横向剧中</param> /// <param name="linestyle">单元格边框</param> /// <returns></returns> private bool rangemark(worksheet worksheet, string startcell, string endcell, string strtext, int fontsize = 12, int rowheight = 30, int horizontalalignment = 3, int linestyle = 1) { //创建一个区域对象。第一个参数是开始格子号,第二个参数是终止格子号。比如选中a1——d3这个区域。 range range = worksheet.get_range(startcell, endcell); if (range == null) { system.diagnostics.debug.writeline("error: range == null"); return false; } range.merge(0); //合并方法,0的时候直接合并为一个单元格 range.font.size = fontsize; //字体大小 range.font.name = "黑体"; //字体 //range.entirerow.autofit(); //自动调整行高 //range.entirecolumn.autofit(); //range.rowheight = 20; //range.entirecolumn.autofit(); //自动调整列宽 //range.numberformatlocal = "@"; //range.entirecolumn.autofit(); range.numberformatlocal = "@"; range.rowheight = rowheight; range.columnwidth = 15; //range.entirecolumn.autofit(); //range.entirerow.autofit(); range.horizontalalignment = horizontalalignment; //横向居中 range.verticalalignment = xlvalign.xlvaligncenter; range.value = strtext; //合并单元格之后,设置其中的文本 range.cells.borders.linestyle = linestyle; //设置单元格边框的粗细 range.wraptext = true; //文本自动换行 return true; } /// <summary> /// 杀掉生成的进程 /// </summary> /// <param name="appobject">进程程对象</param> private static void killprocess(microsoft.office.interop.excel.application appobject) { int pid = 0; intptr hwnd = new intptr(appobject.hwnd); system.diagnostics.process p = null; try { getwindowthreadprocessid(hwnd, out pid); p = system.diagnostics.process.getprocessbyid(pid); if (p != null) { p.kill(); p.dispose(); } } catch (exception ex) { system.diagnostics.debug.writeline("进程关闭失败!异常信息:" + ex); } } /// <summary> /// 引用windows句柄,获取程序pid /// </summary> /// <param name="hwnd"></param> /// <param name="pid"></param> /// <returns></returns> [dllimport("user32.dll")] public static extern int getwindowthreadprocessid(intptr hwnd, out int pid); private void savepic(worksheet worksheet, string rangename, string filename) { microsoft.office.interop.excel.range range = worksheet.get_range(rangename, type.missing); range.select(); range.horizontalalignment = microsoft.office.interop.excel.xlvalign.xlvaligncenter; /////////// float picleft, pictop, picwidth, picheight; //距离左边距离,顶部距离,图片宽度、高度 pictop = convert.tosingle(range.top); picwidth = convert.tosingle(range.mergearea.width); picheight = convert.tosingle(range.height); picwidth = convert.tosingle(range.width); picleft = convert.tosingle(range.left); ////////////////// microsoft.office.interop.excel.pictures pict = (microsoft.office.interop.excel.pictures)worksheet.pictures(type.missing); if (filename.indexof(".") > 0) { if (system.io.file.exists(filename)) { pict.insert(filename, type.missing);//显示原图 重叠在一起 //worksheet.shapes.addpicture(filename, // microsoft.office.core.msotristate.msofalse, // microsoft.office.core.msotristate.msoctrue, // picleft, pictop, picwidth, picheight);//指定位置显示小图 } } } }
生成的excel预览
三 在visual studio中通过插件编辑rdlc文件进行可视化布局(动态添加行的我暂时没有弄出来,这里只演示固定字段的打印)
首先引用:
第一步:安装插件
搜索rdlc
第二步:这里下载好之后从新启动vs它会自动安装插件。安装好后创建文件。
第三步:可视化布局操作
第四步:设置数据绑定,在需要绑定数据的单元格中鼠标右键点击文本框属性。
名称:与实体属性写法一致 值:[与实体属性写法一致]
设置字体及大小
第五步:布局及所有字段写好之后就设置数据集(我这里用的是本地实体模型)
右键添加数据集
这里选择你要绑定的实体
注意:当界面设计好之后我们重新生成项目总是提示生成失败,而vs也不提示哪里出错了。
我就猜测是不是这个rdlc文件的问题,我就试着把rdlc文件排除在项目外,再次生成就可以了。
当然这个不影响我们编辑rdlc文件,你可以继续编辑,只不过在读取的时候,是默认bin目录下,这里每次编辑了就要手动赋值到bin目录中。
这里设计好了之后就看代码。
按钮事件代码:
private void btn_code_click(object sender, routedeventargs e) { // 数据 var csm = new codesheetmodel() { codesheetnumber = "1w52902644", contractnuber = "d8s0363501", quasisign = "", loadingpoint = "北部站", deliverystandard = "gb/t1499.2-2019", deliveryaddress = "", orderunit = "。。。。。有限公司", receivingunit = "。。。。。。。有限公司", settlementunit = "。。。。。有限公司", privatelinename = "螺纹钢", licensenumber = "川b37037", billloadno = "1w62904010501", shipptype = "21", deliveryclass = "2", productdescription = "不说明", varietyname = "螺纹钢", shipmentno = "", brandno = "hrb400e1114", factoryoutdata = "2019-04-03 14:10", metermode = "计量", printdatetime = "2019-04-03 14:10:45" }; var p = new codeprinthelper(); p.run(csm, (ex) => { messagebox.show(ex.message); }, "npi84ffaf (hp laserjet mfp m436)"); messagebox.show("完成打印。。。"); }
codeprinthelper.cs文件代码:
/// <summary> /// 码单打印 /// </summary> public class codeprinthelper { /// <summary> /// 用来记录当前打印到第几页了 /// </summary> private int m_currentpageindex = 0; private ilist<stream> m_streams; /// <summary> /// 时间 /// </summary> private datetime datetime; /// <summary> /// 打印机集合 /// </summary> private static list<string> printlist = null; /// <summary> /// 打印发生异常的回调函数 /// </summary> public action<exception> execptioncallback { get; set; } /// <summary> /// 获取打印机集合 /// </summary> public static list<string> printlist { get { if (printlist == null) { printlist = new list<string>(); localprintserver printserver = new localprintserver(); printqueuecollection printqueuesonlocalserver = printserver.getprintqueues(new[] { enumeratedprintqueuetypes.local }); foreach (printqueue printer in printqueuesonlocalserver) printlist.add(printer.name); } return printlist; } } /// <summary> /// 执行打印 /// </summary> /// <param name="codesheetmodel">打印的数据</param> /// <param name="printname">打印机名称,为空则调用默认的打印机</param> public bool run(codesheetmodel outplate, action<exception> execptioncallback, string printname = null) { execptioncallback = execptioncallback; // 检查是否指定了打印机 if (string.isnullorwhitespace(printname) && printlist.count > 0) printname = printlist[0]; else if (printlist.count <= 0) { execptioncallback(new exception("未找到可用的打印机")); return false; } if (!printlist.contains(printname)) { execptioncallback(new exception(string.format("未找到打印机 {0}", printname))); return false; } datetime = datetime.now; var report = new localreport(); report.reportpath = "./reports/exitbarreport.rdlc"; report.datasources.add(new reportdatasource("codesheetdataset", loaddata(outplate))); export(report); m_currentpageindex = 0; print(printname); if (m_streams != null) { foreach (stream stream in m_streams) stream.close(); m_streams = null; } deletetempfile(); return true; } /// <summary> /// 填充要打印的数据 /// </summary> /// <param name="op"></param> /// <returns></returns> public datatable loaddata(codesheetmodel op) { datatable dt = new datatable(); dt.columns.add("codesheetnumber", typeof(string)); dt.columns.add("contractnuber", typeof(string)); dt.columns.add("quasisign", typeof(string)); dt.columns.add("loadingpoint", typeof(string)); dt.columns.add("deliverystandard", typeof(string)); dt.columns.add("deliveryaddress", typeof(string)); dt.columns.add("orderunit", typeof(string)); dt.columns.add("receivingunit", typeof(string)); dt.columns.add("settlementunit", typeof(string)); dt.columns.add("privatelinename", typeof(string)); dt.columns.add("licensenumber", typeof(string)); dt.columns.add("billloadno", typeof(string)); dt.columns.add("shipptype", typeof(string)); dt.columns.add("deliveryclass", typeof(string)); dt.columns.add("productdescription", typeof(string)); dt.columns.add("varietyname", typeof(string)); dt.columns.add("shipmentno", typeof(string)); dt.columns.add("brandno", typeof(string)); dt.columns.add("factoryoutdata", typeof(string)); dt.columns.add("metermode", typeof(string)); dt.columns.add("printdatetime", typeof(string)); //// 产品 //dt.columns.add("meltingnumber", typeof(string)); //dt.columns.add("materialscience", typeof(string)); //dt.columns.add("machiningstate", typeof(string)); //dt.columns.add("chang", typeof(string)); //dt.columns.add("netwight", typeof(string)); //dt.columns.add("bundlenum", typeof(string)); //dt.columns.add("branchnum", typeof(string)); datarow dr = dt.newrow(); dr["codesheetnumber"] = op.codesheetnumber; dr["contractnuber"] = op.contractnuber; dr["quasisign"] = op.quasisign; dr["loadingpoint"] = op.loadingpoint; dr["deliverystandard"] = op.deliverystandard; dr["deliveryaddress"] = op.deliveryaddress; dr["orderunit"] = op.orderunit; dr["receivingunit"] = op.receivingunit; dr["settlementunit"] = op.settlementunit; dr["privatelinename"] = op.privatelinename; dr["licensenumber"] = op.licensenumber; dr["billloadno"] = op.billloadno; dr["shipptype"] = op.shipptype; dr["deliveryclass"] = op.deliveryclass; dr["productdescription"] = op.productdescription; dr["varietyname"] = op.varietyname; dr["shipmentno"] = op.shipmentno; dr["brandno"] = op.brandno; dr["factoryoutdata"] = op.factoryoutdata; dr["metermode"] = op.metermode; dr["printdatetime"] = op.printdatetime; dt.rows.add(dr); //// 产品 //for (int i = 0; i < productitem.count; i++) //{ // var model = productitem[i]; // var newrow = dt.newrow(); // dr["meltingnumber"] = model.meltingnumber; // dr["materialscience"] = model.materialscience; // dr["machiningstate"] = model.machiningstate; // dr["chang"] = model.chang; // dr["netwight"] = model.netwight; // dr["bundlenum"] = model.bundlenum; // dr["branchnum"] = model.branchnum; // dt.rows.add(newrow); //} return dt; } /// <summary> /// 导出报表的每一个页面到一个emf文件 /// </summary> /// <param name="report"></param> private void export(localreport report) { string deviceinfo = "<deviceinfo>" + " <outputformat>emf</outputformat>" + " <pagewidth>19.30cm</pagewidth>" + " <pageheight>6.68cm</pageheight>" + " <margintop>0.13cm</margintop>" + " <marginleft>1.53cm</marginleft>" + " <marginright>0.13cm</marginright>" + " <marginbottom>0.13cm</marginbottom>" + "</deviceinfo>"; warning[] warnings; m_streams = new list<stream>(); report.render("image", deviceinfo, createstream, out warnings); foreach (stream stream in m_streams) { stream.position = 0; } } /// <summary> /// 创建流 /// </summary> /// <param name="name"></param> /// <param name="filenameextension"></param> /// <param name="encoding"></param> /// <param name="mimetype"></param> /// <param name="willseek"></param> /// <returns></returns> private stream createstream(string name, string filenameextension, encoding encoding, string mimetype, bool willseek) { //var stream = new filestream(@"./" + name + // "." + filenameextension, filemode.create); //var stream = new filestream($"./{datetime.tostring("yyyy_mm_dd_hh_mm_ss")}_{name}.{filenameextension}", filemode.create); if (!directory.exists("./printfiletemp")) { directory.createdirectory("./printfiletemp"); } var stream = new filestream(string.format("./printfiletemp/{0}_{1}.{2}", datetime.tostring("yyyy_mm_dd_hh_mm_ss"), name, filenameextension), filemode.create); if (m_streams.count < 1) m_streams.add(stream); return stream; } /// <summary> /// 打印 /// </summary> /// <param name="printername"></param> private void print(string printername) { if (m_streams == null || m_streams.count == 0) return; printdocument printdoc = new printdocument(); printdoc.printersettings.printername = printername; if (!printdoc.printersettings.isvalid) { //execptioncallback(new exception($"未找到打印机 {printername}")); execptioncallback(new exception(string.format("未找到打印机 {0}", printername))); return; } // 0.001 英寸 = 0.0254 厘米 // = 960cm //printdoc.defaultpagesettings.papersize = new papersize("custom", 815, 400); printdoc.printersettings.copies = 1; printdoc.printpage += new printpageeventhandler(printpage); printdoc.print(); } /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="ev"></param> private void printpage(object sender, printpageeventargs ev) { metafile pageimage = new metafile(m_streams[m_currentpageindex]); ev.graphics.drawimage(pageimage, ev.pagebounds); ev.hasmorepages = false; ev.pagesettings.landscape = true; } private void deletetempfile() { dispose(); foreach (var item in directory.enumeratefiles(appdomain.currentdomain.basedirectory + "printfiletemp")) { try { file.delete(item); } catch (exception) { } } } /// <summary> /// 释放现有流资源 /// </summary> public void dispose() { if (m_streams != null) { foreach (stream stream in m_streams) stream.close(); m_streams = null; } } }
以上就是三种打印方式。
以上源码下载地址:
黄山市民网:https://www.huangshanshimin.com/