C# 三種打印方式含代碼


C# 三種打印方式含代碼

 

 

 

 

 

 

一:C#代碼直接打印pdf文件(打印質保書pdf文件)

引用:

 

代碼注釋很詳細了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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主要在於布局)

按鈕事件代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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文件代碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
/// <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目錄中。 

 這里設計好了之后就看代碼。

按鈕事件代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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文件代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
/// <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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM