利用C#实现对excel的写操作

一.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的类当中,该类主要具有如下方法。当然还有其它辅助方法,会在具体实现的时候展开。

 1 class ExcelOperator
 2 {
 3   //构造函数,列名为输入参数
 4         public ExcelOperator(List<string> _columnHeader)
 5         {
 6             this.ColumnHeader = _columnHeader;
 7         }
 8   //打开Excel表头
 9         public void OpenExcel();
10   //输入一条行记录值
11         public bool ExportToExcel<T>(IEnumerable<T> _records);
12   //保存并关闭
13         public bool SaveAndClose();
14 }   

2.在后台打开excel表格:生成一个新excel进程--->取消确认对话框--->给该进程添加一个workbook--->获取该workbook的worksheet(默认情况下一个新建的workbook有一个worksheet)--->格式化表格。具体代码如下:

 1 public void OpenExcel()
 2         {
 3             excelProcess = new ExcelNameSpace.Application();
 4             if (excelProcess == null) throw new Exception("Excel Application is NULL");
 5                 try
 6                 {
 7                     excelProcess.Visible = false;
 8   //取消提示,可以直接保存修改后的表格,重要
 9                     excelProcess.DisplayAlerts = false;
10                     excelProcess.AlertBeforeOverwriting = false;
11                     workbook = excelProcess.Workbooks.Add();
12                     worksheet = workbook.Sheets.get_Item(1);
13                     worksheet.Name = FileName;
14                     if (worksheet == null) throw new Exception("Excel WorkSheet is NULL");
15   //自动填充表头或其它内容操作
16                     InitialWorkSheet();
17   //格式化excel表单
18                     FormatWorkSheet();
19                     this.flagIsOpen = true;
20                 }
21                 catch (Exception e)
22                 {
23                    ......
24                 }
25         }    

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

 1         /// <summary>
 2         /// 填充excel表头名称
 3         /// </summary>
 4         virtual protected void InitialWorkSheet()
 5         {
 6             startRow = 1;
 7             startColumn = 1;
 8             this.worksheet.Cells[startRow, startColumn].Select();
 9             foreach (string header in this.ColumnHeader)
10             {
11                 this.excelProcess.ActiveCell.Value = header;
12                 this.excelProcess.ActiveCell.Offset[0, 1].Select();
13             }
14             startRow++;
15         }
16
17         /// <summary>
18         /// 格式化表格
19         /// </summary>
20         virtual protected void FormatWorkSheet()
21         {
22             //水平居中
23             this.worksheet.Cells.HorizontalAlignment = ExcelNameSpace.XlVAlign.xlVAlignCenter;
24             //设置列名框颜色
25             var hCell = worksheet.Cells[1, this.ColumnHeader.Count];
26             this.excelProcess.Range["A1", hCell].Interior.ColorIndex = 24;
27             this.excelProcess.Range["A1", hCell].Borders.LineStyle = 1;
28            this.excelProcess.Range["A1", hCell].Borders[ExcelNameSpace.XlBordersIndex.xlEdgeLeft].Weight = ExcelNameSpace.XlBorderWeight.xlThin;
29           ......
30         }

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

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

 1         /// <summary>
 2         /// 利用Record集合添加记录
 3         /// </summary>
 4         virtual public bool ExportToExcel<T>(IEnumerable<T> _records) where T : Record
 5         {
 6             try
 7             {
 8                 this.worksheet.Cells[startRow, startColumn].Select();
 9                 foreach (var record in _records)
10                 {
11                     this.worksheet.Cells[startRow, startColumn].Select();
12                     foreach (var item in record)
13                     {
14                         this.excelProcess.ActiveCell.Value = item;
15                         this.excelProcess.ActiveCell.Offset[0, 1].Select();
16                     }
17                     startRow++;
18                 }
19                 return true;
20             }
21             catch(Exception e)
22             {
23                ......
24             }
25         }

4.保存并关闭:

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

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

时间: 2024-09-30 20:55:54

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

php如何利用python实现对pdf文件的操作(读写、合并分割)

php如何利用python实现对pdf文件的操作 需求:在PHP里实现了把8.pdf的前4页pdf文件截取出来生成新的pdf文件. 详细步骤如下: 1. 安装python第三方库PyPDF2 前提:python必须是3.x版本以上,必要时需要升级pip3,命令如下:pip3 install --upgrade pipPyPDF 自 2010年 12月开始就不在更新了,PyPDF2 接棒 PyPDF, 在此使用PyPDF2. 安装命令:pip install PyPDF2 2.编写python脚本

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

项目目录树 对象类UserObject UserObject.java package com.dlab.jxl; public class UserObject { private String userName; private String age; private String address; public String getUserName() { return userName; } public void setUserName(String userName) { this.

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

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

python实现对excel表的读写操作(一)

Part 1. 模块介绍: 使用python实现对excel表的读写操作有两个模块,分别为: 1. 对excel表读取模块 xlrd 0.9.3  :下载地址: https://pypi.python.org/pypi/xlrd 英文释意:The package is for reading data and formatting information from Excel files. 2. 对excel表写入模块 xlwt 0.7.5 : 下载地址:https://pypi.python.

利用PRTG实现对cisco路由器的cpu负载、端口流量等的监控

一.实验目的及前期准备 用gns3.vmware模拟真实的环境,利用prtg实现对cisco路由器状态的监控 前期准备:GNS3仿真路由软件和VMware虚拟软件,PRTG. 二.实验步骤 1)搭建如下拓扑环境 VMware server有2张网卡,一张(out)桥接到真实主机(Windows7)的网卡,另一张(in)连接到GNS3的R1路由器的e1/0上:R1路由器的e1/1和VMwar winxp的网卡相连. a)VMware安装一个server2003系统和一个xp系统,并虚拟3张虚拟网卡

windows下搭建LDAP并利用Java实现对LDAP的操作

什么是LDAP,百度百科一堆专业术语的描述. 我总结为一句话:轻量级目录访问协议,有数据库的数据存储功能,以树状层次型存储方式,就好像你的电话薄那样. 在一次项目中,由于该项目是教育性管理项目,客户要求项目必须部署在内网.那么在内网的话,就代表用户需要去拨VPN才能进行内网的访问. 其实当时我想到的是,单独开个注册映射到外网,让用户自己注册,管理员进行审核,然后用VPN去读数据库中的账号和密码就行了.这样,我们的系统和vpn就 相当于统一账号.但是当我确认需求的时候,那个老师告诉我们,他不会读什

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

前言 NPOI 是 POI 项目的.NET版本,它不使用 Office COM 组件,不需要安装 Microsoft Office,目前支持 Office 2003 和 2007 版本. 1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 3.POI读取Excel有两种格式一个是HSSF,另一个是XSSF. HSSF和XSSF的区别如下: HSSF

C#实现对EXCEL指定单元格进行操作

using System; using System.Collections.Generic; using System.Text; //先添加引用 using Microsoft.Office.Interop.Excel; using System.IO; using System.Reflection;   namespace SighExcel {     public class Sign     {         /// <summary>         /// 对Excel指定

Java实现对Excel文件的读取、操作

1.项目所需jar包,poi-3.9-20121203.jar,poi-ooxml-3.9.jar,poi-ooxml-schemas-3.9.jar 2.案例参考 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.te