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

  • 相关阅读:
    对Java字符串的探究
    类加载器操作三原则[译]
    Android小游戏:功夫蛇 团队开发经验总结
    octopress第三方插件:博文同步工具syncPost
    PAT 1061
    关于软件工程的一些看法
    Python3+Selenium2完整的自动化测试实现之旅(三):Selenium-webdriver提供的元素定位方法
    Python3+Selenium2完整的自动化测试实现之旅(二):IE和Chrome浏览器驱动配置
    Python3+Selenium2完整的自动化测试实现之旅(一):自动化测试环境搭建
    Python使用WMI模块获取Windows系统的硬件信息,并使用pyinstaller库编译打包成exe的可执行文件
  • 原文地址:https://www.cnblogs.com/miaojf/p/4228845.html
Copyright © 2020-2023  润新知