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来说,可谓冰山一角,暂述至此。还有很多很多的功能尚待发掘,今后会在工作中不断补充,不断积累。

时间: 2024-08-02 03:31:17

C# 操作Excel(1.1版)的相关文章

NPOI操作Excel 005:写入空Excel(Winform版)

前文写了一个BS版本号的导出Excel的样例(http://blog.csdn.net/yysyangyangyangshan/article/details/47904119).对于CS版在保存的地方有少许修改.直接看代码例如以下: private void button1_Click(object sender, EventArgs e) { //要保存的内容.此处用代码生成的内容,而在实际中能够是数据库读取的, //亦或是页面输入的内容 DataTable dt = new DataTab

POI操作Excel

Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推.行则使用数字表示,例如:A3 表示第三行第一列,E5表示第五行第五列. POI工具包 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 9

JAVA的POI操作Excel

1.1Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推.行则使用数字表示,例如:A3 表示第三行第一列,E5表示第五行第五列. 1.2 POI工具包 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Exce

POI操作EXCEL(二)

原文转自:http://www.tqcto.com/article/code/295025.html java当初把核心处理设成Unicode,带来的好处是另代码适应了多语言环境.然而由于老外的英语只有26个字母,有些情况下,一些程序员用8 位的byte处理,一不小心就去掉了CJK的高位.或者是由于习惯在程序中采用硬编码,还有多种原因,使得许多java应用在CJK的处理上很烦恼.还好 在POI HSSF中考虑到这个问题,可以设置encoding为双字节. POI可以到www.apache.org

自己封装的poi操作Excel工具类

该工具类主要完成的功能是:读取Excel.汇总Excel的功能.在读取时,可以设定开始和结束读取的位置.设定是否读取多个sheet.设定读取那个或者那些sheet等.在汇总时,如设定是否覆盖目标文件.设定是否比较检查重复内容.设定检查重复的列索引等功能. package com.tgb.ccl.excel.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; impo

C#使用第三方组件Epplus操作Excel表

Epplus操作Excel基础详解 1.什么是Epplus Epplus是一个使用Open Office XML文件格式,能读写Excel2007/2010文件的开源组件,在导出Excel的时候不需要电脑上安装office. 其中,Open Office XML文档格式包括我们常见的xlsx.docx.pptx等,换而言之,我们常见的这些格式的文件都是基于捆绑XML文件的,使用Epplus操作的本质是通过操作XML文件去操作xlsx.XML,是一种可扩展标记语言,在计算机中,标记指计算机能理解的

Apache POI组件操作Excel,制作报表(一)

Apache的POI组件是Java操作Microsoft Office办公套件的强大API,其中对Word,Excel和PowperPoint都有支持,当然使用较多的还是Excel,因为Word和PowerPoint用程序动态操作的应用较少.那么本文就结合POI来介绍一下操作Excel的方法.    Office 2007的文件结构完全不同于2003,所以对于两个版本的Office组件,POI有不同的处理API,分开使用即可.首先来说几个Excel的基本概念.对于一个Excel文件,这称为一个工

关于VS C++ 操作 EXCEL(关闭EXCEL文件提示是否保存,早期公式...)

最近一个项目需要 操作 EXCEL. 原理可以借鉴下面这个博客: http://blog.sina.com.cn/s/blog_6163bdeb0102dxcy.html 我采用的也是最常用的最常用的 OLE 自动化方式,这种模式建议要仔细阅读类文档,提供的功能还是比较丰富的. 那么在设计中遇到一个问题,打开EXCEL,退出后提示“是否保存对....的更改,Microsfot Excel 在打开上次由EXCEL的早期版本保存文件时会重新计算公式” 那么项目中这个文件是2003版老文件,而我的电脑

微博excel数据清洗(Java版)

微博数据清洗(Java版) 原创 2013年12月10日 10:58:24 2979 大数据公益大学提供的一份数据,义务处理一下,原始数据是Excel,含有html标签,如下:   要求清洗掉html标签,和微博内容中的url地址. 主要分为两部分: 1.处理文本,清洗数据. 2.处理excel读写操作. 上代码: ExcelUtil类,包含Excel2003-2007的读写操作,Excel使用Apache POI进行操作,需要jar包如下: [java] view plain copy pac