一.COM interop

首先我们要了解下何为COM Interop,它是一种服务,可以使.NET Framework对象能够与COM对象通信。Visual Studio .NET 通过引入面向公共语言运行时的托管代码概念,改变了开发人员在创建和运行应用程序的方式。但是这也使得它与基于Windows API和COM对象的编程有了本质的去比。Visual Studio .NET让托管对象和非托管对象协同工作的过程能够称为互用性(interoperability),通常简称为interop。

 
二.Excel COM命名空间
  Microsoft.Office.Interop.Excel
 
 关键点:
保存excel的时候,使用SaveAs()或SaveCopyAs(),都是新建一个文件,然后将其保存起来
Application.Quit(),因为是非托管的,未释放对象,不能保证完全退出进程。1)可以使用KillProcess(),但有可能误终止其它excel进程 2)将Application实例设为null。
 
 
具体实现过程:
1.这里,把对excel表格的操作封装在一个叫ExcelOperator的类当中,该类主要具有如下方法。当然还有其它辅助方法,会在具体实现的时候展开。
 class ExcelOperator
{
//构造函数,列名为输入参数
public ExcelOperator(List<string> _columnHeader)
{
this.ColumnHeader = _columnHeader;
}
//打开Excel表头
public void OpenExcel();
//输入一条行记录值
public bool ExportToExcel<T>(IEnumerable<T> _records);
//保存并关闭
public bool SaveAndClose();
}
2.在后台打开excel表格:生成一个新excel进程--->取消确认对话框--->给该进程添加一个workbook--->获取该workbook的worksheet(默认情况下一个新建的workbook有一个worksheet)--->格式化表格。具体代码如下:
 public void OpenExcel()
{
excelProcess = new ExcelNameSpace.Application();
if (excelProcess == null) throw new Exception("Excel Application is NULL");
try
{
excelProcess.Visible = false;
//取消提示,可以直接保存修改后的表格,重要
excelProcess.DisplayAlerts = false;
excelProcess.AlertBeforeOverwriting = false;
workbook = excelProcess.Workbooks.Add();
worksheet = workbook.Sheets.get_Item();
worksheet.Name = FileName;
if (worksheet == null) throw new Exception("Excel WorkSheet is NULL");
//自动填充表头或其它内容操作
InitialWorkSheet();
//格式化excel表单
FormatWorkSheet();
this.flagIsOpen = true;
}
catch (Exception e)
{
......
}
}

大家可以注意到,以上方法还有两个子方法,下面把两个子方法的实现过程简单介绍下:

         /// <summary>
/// 填充excel表头名称
/// </summary>
virtual protected void InitialWorkSheet()
{
startRow = ;
startColumn = ;
this.worksheet.Cells[startRow, startColumn].Select();
foreach (string header in this.ColumnHeader)
{
this.excelProcess.ActiveCell.Value = header;
this.excelProcess.ActiveCell.Offset[, ].Select();
}
startRow++;
} /// <summary>
/// 格式化表格
/// </summary>
virtual protected void FormatWorkSheet()
{
//水平居中
this.worksheet.Cells.HorizontalAlignment = ExcelNameSpace.XlVAlign.xlVAlignCenter;
//设置列名框颜色
var hCell = worksheet.Cells[, this.ColumnHeader.Count];
this.excelProcess.Range["A1", hCell].Interior.ColorIndex = ;
this.excelProcess.Range["A1", hCell].Borders.LineStyle = ;
this.excelProcess.Range["A1", hCell].Borders[ExcelNameSpace.XlBordersIndex.xlEdgeLeft].Weight = ExcelNameSpace.XlBorderWeight.xlThin;
......
}

在InitialWorkSheet()方法中,可以看到有两个全局变量startRow和startColumn,这两个变量就是用来记录下一个有效输入的位置的。

3.插入行记录,我在这里是想实现批量插入记录的功能。为了方便使用,首先编写了一个Record类,含有一个List<string>成员,用来记录单独一行的记录。然后在传入一个List<Record>的参数。其实简单点,直接传输一个List<string>参数,每次单独加一条记录也可以了。不过为了练习。具体代码如下:

         /// <summary>
/// 利用Record集合添加记录
/// </summary>
virtual public bool ExportToExcel<T>(IEnumerable<T> _records) where T : Record
{
try
{
this.worksheet.Cells[startRow, startColumn].Select();
foreach (var record in _records)
{
this.worksheet.Cells[startRow, startColumn].Select();
foreach (var item in record)
{
this.excelProcess.ActiveCell.Value = item;
this.excelProcess.ActiveCell.Offset[, ].Select();
}
startRow++;
}
return true;
}
catch(Exception e)
{
......
}
}

