为简化使用Excel COM写的类
经常需要在开发中使用Excel COM,为简化使用写了这个类,感觉还是不太方便。
1
using System;
2
3
namespace ExcelHandle
4
{
5
/// <summary>
6
/// ExcelHandle 的摘要说明。
7
/// </summary>
8
public class ExcelHandle
9
{
10
11
/// <summary>
12
/// Excel
13
/// </summary>
14
public Excel.Application CurExcel = null;
15
16
/// <summary>
17
/// 工作簿
18
/// </summary>
19
public Excel._Workbook CurBook = null;
20
21
/// <summary>
22
/// 工作表
23
/// </summary>
24
public Excel._Worksheet CurSheet = null;
25
26
private object mValue = System.Reflection.Missing.Value;
27
28
/// <summary>
29
/// 构造函数
30
/// </summary>
31
public ExcelHandle()
32
{
33
//
34
// TODO: 在此处添加构造函数逻辑
35
//
36
37
this.dtBefore = System.DateTime.Now;
38
39
CurExcel = new Excel.Application();
40
41
this.dtAfter = System.DateTime.Now;
42
43
this.timestamp = System.DateTime.Now.ToShortDateString().Replace("-", "") + System.DateTime.Now.ToShortTimeString().Replace(":", "") + System.DateTime.Now.Second.ToString() + System.DateTime.Now.Millisecond.ToString();
44
45
}
46
47
/// <summary>
48
/// 构造函数
49
/// </summary>
50
/// <param name="strFilePath">加载的Excel文件名</param>
51
public ExcelHandle(string strFilePath)
52
{
53
54
this.dtBefore = System.DateTime.Now;
55
56
CurExcel = new Excel.Application();
57
58
this.dtAfter = System.DateTime.Now;
59
60
CurBook = (Excel._Workbook)CurExcel.Workbooks.Open(strFilePath, mValue, false, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue);
61
62
this.timestamp = System.DateTime.Now.ToShortDateString().Replace("-", "") + System.DateTime.Now.ToShortTimeString().Replace(":", "") + System.DateTime.Now.Second.ToString() + System.DateTime.Now.Millisecond.ToString();
63
64
}
65
66
/// <summary>
67
/// 释放内存空间
68
/// </summary>
69
public void Dispose()
70
{
71
try
72
{
73
System.Runtime.InteropServices.Marshal.ReleaseComObject(CurSheet);
74
CurSheet = null;
75
76
CurBook.Close(false, mValue, mValue);
77
System.Runtime.InteropServices.Marshal.ReleaseComObject(CurBook);
78
CurBook = null;
79
80
CurExcel.Quit();
81
System.Runtime.InteropServices.Marshal.ReleaseComObject(CurExcel);
82
CurExcel = null;
83
84
GC.Collect();
85
GC.WaitForPendingFinalizers();
86
87
}
88
catch(System.Exception ex)
89
{
90
this.MessageWarning("在释放Excel内存空间时发生了一个错误:", ex);
91
}
92
finally
93
{
94
foreach(System.Diagnostics.Process pro in System.Diagnostics.Process.GetProcessesByName("Excel"))
95
if (pro.StartTime > this.dtBefore && pro.StartTime < this.dtAfter)
96
pro.Kill();
97
}
98
System.GC.SuppressFinalize(this);
99
}
100
101
102
private string filepath;
103
private string timestamp;
104
private System.DateTime dtBefore;
105
private System.DateTime dtAfter;
106
107
108
/// <summary>
109
/// Excel文件名
110
/// </summary>
111
public string FilePath
112
{
113
get
114
{
115
return this.filepath;
116
}
117
set
118
{
119
this.filepath = value;
120
}
121
}
122
123
/// <summary>
124
/// 是否打开Excel界面
125
/// </summary>
126
public bool Visible
127
{
128
set
129
{
130
CurExcel.Visible = value;
131
}
132
}
133
134
/// <summary>
135
/// 以时间字符串作为保存文件的名称
136
/// </summary>
137
public string TimeStamp
138
{
139
get
140
{
141
return this.timestamp;
142
}
143
set
144
{
145
this.timestamp = value;
146
}
147
}
148
149
150
/// <summary>
151
/// 加载Excel文件
152
/// </summary>
153
public void Load()
154
{
155
if (CurBook == null && this.filepath != null)
156
CurBook = (Excel._Workbook)CurExcel.Workbooks.Open(this.filepath, mValue, false, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue);
157
}
158
159
/// <summary>
160
/// 加载Excel文件
161
/// </summary>
162
/// <param name="strFilePath">Excel文件名</param>
163
public void Load(string strFilePath)
164
{
165
if (CurBook == null)
166
CurBook = (Excel._Workbook)CurExcel.Workbooks.Open(strFilePath, mValue, false, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue, mValue);
167
}
168
169
/// <summary>
170
/// 新建工作表
171
/// </summary>
172
/// <param name="strWorkSheetName">工作表名称</param>
173
public void NewWorkSheet(string strWorkSheetName)
174
{
175
CurSheet = (Excel._Worksheet)CurBook.Sheets.Add(CurBook.Sheets[1], mValue, mValue, mValue);
176
CurSheet.Name = strWorkSheetName;
177
}
178
179
/// <summary>
180
/// 在指定单元格插入指定的值
181
/// </summary>
182
/// <param name="strCell">单元格,如“A4”</param>
183
/// <param name="objValue">文本、数字等值</param>
184
public void WriteCell(string strCell, object objValue)
185
{
186
CurSheet.get_Range(strCell, mValue).Value2 = objValue;
187
}
188
189
/// <summary>
190
/// 在指定Range中插入指定的值
191
/// </summary>
192
/// <param name="strStartCell">Range的开始单元格</param>
193
/// <param name="strEndCell">Range的结束单元格</param>
194
/// <param name="objValue">文本、数字等值</param>
195
public void WriteRange(string strStartCell, string strEndCell, object objValue)
196
{
197
CurSheet.get_Range(strStartCell, strEndCell).Value2 = objValue;
198
}
199
200
201
/// <summary>
202
/// 合并单元格,并在合并后的单元格中插入指定的值
203
/// </summary>
204
/// <param name="strStartCell"></param>
205
/// <param name="strEndCell"></param>
206
/// <param name="objValue"></param>
207
public void WriteAfterMerge(string strStartCell, string strEndCell, object objValue)
208
{
209
CurSheet.get_Range(strStartCell, strEndCell).Merge(mValue);
210
CurSheet.get_Range(strStartCell, mValue).Value2 = objValue;
211
}
212
213
/// <summary>
214
/// 在连续单元格中插入一个DataTable中的值
215
/// </summary>
216
/// <param name="strStartCell">开始的单元格</param>
217
/// <param name="dtData">存储数据的DataTable</param>
218
public void WriteTable(string strStartCell, System.Data.DataTable dtData)
219
{
220
object[,] arrData = new object[dtData.Rows.Count, dtData.Columns.Count];
221
222
for (int i = 0; i < dtData.Rows.Count; i ++)
223
for (int j = 0; j < dtData.Columns.Count; j ++)
224
arrData[i, j] = dtData.Rows[i][j];
225
226
CurSheet.get_Range(strStartCell, this.GetEndCell(strStartCell, dtData.Rows.Count - 1, dtData.Columns.Count - 1)).Value2 = arrData;
227
228
arrData = null;
229
}
230
231
/// <summary>
232
/// 在连续单元格中插入一个DataTable并作超级链接
233
/// </summary>
234
/// <param name="strStartCell">起始单元格标识符</param>
235
/// <param name="dtData">存储数据的DataTable</param>
236
/// <param name="strLinkField">链接的地址字段</param>
237
/// <param name="strTextField">链接的文本字段</param>
238
public void WriteTableAndLink(string strStartCell, System.Data.DataTable dtData, string strLinkField, string strTextField)
239
{
240
object[,] arrData = new object[dtData.Rows.Count, dtData.Columns.Count - 1];
241
242
for (int i = 0; i < dtData.Rows.Count; i ++)
243
{
244
for (int j = 0; j < dtData.Columns.Count; j ++)
245
{
246
if (j > dtData.Columns.IndexOf(strLinkField))
247
arrData[i, j - 1] = dtData.Rows[i][j];
248
else if (j < dtData.Columns.IndexOf(strLinkField))
249
arrData[i, j] = dtData.Rows[i][j];
250
}
251
}
252
253
CurSheet.get_Range(strStartCell, this.GetEndCell(strStartCell, dtData.Rows.Count - 1, dtData.Columns.Count - 2)).Value2 = arrData;
254
255
for (int i = 0; i < dtData.Rows.Count; i ++)
256
this.AddHyperLink(this.NtoL(this.LtoN(this.GetCellLetter(strStartCell)) + dtData.Columns.IndexOf(strTextField)) + System.Convert.ToString(this.GetCellNumber(strStartCell) + i), dtData.Rows[i][strLinkField].ToString() + ".htm", "点击查看详细", dtData.Rows[i][strTextField].ToString());
257
258
arrData = null;
259
}
260
261
/// <summary>
262
/// 为单元格设置公式
263
/// </summary>
264
/// <param name="strCell">单元格标识符</param>
265
/// <param name="strFormula">公式</param>
266
public void SetFormula(string strCell, string strFormula)
267
{
268
CurSheet.get_Range(strCell, mValue).Formula = strFormula;
269
}
270
271
/// <summary>
272
/// 设置单元格或连续区域的字体为黑体
273
/// </summary>
274
/// <param name="strCell">单元格标识符</param>
275
public void SetBold(string strCell)
276
{
277
CurSheet.get_Range(strCell, mValue).Font.Bold = true;
278
}
279
280
/// <summary>
281
/// 设置连续区域的字体为黑体
282
/// </summary>
283
/// <param name="strStartCell">开始单元格标识符</param>
284
/// <param name="strEndCell">结束单元格标识符</param>
285
public void SetBold(string strStartCell, string strEndCell)
286
{
287
CurSheet.get_Range(strStartCell, strEndCell).Font.Bold = true;
288
}
289
290
/// <summary>
291
/// 设置单元格或连续区域的字体颜色
292
/// </summary>
293
/// <param name="strCell">单元格标识符</param>
294
/// <param name="clrColor">颜色</param>
295
public void SetColor(string strCell, System.Drawing.Color clrColor)
296
{
297
CurSheet.get_Range(strCell, mValue).Font.Color = System.Drawing.ColorTranslator.ToOle(clrColor);
298
}
299
300
/// <summary>
301
/// 设置连续区域的字体颜色
302
/// </summary>
303
/// <param name="strStartCell">开始单元格标识符</param>
304
/// <param name="strEndCell">结束单元格标识符</param>
305
/// <param name="clrColor">颜色</param>
306
public void SetColor(string strStartCell, string strEndCell, System.Drawing.Color clrColor)
307
{
308
CurSheet.get_Range(strStartCell, strEndCell).Font.Color = System.Drawing.ColorTranslator.ToOle(clrColor);
309
}
310
311
/// <summary>
312
/// 设置单元格或连续区域的边框:上下左右都为黑色连续边框
313
/// </summary>
314
/// <param name="strCell">单元格标识符</param>
315
public void SetBorderAll(string strCell)
316
{
317
CurSheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeTop].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
318
CurSheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeTop].LineStyle = Excel.XlLineStyle.xlContinuous;
319
320
CurSheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeBottom].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
321
CurSheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeBottom].LineStyle = Excel.XlLineStyle.xlContinuous;
322
323
CurSheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeLeft].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
324
CurSheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeLeft].LineStyle = Excel.XlLineStyle.xlContinuous;
325
326
CurSheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeRight].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
327
CurSheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlEdgeRight].LineStyle = Excel.XlLineStyle.xlContinuous;
328
329
CurSheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlInsideHorizontal].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
330
CurSheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle = Excel.XlLineStyle.xlContinuous;
331
332
CurSheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlInsideVertical].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
333
CurSheet.get_Range(strCell, mValue).Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle = Excel.XlLineStyle.xlContinuous;
334
335
336
}
337
338
/// <summary>
339
/// 设置连续区域的边框:上下左右都为黑色连续边框
340
/// </summary>
341
/// <param name="strStartCell">开始单元格标识符</param>
342
/// <param name="strEndCell">结束单元格标识符</param>
343
public void SetBorderAll(string strStartCell, string strEndCell)
344
{
345
CurSheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeTop].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
346
CurSheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeTop].LineStyle = Excel.XlLineStyle.xlContinuous;
347
348
CurSheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeBottom].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
349
CurSheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeBottom].LineStyle = Excel.XlLineStyle.xlContinuous;
350
351
CurSheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeLeft].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
352
CurSheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeLeft].LineStyle = Excel.XlLineStyle.xlContinuous;
353
354
CurSheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeRight].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
355
CurSheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlEdgeRight].LineStyle = Excel.XlLineStyle.xlContinuous;
356
357
CurSheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlInsideHorizontal].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
358
CurSheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle = Excel.XlLineStyle.xlContinuous;
359
360
CurSheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlInsideVertical].Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.LightGray);
361
CurSheet.get_Range(strStartCell, strEndCell).Borders[Excel.XlBordersIndex.xlInsideVertical].LineStyle = Excel.XlLineStyle.xlContinuous;
362
}
363
364
/// <summary>
365
/// 设置单元格或连续区域水平居左
366
/// </summary>
367
/// <param name="strCell">单元格标识符</param>
368
public void SetHAlignLeft(string strCell)
369
{
370
CurSheet.get_Range(strCell, mValue).HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft;
371
}
372
373
/// <summary>
374
/// 设置连续区域水平居左
375
/// </summary>
376
/// <param name="strStartCell">开始单元格标识符</param>
377
/// <param name="strEndCell">结束单元格标识符</param>
378
public void SetHAlignLeft(string strStartCell, string strEndCell)
379
{
380
CurSheet.get_Range(strStartCell, strEndCell).HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft;
381
}
382
383
/// <summary>
384
/// 设置单元格或连续区域水平居左
385
/// </summary>
386
/// <param name="strCell">单元格标识符</param>
387
public void SetHAlignCenter(string strCell)
388
{
389
CurSheet.get_Range(strCell, mValue).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
390
}
391
392
/// <summary>
393
/// 设置连续区域水平居中
394
/// </summary>
395
/// <param name="strStartCell">开始单元格标识符</param>
396
/// <param name="strEndCell">结束单元格标识符</param>
397
public void SetHAlignCenter(string strStartCell, string strEndCell)
398
{
399
CurSheet.get_Range(strStartCell, strEndCell).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
400
}
401
402
/// <summary>
403
/// 设置单元格或连续区域水平居右
404
/// </summary>
405
/// <param name="strCell">单元格标识符</param>
406
public void SetHAlignRight(string strCell)
407
{
408
CurSheet.get_Range(strCell, mValue).HorizontalAlignment = Excel.XlHAlign.xlHAlignRight;
409
}
410
411
/// <summary>
412
/// 设置连续区域水平居右
413
/// </summary>
414
/// <param name="strStartCell">开始单元格标识符</param>
415
/// <param name="strEndCell">结束单元格标识符</param>
416
public void SetHAlignRight(string strStartCell, string strEndCell)
417
{
418
CurSheet.get_Range(strStartCell, strEndCell).HorizontalAlignment = Excel.XlHAlign.xlHAlignRight;
419
}
420
421
/// <summary>
422
/// 设置单元格或连续区域的显示格式
423
/// </summary>
424
/// <param name="strCell">单元格标识符</param>
425
/// <param name="strNF">如"#,##0.00"的显示格式</param>
426
public void SetNumberFormat(string strCell, string strNF)
427
{
428
CurSheet.get_Range(strCell, mValue).NumberFormat = strNF;
429
}
430
431
/// <summary>
432
/// 设置连续区域的显示格式
433
/// </summary>
434
/// <param name="strStartCell">开始单元格标识符</param>
435
/// <param name="strEndCell">结束单元格标识符</param>
436
/// <param name="strNF">如"#,##0.00"的显示格式</param>
437
public void SetNumberFormat(string strStartCell, string strEndCell, string strNF)
438
{
439
CurSheet.get_Range(strStartCell, strEndCell).NumberFormat = strNF;
440
}
441
442
/// <summary>
443
/// 设置单元格或连续区域的字体大小
444
/// </summary>
445
/// <param name="strCell">单元格或连续区域标识符</param>
446
/// <param name="intFontSize"></param>
447
public void SetFontSize(string strCell, int intFontSize)
448
{
449
CurSheet.get_Range(strCell, mValue).Font.Size = intFontSize.ToString();
450
}
451
452
/// <summary>
453
/// 设置连续区域的字体大小
454
/// </summary>
455
/// <param name="strStartCell">开始单元格标识符</param>
456
/// <param name="strEndCell">结束单元格标识符</param>
457
/// <param name="intFontSize">字体大小</param>
458
public void SetFontSize(string strStartCell, string strEndCell, int intFontSize)
459
{
460
CurSheet.get_Range(strStartCell, strEndCell).Font.Size = intFontSize.ToString();
461
}
462
463
/// <summary>
464
/// 设置列宽
465
/// </summary>
466
/// <param name="strColID">列标识,如A代表第一列</param>
467
/// <param name="decWidth">宽度</param>
468
public void SetColumnWidth(string strColID, double dblWidth)
469
{
470
((Excel.Range)CurSheet.Columns.GetType().InvokeMember("Item", System.Reflection.BindingFlags.GetProperty, null, CurSheet.Columns, new object[]{(strColID + ":" + strColID).ToString()})).ColumnWidth = dblWidth;
471
}
472
473
/// <summary>
474
/// 为单元格添加超级链接
475
/// </summary>
476
/// <param name="strCell">单元格标识符</param>
477
/// <param name="strAddress">链接地址</param>
478
/// <param name="strTip">屏幕提示</param>
479
/// <param name="strText">链接文本</param>
480
public void AddHyperLink(string strCell, string strAddress, string strTip, string strText)
481
{
482
CurSheet.Hyperlinks.Add(CurSheet.get_Range(strCell, mValue), strAddress, mValue, strTip, strText);
483
}
484
485
/// <summary>
486
/// 已知开始的单元格标识,求intR行、intColumn列后的单元格标识
487
/// </summary>
488
/// <param name="strStartCell">开始单元格标识</param>
489
/// <param name="intR">行数</param>
490
/// <param name="intC">列数</param>
491
/// <returns>单元格标识符结果</returns>
492
public string GetEndCell(string strStartCell, int intR, int intC)
493
{
494
495
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^(?<vLetter>[A-Z]+)(?<vNumber>\d+)");
496
497
return this.NtoL(this.LtoN(regex.Match(strStartCell).Result("${vLetter}")) + intC) + System.Convert.ToString((System.Convert.ToInt32(regex.Match(strStartCell).Result("${vNumber}")) + intR));
498
499
}
500
501
/// <summary>
502
/// 获取单元格标识符中的字母
503
/// </summary>
504
/// <param name="strCell">单元格标识符</param>
505
/// <returns>单元格标识符对应的字母</returns>
506
public string GetCellLetter(string strCell)
507
{
508
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^(?<vLetter>[A-Z]+)(?<vNumber>\d+)");
509
return regex.Match(strCell).Result("${vLetter}");
510
}
511
512
/// <summary>
513
/// 获取单元格标识符中的数字
514
/// </summary>
515
/// <param name="strCell">单元格标识符</param>
516
public int GetCellNumber(string strCell)
517
{
518
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^(?<vLetter>[A-Z]+)(?<vNumber>\d+)");
519
return System.Convert.ToInt32(regex.Match(strCell).Result("${vNumber}"));
520
}
521
522
523
/// <summary>
524
/// 另存为xls文件
525
/// </summary>
526
/// <param name="strFilePath">文件路径</param>
527
public void Save(string strFilePath)
528
{
529
CurBook.SaveCopyAs(strFilePath);
530
}
531
532
/// <summary>
533
/// 另存为html文件
534
/// </summary>
535
/// <param name="strFilePath">文件路径</param>
536
public void SaveHtml(string strFilePath)
537
{
538
CurBook.SaveAs(strFilePath, Excel.XlFileFormat.xlHtml, mValue, mValue, mValue, mValue, Excel.XlSaveAsAccessMode.xlNoChange, mValue, mValue, mValue, mValue, mValue);
539
}
540
541
public void CreateHtmlFile()
542
{
543
544
}
545
546
547
548
辅助函数 辅助函数
615
616
617
618
}
619
}
620
621

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

427

428

429

430

431

432

433

434

435

436

437

438

439

440

441

442

443

444

445

446

447

448

449

450

451

452

453

454

455

456

457

458

459

460

461

462

463

464

465

466

467

468

469

470

471

472

473

474

475

476

477

478

479

480

481

482

483

484

485

486

487

488

489

490

491

492

493

494

495

496

497

498

499

500

501

502

503

504

505

506

507

508

509

510

511

512

513

514

515

516

517

518

519

520

521

522

523

524

525

526

527

528

529

530

531

532

533

534

535

536

537

538

539

540

541

542

543

544

545

546

547

548

615

616

617

618

619

620

621


Life is like a boat, and I'm at sea.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义