首页  :: 新随笔  :: 订阅 订阅  :: 管理

为简化使用Excel COM写的类

Posted on 2007-06-07 11:29  礼拜一  阅读(405)  评论(0编辑  收藏  举报
  1using System;
  2
  3namespace 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


http://waxdoll.cnblogs.com/archive/2005/10/28/264071.html