4.保存并关闭:

         public bool SaveAndClose()
{
//用另存为的方式保存共工作簿,利用GenerateFileURL()产生文件存储路径
this.workbook.SaveAs(GenerateFileURL());
this.workbook.Close();
this.flagIsOpen = false;
         //关闭进程
this.excelProcess.Quit();
         //保证释放非托管对象
System.Runtime.InteropServices.Marshal.ReleaseComObject(this.excelProcess);
this.excelProcess = null;
return true;
}

5.ExcelOperator类还包含了FileName(文件名)、FilePath(文件存储路径)等属性,请自行进行实现。

利用C#实现对excel的写操作的更多相关文章

  1. 通过vb.net 和NPOI实现对excel的读操作

    通过vb.net 和NPOI实现对excel的读操作,很久很久前用过vb,这次朋友的代码是vb.net写的需要一个excel的操作, 就顾着着实现功能了,大家凑合着看吧 Option Explicit ...

  2. 使用jxl操作之一: 实现对Excel简单读写操作

    项目目录树 对象类UserObject UserObject.java package com.dlab.jxl; public class UserObject { private String u ...

  3. 使用POI来实现对Excel的读写操作

    事实上我感觉直接贴代码就好了.代码里面差点儿做到每一行一个凝视.应该看起来会比較简单 代码托管在github上:https://github.com/chsj1/ExcelUtils package ...

  4. JAVA-----基于POI实现对Excel导入

    在日常项目开发中, 数据录入和导出是十分普遍的需求,因此,导入导出也成为了开发中一个经典的功能.数据导出的格式一般是excel或者pdf,而批量导入的信息一般是借助excel来减轻工作量,提高效率. ...

  5. Python中实现对list做减法操作介绍

    Python中实现对list做减法操作介绍 这篇文章主要介绍了Python中实现对list做减法操作介绍,需要的朋友可以参考下 问题描述:假设我有这样两个list, 一个是list1,list1 = ...

  6. Excel操作类库最常用到的4种开源项目与MS Excel类库写操作对比分析性能

    4种开源Excel读写类库与MS Excel类库写操作对比 软件开发过程中,经常需要将数据保存为.xls或.xlsx文件.之前发现微软提供的Microsoft.Office.Interop.Excel ...

  7. Python实现对excel的操作

    1.操作excel使用第三方库openpyxl安装:pip install openpyxy引入:import openpyxl2.常用简单操作1)打开excel文件获取工作簿wb = openpyx ...

  8. 使用代理实现对C# list distinct操作

    范型在c#编程中经常使用,而经常用list 去存放实体集,因此会设计到对list的各种操作,比较常见的有对list进行排序,查找,比较,去重复.而一般的如果要对list去重复如果使用linq dist ...

  9. 在Asp.Net MVC中使用NPOI插件实现对Excel的操作(导入,导出,合并单元格,设置样式,输入公式)

    前言 NPOI 是 POI 项目的.NET版本,它不使用 Office COM 组件,不需要安装 Microsoft Office,目前支持 Office 2003 和 2007 版本. 1.整个Ex ...

随机推荐

  1. 初识jQuery 2013-09-26

    常用选择器 $("#bad")  id选择器 $("div#bad")   id为bad 并且必须是div的元素 $("[href]")  ...

  2. HttpWebRequest代理访问网站

    private void button1_Click(object sender, EventArgs e) { string str ="http://www.7y8.com/V/ip.a ...

  3. ON、WHERE、HAVING的区别

    ON .WHERE.HAVING都能通过限制条件筛选数据,但他们的使用及其不同.下面我们来分析三者之间的区别. 1.       ON 和WHERE 所有的查询都回产生一个中间临时报表,查询结果就是从 ...

  4. JSTL(fn函数)

    JSTL(fn函数) 首先,我们要在页面的最上方引用: <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/js ...

  5. C#中的局部类

    什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中. 局部类型适用于以下情况: (1) 类型特别大,不宜放在一个文 ...

  6. 关于浮动-float

    1.存在浏览器兼容问题:js代码 2.对于这种存在浏览器兼容问题的问题,我们可以绕开兼容性问题,先在css样式写好,然后通过该变className 3.学习的博客 https://paran.io/c ...

  7. xtraTabControl 如何遍历每个选项卡 z

    XtraTabHitInfo hi = tabPositionControl.CalcHitInfo(new Point(e.X, e.Y)); if (hi.HitTest == XtraTabHi ...

  8. Delphi 注册文件类型 设置文件图标

        {------------------------------------------------------------------------------- @过程名: slpert -& ...

  9. Web前端开发工程师编程能力飞升之路

    [背景] 如果你是刚进入web前端研发领域,想试试这潭水有多深,看这篇文章吧:如果你是做了两三年web产品前端研发,迷茫找不着提高之路,看这篇文章吧:如果你是四五年的前端开发高手,没有难题能难得住你的 ...

  10. 【LeetCode】101 - Symmetric Tree

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...