C# 三种打印方式含代码
一: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 inPaperSize 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.5cmworkSheet.PageSetup.LeftMargin = 30; //左边距为2cmworkSheet.PageSetup.RightMargin = 30; //右边距为2cmworkSheet.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://download.csdn.net/download/qingchundaima/11125329
转载于:https://www.cnblogs.com/wendj/p/10728685.html
C# 三种打印方式含代码相关推荐
- 线程的三种创建方式以及代码实现
线程和进程的概念 一个进程可以有多个线程 程序:是指令和数据的有序集合(静态的) 进程:是执行程序的一次执行过程(动态的),是系统资源分配的单位.在操作系统中运行的程序就是进程. 通常在一个进程中可以 ...
- 浅谈Zebra斑马打印机三种打印方式的利弊
经过几个项目的洗礼,对Zebra打印机有了一个初步的了解,也用了好几种方式进行通讯打印,下面我们来谈谈这几种方式的优缺点吧. 主要有以下三种方法: 1.利用ZPLII指令集编写带有位置信息,字体大小, ...
- linux postgresql默认安装目录,postgresql - 三种安装方式(示例代码)
最近接触了postgresql的安装,和大家分享一下. 一.简 介 PostgreSQL 是一种非常复杂的对象-关系型数据库管理系统(ORDBMS),也是目前功能最强大,特性最丰富和最复杂的自由软件数 ...
- java源代码实例倒计时_Java倒计时三种实现方式代码实例
写完js倒计时,突然想用java实现倒计时,写了三种实现方式 一:设置时长的倒计时: 二:设置时间戳的倒计时: 三:使用java.util.Timer类实现的时间戳倒计时 代码如下: package ...
- python的等待代码是什么_Python selenium 三种等待方式详解
1.目的背景 解决问题:下拉框定位不到.弹框定位不到-各种定位不到,其实大多数情况下就是两种问题:1 有frame,2 没有加等待. 原因:代码运行速度快,而浏览器加载渲染速度慢 解决办法:加等待,目 ...
- AutoLayout的三种设置方式之——NSLayoutConstraint代码篇
本文转载至 http://www.cnblogs.com/madpanda/p/4311980.html AutoLayout是从IOS 6开始苹果引入来取代autoresizing的新的布局技术,该 ...
- java倒计时_Java倒计时三种实现方式代码实例
写完js倒计时,突然想用java实现倒计时,写了三种实现方式 一:设置时长的倒计时: 二:设置时间戳的倒计时: 三:使用java.util.Timer类实现的时间戳倒计时 代码如下: package ...
- 1.5 使用new创建动态结构和自动, 静态, 动态三种存储方式
1. 有些时候在运行时创建数组由于在编译时创建数组(有些时候不是这样, 比如使用OpenGL绘图和GPU并行计算结合的时候, 需要将大量的数据传送到显存, 每次计算完又要传送回宿主机渲染, 但并不是要 ...
- java如何实现定时任务_Java定时任务的三种实现方式
前言 现代的应用程序早已不是以前的那些由简单的增删改查拼凑而成的程序了,高复杂性早已是标配,而任务的定时调度与执行也是对程序的基本要求了. 很多业务需求的实现都离不开定时任务,例如,每月一号,移动将清 ...
最新文章
- web人力资源信息系统开发日志②
- BM算法的shift1表是在所有情况下移动都是最快的吗?
- 关于mysql数据库的备份和还原
- 修改mysql字符集_mysql 修改字符集
- 用Indy创建收发电子邮件的例子
- 【转】HTTP幂等性概念和应用
- Clipy 让苹果Mac复制粘贴发挥更强大的功能
- popWindow回传方法
- 加热垫美国站UL130测试项目及周期
- c语言打印图形 原理,C语言打印各种图形
- No content to map to Object due to end of input
- java ieee754_IEEE754浮点数
- Block的简单理解
- 深脑链打地基,人工智能建高楼:DBC和AI的不解之缘
- 电影《一诺千金》剧照首度曝光系列一
- 翻译工具,您选哪个?
- Fiddler + 海马模拟器抓包教程
- Java题目-函数练习(二)
- 大工业用电计费及其相关知识
- 微商卖零食如何通过微博引流?成功开启新的销售渠道
热门文章
- VMware中运行招行专业版问题
- 软件测试基础笔记总结
- xp系统打开itunes显示服务器失败,win7系统打开iTunes显示Apple Mobile Device Service无法启动怎么解决...
- 软件测试英文笔试题(需用英语答卷)
- 手动编译Ventoy
- Mac M1通过VMWare Fusion安装Centos7记录(镜像和网络有大坑)
- 语音论文中英语的高级表达(持续更新ing...)
- GPS时间和UTC时间的区别
- 智云通CRM:买对了吗——大客户采购的方案实施
- shellcode分析技巧