C#调用操作Excel的一个类

原创 2003年10月08日 00:08:00

在这儿本来想写长一点的文章,但因为时间的关系,没有写成。现把自己做的一个小东西,C#调用Excel作报表的源代码放在这儿给大家看看。关于代码的构成,在源代码中已经有完整的代码注释了,这儿就不说什么了。

下面的这个类中,主要完成的功能是从数据库中逐字段读出数据,设置格式后,在Excel中显示出来。这是它运行后的效果图:

在这个类中,有两个参数传进来,一个是它的数据源,另一个是整个报表的标题字符串,具体看代码就应该知道了。

using System;
using System.Data;
using Excel;

namespace LogicLayer
{
?///
?/// OutputExcel 的摘要说明
?///
?public class OutputExcel
?{
??public OutputExcel(DataView dv,string str)
??{
???//
???// TODO: 在此处添加构造函数逻辑
???//
???Excel.Application excel;
???int rowIndex=4;
???int colIndex=1;

???Excel._Workbook xBk;
???Excel._Worksheet xSt;

???excel= new Excel.ApplicationClass();;
???xBk = excel.Workbooks.Add(true);
???xSt = (Excel._Worksheet)xBk.ActiveSheet;

???//
???//取得标题
???//
???foreach(DataColumn col in dv.Table.Columns)
???{
????colIndex++;
????excel.Cells[4,colIndex] = col.ColumnName;
????xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[4,colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;//设置标题格式为居中对齐
???}

???//
???//取得表格中的数据
???//
???foreach(DataRowView row in dv)
???{
????rowIndex ++;
????colIndex = 1;
????foreach(DataColumn col in dv.Table.Columns)
????{
?????colIndex ++;
?????if(col.DataType == System.Type.GetType("System.DateTime"))
?????{
??????excel.Cells[rowIndex,colIndex] = (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd");
??????xSt.get_Range(excel.Cells[rowIndex,colIndex],excel.Cells[rowIndex,colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;//设置日期型的字段格式为居中对齐
?????}
?????else
?????if(col.DataType == System.Type.GetType("System.String"))
?????{
??????excel.Cells[rowIndex,colIndex] = "'"+row[col.ColumnName].ToString();
??????xSt.get_Range(excel.Cells[rowIndex,colIndex],excel.Cells[rowIndex,colIndex]).HorizontalAlignment = Excel.XlVAlign.xlVAlignCenter;//设置字符型的字段格式为居中对齐
?????}
?????else
?????{
??????excel.Cells[rowIndex,colIndex] = row[col.ColumnName].ToString();
?????}
????}
???}
???//
???//加载一个合计行
???//
???int rowSum = rowIndex + 1;
???int colSum = 2;
???excel.Cells[rowSum,2] = "合计";
???xSt.get_Range(excel.Cells[rowSum,2],excel.Cells[rowSum,2]).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
???//
???//设置选中的部分的颜色
???//
???xSt.get_Range(excel.Cells[rowSum,colSum],excel.Cells[rowSum,colIndex]).Select();
???xSt.get_Range(excel.Cells[rowSum,colSum],excel.Cells[rowSum,colIndex]).Interior.ColorIndex = 19;//设置为浅黄色,共计有56种
???//
???//取得整个报表的标题
???//
???excel.Cells[2,2] = str;
???//
???//设置整个报表的标题格式
???//
???xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Bold = true;
???xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Size = 22;
???//
???//设置报表表格为最适应宽度
???//
???xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Select();
???xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Columns.AutoFit();
???//
???//设置整个报表的标题为跨列居中
???//
???xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).Select();
???xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenterAcrossSelection;
???//
???//绘制边框
???//
???xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Borders.LineStyle = 1;
???xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,2]).Borders[Excel.XlBordersIndex.xlEdgeLeft].Weight = Excel.XlBorderWeight.xlThick;//设置左边线加粗
???xSt.get_Range(excel.Cells[4,2],excel.Cells[4,colIndex]).Borders[Excel.XlBordersIndex.xlEdgeTop].Weight = Excel.XlBorderWeight.xlThick;//设置上边线加粗
???xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[rowSum,colIndex]).Borders[Excel.XlBordersIndex.xlEdgeRight].Weight = Excel.XlBorderWeight.xlThick;//设置右边线加粗
???xSt.get_Range(excel.Cells[rowSum,2],excel.Cells[rowSum,colIndex]).Borders[Excel.XlBordersIndex.xlEdgeBottom].Weight = Excel.XlBorderWeight.xlThick;//设置下边线加粗
???//
???//显示效果
???//
???excel.Visible=true;
??}
?}
}
有人在问,如何结束Excel进程?
可以强制结束进程:)
一般采用垃圾自动回收的技术,但为了更彻底地结束Excel进程。我们可以再加上一个事件:判断Excel是否还在进程集里面。如果有的话,返回true;当然,如果没有的话,返回false。
当事件为真的时候,采用强制进程杀死技术就行了。
如果要判断Excel是否在进程集里面,可以参考下面的代码:
??????????? int ProceedingCount = 0;
??????????? Process[] ProceddingCon = Process.GetProcesses();
??????????? foreach(Process IsProcedding in ProceddingCon)
??????????? {
??????????????? if(IsProcedding.ProcessName == "Excel")
??????????????? {
??????????????????? ProceedingCount += 1;
??????????????? }
??????????? }
??????????? if(ProceedingCount > 0)
??????????? {
??????????????? MessageBox.Show("该系统中已经在运行Excel了。","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
return true;
??????????? }
else
{
return false;
}
??}
==================
要杀死进程的话,用一个叫什么Kill()的事件吧。好象是这样的。:)

