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

  

 以上就是三种打印方式。

 以上源码下载地址: