当前位置: 移动技术网 > IT编程>开发语言>.net > C# 三种打印方式含代码

C# 三种打印方式含代码

2019年04月19日  | 移动技术网IT编程  | 我要评论

金正昆讲礼仪观后感,上犹网,乌鲁木齐公交线路查询

 

 

 

 

 

一: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;
            }
        }
    }

  

 以上就是三种打印方式。

 以上源码下载地址:

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网