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