利用C#实现对excel的写操作
2015-02-10 16:59
411 查看
一.COM interop
首先我们要了解下何为COM Interop,它是一种服务,可以使.NET Framework对象能够与COM对象通信。Visual Studio .NET 通过引入面向公共语言运行时的托管代码概念,改变了开发人员在创建和运行应用程序的方式。但是这也使得它与基于Windows API和COM对象的编程有了本质的去比。Visual Studio .NET让托管对象和非托管对象协同工作的过程能够称为互用性(interoperability),通常简称为interop。
二.Excel COM命名空间
Microsoft.Office.Interop.Excel
关键点:
保存excel的时候,使用SaveAs()或SaveCopyAs(),都是新建一个文件,然后将其保存起来
Application.Quit(),因为是非托管的,未释放对象,不能保证完全退出进程。1)可以使用KillProcess(),但有可能误终止其它excel进程 2)将Application实例设为null。
具体实现过程:
1.这里,把对excel表格的操作封装在一个叫ExcelOperator的类当中,该类主要具有如下方法。当然还有其它辅助方法,会在具体实现的时候展开。
2.在后台打开excel表格:生成一个新excel进程--->取消确认对话框--->给该进程添加一个workbook--->获取该workbook的worksheet(默认情况下一个新建的workbook有一个worksheet)--->格式化表格。具体代码如下:
大家可以注意到,以上方法还有两个子方法,下面把两个子方法的实现过程简单介绍下:
在InitialWorkSheet()方法中,可以看到有两个全局变量startRow和startColumn,这两个变量就是用来记录下一个有效输入的位置的。
3.插入行记录,我在这里是想实现批量插入记录的功能。为了方便使用,首先编写了一个Record类,含有一个List<string>成员,用来记录单独一行的记录。然后在传入一个List<Record>的参数。其实简单点,直接传输一个List<string>参数,每次单独加一条记录也可以了。不过为了练习。具体代码如下:
4.保存并关闭:
5.ExcelOperator类还包含了FileName(文件名)、FilePath(文件存储路径)等属性,请自行进行实现。
首先我们要了解下何为COM Interop,它是一种服务,可以使.NET Framework对象能够与COM对象通信。Visual Studio .NET 通过引入面向公共语言运行时的托管代码概念,改变了开发人员在创建和运行应用程序的方式。但是这也使得它与基于Windows API和COM对象的编程有了本质的去比。Visual Studio .NET让托管对象和非托管对象协同工作的过程能够称为互用性(interoperability),通常简称为interop。
二.Excel COM命名空间
Microsoft.Office.Interop.Excel
关键点:
保存excel的时候,使用SaveAs()或SaveCopyAs(),都是新建一个文件,然后将其保存起来
Application.Quit(),因为是非托管的,未释放对象,不能保证完全退出进程。1)可以使用KillProcess(),但有可能误终止其它excel进程 2)将Application实例设为null。
具体实现过程:
1.这里,把对excel表格的操作封装在一个叫ExcelOperator的类当中,该类主要具有如下方法。当然还有其它辅助方法,会在具体实现的时候展开。
class ExcelOperator { //构造函数,列名为输入参数 public ExcelOperator(List<string> _columnHeader) { this.ColumnHeader = _columnHeader; } //打开Excel表头 public void OpenExcel(); //输入一条行记录值 public bool ExportToExcel<T>(IEnumerable<T> _records); //保存并关闭 public bool SaveAndClose(); }
2.在后台打开excel表格:生成一个新excel进程--->取消确认对话框--->给该进程添加一个workbook--->获取该workbook的worksheet(默认情况下一个新建的workbook有一个worksheet)--->格式化表格。具体代码如下:
public void OpenExcel() { excelProcess = new ExcelNameSpace.Application(); if (excelProcess == null) throw new Exception("Excel Application is NULL"); try { excelProcess.Visible = false; //取消提示,可以直接保存修改后的表格,重要 excelProcess.DisplayAlerts = false; excelProcess.AlertBeforeOverwriting = false; workbook = excelProcess.Workbooks.Add(); worksheet = workbook.Sheets.get_Item(1); worksheet.Name = FileName; if (worksheet == null) throw new Exception("Excel WorkSheet is NULL"); //自动填充表头或其它内容操作 InitialWorkSheet(); //格式化excel表单 FormatWorkSheet(); this.flagIsOpen = true; } catch (Exception e) { ...... } }
大家可以注意到,以上方法还有两个子方法,下面把两个子方法的实现过程简单介绍下:
/// <summary> /// 填充excel表头名称 /// </summary> virtual protected void InitialWorkSheet() { startRow = 1; startColumn = 1; this.worksheet.Cells[startRow, startColumn].Select(); foreach (string header in this.ColumnHeader) { this.excelProcess.ActiveCell.Value = header; this.excelProcess.ActiveCell.Offset[0, 1].Select(); } startRow++; } /// <summary> /// 格式化表格 /// </summary> virtual protected void FormatWorkSheet() { //水平居中 this.worksheet.Cells.HorizontalAlignment = ExcelNameSpace.XlVAlign.xlVAlignCenter; //设置列名框颜色 var hCell = worksheet.Cells[1, this.ColumnHeader.Count]; this.excelProcess.Range["A1", hCell].Interior.ColorIndex = 24; this.excelProcess.Range["A1", hCell].Borders.LineStyle = 1; this.excelProcess.Range["A1", hCell].Borders[ExcelNameSpace.XlBordersIndex.xlEdgeLeft].Weight = ExcelNameSpace.XlBorderWeight.xlThin; ...... }
在InitialWorkSheet()方法中,可以看到有两个全局变量startRow和startColumn,这两个变量就是用来记录下一个有效输入的位置的。
3.插入行记录,我在这里是想实现批量插入记录的功能。为了方便使用,首先编写了一个Record类,含有一个List<string>成员,用来记录单独一行的记录。然后在传入一个List<Record>的参数。其实简单点,直接传输一个List<string>参数,每次单独加一条记录也可以了。不过为了练习。具体代码如下:
/// <summary> /// 利用Record集合添加记录 /// </summary> virtual public bool ExportToExcel<T>(IEnumerable<T> _records) where T : Record { try { this.worksheet.Cells[startRow, startColumn].Select(); foreach (var record in _records) { this.worksheet.Cells[startRow, startColumn].Select(); foreach (var item in record) { this.excelProcess.ActiveCell.Value = item; this.excelProcess.ActiveCell.Offset[0, 1].Select(); } startRow++; } return true; } catch(Exception e) { ...... } }
4.保存并关闭:
public bool SaveAndClose() { //用另存为的方式保存共工作簿,利用GenerateFileURL()产生文件存储路径 this.workbook.SaveAs(GenerateFileURL()); this.workbook.Close(); this.flagIsOpen = false; //关闭进程 this.excelProcess.Quit(); //保证释放非托管对象 System.Runtime.InteropServices.Marshal.ReleaseComObject(this.excelProcess); this.excelProcess = null; return true; }
5.ExcelOperator类还包含了FileName(文件名)、FilePath(文件存储路径)等属性,请自行进行实现。
相关文章推荐
- 利用jxl实现excel操作
- 关于C#操作EXCEL,生成图表的全面应用之二(利用Microsoft.Office.Interop.OWC11)
- xml学习(三)---利用xml文件实现数据岛功能(网页显示xml文件中的内容免C#代码操作xml文件)
- C#.net实现windows窗体程序对Excel文件的读写操作
- 利用excel进程实现导入功能时在本地能正常操作,在服务器上始终报错
- [原创]C#通过引用Office Excel (2007) 组件实现对Excel文件的操作
- C#实现在Excel中搜索文本(遍历操作)
- C#中利用委托实现多线程跨线程操作
- C#前期绑定和后期绑定操作Excel-------实现简单打印功能
- C#通过引用Office Excel (2007) 组件实现对Excel文件的操作
- C#利用excel文件结构实现导出到excel
- C#利用Windows API 实现关机、注销、重启等操作
- C#操作Excel文件暨C#实现在Excel中将连续多列相同数据项合并
- C# 操作EXCEL 类 可以实现导入导出功能 折腾了好长时间 现在两种方法显示出来
- C#中利用委托实现多线程跨线程操作
- C#通过引用Office Excel (2007) 组件实现对Excel文件的操作
- C#利用扩展方法,不引入新的类型,实现矩阵的操作
- 利用C#2005实现数据表的基本操作
- Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表
- C#前期绑定和后期绑定操作Excel-------实现简单打印功能