C# 操作Excel,1.1版

最近主要负责导出模块,用到了一些C#操作Excel的知识点,稍作小结。整体思路是,从Excel自身的功能出发,先考虑在Excel里所需功能的实现方式,再调查用代码如何实现。

主要使用了 Microsoft.Office.Interop.Excel类库,参照API如下:

http://msdn.microsoft.com/zh-cn/library/Microsoft.Office.Tools.Excel

工作簿以及工作表的创建很简单,网上一查就能找到相应的方法。大致如下

1)引入Excel的命名空间

using Microsoft.Office.Interop.Excel;

2)创建Excel需要实例化Excel 的Application 类

Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();

3)Excel中 由 ”工作薄“Workbook和”页“Worksheet 两个类组成

//工作簿

Micros oft.Office.Interop.Excel.Workbook workbook = xlApp.Workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);

其中,对于一个工作簿有可能有多个工作表,所以需要先 实例化工作表集,再取得工作表。

Microsoft.Office.Interop.Excel.Sheets worksheets = workbook.Worksheets;

Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)worksheets.get_Item(1);

(备注:

i)各种异常处理,判空处理,代码略去不述,以下同。

ii)下述说明中使用的变量与此处xlApp,workbook,worksheet的定义一致。)

2.设置工作表单元格(内容、格式、公式)

对于需要循环生成数据的sheet页来说,可以使用System.Data.DataTable类来处理数据,

(DataTable类的用法很简单,不再赘述。参照

http://msdn.microsoft.com/zh-cn/library/system.data.datatable(VS.80).aspx

2.1 设置工作表名称

worksheet.Name=“sheet1”;

2.2 单元格与Range

对于单元格,可单独操作某一个单元格,也可使用Microsoft.Office.Interop.Excel.Range(区域)

1)Sheet由单元格cells组成:sheet.cells[RowIndex,ColumnIndex],根据行号和列号来定位单元格进行赋值

worksheet.Cells[2, 3]=”2行3列内容”;

2)Microsoft.Office.Interop.Excel.Range range;

i)单个单元格区域:

range = worksheet.Range["E3"];

或者

range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[2, 3];

ii)多个单元格区域

range = sheet.get_Range("A1", "W69"); 从A1到 W69 的区域

或者

range =worksheet.Range[worksheet.Cells[5, 4], worksheet.Cells[5, 5]];

2.3 设置行,列以及单元格的样式

1)设置为文本格式:

range.NumberFormatLocal = "@";

小数格式

range.NumberFormat = "0.0";

2)对齐方式(以左对齐为例):

range.HorizontalAlignment = XlHAlign.xlHAlignLeft;

(顾名思义:居中为xlHAlignCenter,居右为xlHAlignRight)

3)设置字体

range.Font.Bold = true;//设置黑体

range1.Font.Name = "仿宋";//设置字体

range1.Font.Size = 18;//设置字体大小

range.Font.ColorIndex = 3;//颜色

(Excel颜色值可自行百度之)

4)边框设置

range.Borders.ColorIndex = 1;//颜色

range.Borders.get_Item(XlBordersIndex.xlEdgeRight).LineStyle = XlLineStyle.xlContinuous;//边线

5)设置行列宽度和高度(可设置全局行列高度,也可以设置某些单元格的行列高度)

worksheet.Columns[3].ColumnWidth = 23;

range.Columns.RowHeight = 23;

6)隐藏某行某列

worksheet.Rows[1].Hidden = true;

worksheet.Columns[3].Hidden = true;

2.4 对单元格设置数据验证

例1 :验证所输入内容必须为0-100内的decimal类型的数字

range.Validation.Add(

Microsoft.Office.Interop.Excel.XlDVType.xlValidateDecimal,

Microsoft.Office.Interop.Excel.XlDVAlertStyle.xlValidAlertStop,

Microsoft.Office.Interop.Excel.XlFormatConditionOperator.xlBetween, 0, 100);

例2:验证所输入内容为至少输入3个字符的字符串

range.Validation.Add(

Microsoft.Office.Interop.Excel.XlDVType..xlValidateTextLength,

Microsoft.Office.Interop.Excel.XlDVAlertStyle.xlValidAlertStop,

Microsoft.Office.Interop.Excel.XlFormatConditionOperator.xlGreater, 3);

2.5 对单元格设置公式

公式写法与Excel中的公式一致,可根据需求拼接相应的公式字符串。如:

range.Formula = "=SUM(E3:F3)";

2.6指定可编写的单元格

有时候,我们根据需求,需设置只有部分的单元格能编辑,有两种方式可以实现:

方法一:

先将可编辑的单元格的“锁定”属性去掉:

range= worksheet.Range[worksheet.Cells[3, 5], worksheet.Cells[3,6]];

range.Locked = false;

然后将整个工作表锁定,即Excel中的“保护工作表”功能。

参照:

http://msdn.microsoft.com/zh-cn/library/microsoft.office.tools.excel.worksheet.protect(VS.80).aspx

