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

  • 相关阅读:
    1.27
    1.25
    Representation Learning with Contrastive Predictive Coding
    Learning a Similarity Metric Discriminatively, with Application to Face Verification
    噪声对比估计(负样本采样)
    Certified Adversarial Robustness via Randomized Smoothing
    Certified Robustness to Adversarial Examples with Differential Privacy
    Dynamic Routing Between Capsules
    Defending Adversarial Attacks by Correcting logits
    Visualizing Data using t-SNE
  • 原文地址:https://www.cnblogs.com/miaojf/p/4228845.html
Copyright © 2011-2022 走看看