C#常用工具类——Excel操作类

// 常用工具类——Excel操作类 ///  ------------------------------------------------ ///  CreateConnecti...
  • wuyuander
  • wuyuander
  • 2017年06月06日 11:09
  • 641

WinForm读取Excel(一个C#操作Excel类,功能比较全)

  • 2017年06月01日 22:28
  • 12KB
  • 下载

C#操作Excel类,功能比较全

原文出处: http://www.cnblogs.com/wangchuang/p/5546345.html /// 常用工具类——Excel操作类 ///  --------...
  • wuyuander
  • wuyuander
  • 2017年06月06日 11:13
  • 515

自己用的c#操作excel类。

下面的程序,是自己经常用到的excel操作类,本程序与别的对excel操作唯一改进的地方是对excel数据的填充方式上。网上经常看到的填充方式有:1:按单元格2:按区域(range)本程序,也还是按区...
  • yangang0201
  • yangang0201
  • 2007年07月13日 09:56
  • 4123

C#操作excel

最近需要操作EXCEL,要实现的是用户将Winform界面中的内容导出到特定EXECL模板中。从书中与网上看到主要方法如下: 一、OleDB  与操作ACCESS数据表类似,将Execl作为数据源,通...
  • wzy0754
  • wzy0754
  • 2016年08月19日 14:39
  • 565

C#操作EXCEL类

  • 2012年12月19日 21:26
  • 41KB
  • 下载

C#操作Excel类示例

  • 2017年09月23日 14:07
  • 29KB
  • 下载

C#中创建、打开、读取、写入、保存Excel的一般性代码

C#中创建、打开、读取、写入、保存Excel的一般性代码 1 Excel对象 微软的Excel对象模型包括了128个不同的对象,从矩形,文本框等简单的对象到透视表,图表等复杂的对象.下面我...
  • jyz123456
  • jyz123456
  • 2012年09月11日 13:32
  • 5375

用C++操作Excel

大一的程序设计老师,也是我们的班主任,一直想让我们知道C/C++究竟能做些什么,曾经花整整1节课的时间教我们如何找一个问题的解决方案。他告诉我们,要懂得google。不过,对于习惯了baidu的我,一...
  • android_lover2014
  • android_lover2014
  • 2016年10月08日 13:45
  • 1599

c++ 对 EXCEL 读写的封装

ExcelOp.h #pragma once //http://www.blogjava.net/jinheking/archive/2005/07/19/5150.html 合并单元格 //htt...
  • yaolixing01
  • yaolixing01
  • 2014年01月23日 22:53
  • 3377
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#调用操作Excel的一个类
举报原因:
原因补充:

(最多只允许输入30个字)