worksheet.Protect(

protectKey, //该字符串为工作表或工作簿指定区分大小写的密码。如果省略此参数,//不用密码就可以取消对工作表或工作簿的保护

Type.Missing, //为 true 时保护形状。默认值为 false

Type.Missing, //为 true 可保护锁定单元格中的内容。默认值为 true

Type.Missing, //为 true 时保护方案。默认值为 true

Type.Missing, //为 true 可保护用户界面,但不保护宏。如果省略此参数,则同时对宏//和用户界面应用保护

Type.Missing, //为 true,则允许用户格式化受保护的工作表上的任何单元格。默认值为 //false

Type.Missing, //为 true,则允许用户格式化受保护的工作表上的任何列。默认值为 //false

Type.Missing, //为 true,则允许用户格式化受保护的工作表上的任何行。默认值为 //false

Type.Missing, //为 true,则允许用户在受保护的工作表上插入列。默认值为 false

Type.Missing, //为 true,则允许用户在受保护的工作表上插入行。默认值为 false

Type.Missing, //为 true,则允许用户在工作表上插入超链接。默认值为 false

Type.Missing, //为 true,则允许用户在受保护的工作表上删除列,此处要删除的列中的//每个单元格都已被解除锁定。默认值为 false

Type.Missing, //为 true,则允许用户在受保护的工作表上删除行,此处要删除的行中的//每个单元格都已被解除锁定。默认值为 false

true, //为 true,则允许用户在受保护的工作表上进行排序。排序范围中的每个//单元格都必须已解除锁定或不受保护。默认值为 false

Type.Missing, //为 true,则允许用户在受保护的工作表上设置筛选器。用户可以更改筛//选条件,但不能启用或禁用自动筛选。用户可以在现有的自动筛选上设置筛选器。默认值为 false

Type.Missing //为 true,则允许用户在受保护的工作表上使用数据透视表。默认值为 //false

);

方法二:

将工作表设置保护:

worksheet.Protect(“password”,true); //(其他参数可缺省)

然后,设定可以操作的单元格

Microsoft.Office.Interop.Excel.AllowEditRanges ranges = excelSheet.Protection.AllowEditRanges;

ranges.Add("Information", myExcel.Application.get_Range("B2", "B2"), Type.Missing);

类似地,保护工作簿也是调用Protect方法:

workbook.Protect(“password”, true);

2.6 冻结窗口

1)先选中一个区域(冻结线是所选择的单元格的上边线和左边线)

range = worksheet.Range["E3"];

range.Select();

再将整个Excel的”冻结窗口“设置为true

xlApp.ActiveWindow.FreezePanes = true;

3. Excel 异常处理与释放内存

需要特别指出的是,Excel处理中有很多可能出现异常的地方,需要特别处理。

在使用完Excel后,需进行关闭和释放内存。

if (workbook != null)

{

workbook.Close(true, Type.Missing, Type.Missing);

workbook = null;

}

if (xlApp != null)

{

xlApp.Quit();

xlApp = null;

}

4. Excel 下载

1)将Excel文件保存到服务器某路径下。

该类提供了SaveAs方法,可以将文件存储于指定目录下。详情参考

http://msdn.microsoft.com/zh-cn/library/ff198017.aspx.

xlApp.ActiveWorkbook.SaveAs(

filePath, //文件名

XlFileFormat.xlAddIn8, //保存文件时使用的文件格式,xlAddIn8为//Microsoft Excel 97-2003格式,如果想保存为Excel 2007 加载项,则为xlAddIn。 Missing.Value, //区分大小写的字符串(最长不超过 15 个字符),用于指定文件的保护密码

Missing.Value, //表示文件写保护密码的字符串。如果文件保存时带有密码,但打开文件时不输入密码,则该文件以只读方式打开

Missing.Value, //布尔类型,为true则显示一条信息,当打开文件时,建议//以只读方式打开该文件

Missing.Value, //要创建的备份文件

XlSaveAsAccessMode.xlExclusive, //工作簿的访问模式,xlExclusive为独//占模式

Missing.Value, //确定方法如何在保存工作簿时解决冲突,默认显示冲突解//决对话框

Missing.Value, //布尔类型,为true则要将此工作簿添加到列表中最近使用//的文件,默认值为false

Missing.Value, //忽略在 Microsoft Excel 中的所有语言

Missing.Value, //忽略在 Microsoft Excel 中的所有语言

Missing.Value//保存文件符合该语言的 Microsoft Excel (包括控制面板//设置)

);

2) 返回给前台一个特定的字符串,前台发起请求 进行下载

添加头部信息,指定返回的是一个不能被客户端读取的流,必须被下载

Response.ContentEncoding = System.Text.Encoding.UTF8;

Response.AddHeader("Content-Disposition", "attachment; filename=" +”fileName“+ ".xls");

Response.ContentType = "application/ms-excel";

从服务器上读取文件,需要注意的是此处使用的是TransmitFile方法,将文件直接写入HTTP响应输出流。

Response.TransmitFile(filePath);

后记:

以上只是针对此次涉及到的Excel操作知识点作了汇总,对于整个C#操作Excel来说,可谓冰山一角,暂述至此。还有很多很多的功能尚待发掘,今后会在工作中不断补充,不断积累。