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创建
工作簿以及工作表的创建很简单,网上一查就能找到相应的方法。大致如下
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来说,可谓冰山一角,暂述至此。还有很多很多的功能尚待发掘,今后会在工作中不断补充,不断积累。