文章的使用范围
运行环境
.net Framework 1.1 ,Excel 2003
开发语言:
C#
目录
1.0
简要说明
2.0 Excel
编程模型的说明。
3.0 Excel
进程在程序中处理。
4.0 Excel
编程中常用一些功能。
4.1
给单元格赋值
4.2
给
Excel
报表添加图片
4.3
报表的打印
4.4
通过服务在系统间传输报表
5.0
总结。
简要说明
报表对于好多程序员来讲是个头疼的事情。在开始使用了
Report Server
生成报表的服务,但在导出成
Excel
文件的时候,样式总是
the See is Not the get
。后来慢慢的接触到用
Excel dll
直接生成报表。就做了一个
Web
服务专门生成
Office
报表。从实际的运行情况下,总体来讲还是可以的。但是还是有一些问题
1
.在编辑和部署的环境中必须安装
office
这样给系统增加了成本
。(还好政府采购中有
Office
,无锡的永中
Office
不知道能不能提供类似的功能)
2
。
报表中显示内容的单元格
只能通过已经处在的单元格拆分和合并得到的,这样在
报表的形式上有变化的话,
整个报表的显示内容的单元格的位置也需要同时发生改变。这样给编程带来不小的挑战。
3
.在
Web
系统和
Web
服务中
Excel
进程杀不掉的问题。
但是在固定格式的报表方面还是很方便的,可以将报表的放置数据的位置和取数据的原则保存起来就可以自动的生成报表,在添加新的报表的时候也不要重新的修改的程序,只要提供上述的信息就可以拉。下面是我对于
Excel
编程方面的一些经验的总结。
Excel
编程模型的说明
在这里
,就大概描述了在
Excel
编程中常用的对象的层次关系。
Excel Application
代表整个
Microsoft Excel
应用程序,
WorkBook
代表
Microsoft Excel
工作簿
Range
代表某一单元格、某一行、某一列、某一选定区域(该区域可包含一个或若干连续单元格区域),或者某一三维区域。
Areas
选定区域内的子区域或连续单元格块的集合。
Borders
代表对象的边框。
Characters
代表包含文本的对象中的字符。可用
Characters
对象修改包含在完整文本字符串中的任意字符序列。
Font
包含对象的字体属性(字体名称、字体大小、字体颜色等)。
ListRow
代表列表对象中的一行。
Errors
表示区域的电子表格错误。
Excel
进程在程序中处理
在
Excel
编程中,一开始的时候需要生成一个
Excel
进程。我们往往在生成报表后将其删除掉
,在
Web
程序中
往往
dot net
的垃圾回收器不能够将
Excel
进程回收。下面是我写的一段代码
//create the Application of Excel Note : record the Process's Create Period
Process_BeforeTime= DateTime.Now ;
Excel.Application oXL=new Excel.ApplicationClass();
Process_AfterTime =DateTime.Now ;
。。。。。。。。
the report Created
// call the way to kill the Process ,next is the Way to Kill Excel Process
/// <summary>
/// the ways to Kill the Excel Process which In the period Between Process_BeforeTime and Process_AfterTime
/// </summary>
/// <param name="Process_BeforeTime">the time before The Excel Process Created</param>
/// <param name="Process_AfterTime">the time after the Excel Process Created </param>
public static void KillExcelProcess(DateTime Process_BeforeTime,DateTime Process_AfterTime)
{
foreach(Process pro in System.Diagnostics.Process.GetProcessesByName("EXCEL"))
{
DateTime ProcessBeginTime =pro.StartTime ;
if ((ProcessBeginTime>=Process_BeforeTime)&&(ProcessBeginTime<=Process_AfterTime))
{
pro.Kill();
}
}
}
上面的一段代码在一般的情况下是没有问题
,在系统运行时是可以有效地删除
Excel
进程。
但在同一时刻用户过多的情况下,可能出现误删的情况。也有其他的一种方法来解决
Excel
进程的问题,在系统初始化时,先
New
数个
Excel
对象,建立一个池,供用户循环使用。
(现在还没有实践过)
在
Window
程序里面可以不考虑
Excel
进程的问题
,在零引用的情况下
,垃圾回收器能回收
Excel
进程。
Excel
编程中常用一些功能
4.1
给单元格赋值
Excel._Worksheet oSheet;
oSheet =(Excel._Worksheet)oWB.Sheets.get_Item(1);
Excel.Range oRg=null ;
oRg=oSheet.get_Range("C2",Type.Missing);
oRg.Value2 =UserName;
oRg.Borders[Excel.XlBordersIndex.xlEdgeTop].LineStyle=Excel.XlLineStyle.xlContinuous;
oRg.Borders[Excel.XlBordersIndex.xlEdgeTop].Weight =Excel.XlBorderWeight.xlThin;
oRg.Borders[Excel.XlBordersIndex.xlEdgeTop].ColorIndex=Excel.XlColorIndex.xlColorIndexAutomatic;
本代码的含义是选择单元格
C2 ,并给单元格中赋值 UserName ,并控制单元格的上边框的样式
4.2
给
Excel
报表添加图片
从原有文件中创建图片。返回一个
Shape
对象,该对象代表新图片。
方法的语法
expression.AddPicture(FileName, LinkToFile, SaveWithDocument, Left, Top, Width, Height)
expression
必需。该表达式返回“应用于”列表中的对象之一。
FileName String
类型,必需。要创建的
OLE
对象的源文件。
LinkToFile MsoTriState
类型,必需。要链接至的文件。
SaveWithDocument MsoTriState
类型,必需。将图片与文档一起保存。
Left Single
类型,必需。相对于文档的左上角,以磅为单位给出图片左上角的位置。
Top Single
类型,必需。相对于文档的顶部,以磅为单位给出图片左上角的位置。
Width Single
类型,必需。以磅为单位给出图片的宽度。
Height Single
类型,必需。以磅为单位给出图片的高度。
举例
oSheet.Shapes.AddPicture(filename,Microsoft.Office.Core.MsoTriState.msoCTrue ,Microsoft.Office.Core.MsoTriState.msoCTrue,photoLeft,photoTop,photowidth,photoheight);
4.3
报表的打印
打印指定对象。
方法的语法
expression.PrintOut(From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName)
expression
必需。该表达式返回“应用于”列表中的一个对象。
From Variant
类型,可选。打印的开始页号。如果省略该参数,将从起始位置开始打印。
To Variant
类型,可选。打印的终止页号。如果省略该参数,将打印至最后一页。
Copies Variant
类型,可选。要打印的份数。如果省略该参数,将只打印一份。
Preview Variant
类型,可选。如果该值为
True
,则
Microsoft Excel
打印指定对象之前进行打印预览。如果该值为
False
(或者省略此参数),则立即打印该对象。
ActivePrinter Variant
类型,可选。设置活动打印机的名称。
PrintToFile Variant
类型,可选。如果该值为
True
,则打印输出到文件。如果没有指定
PrToFileName
,则
Microsoft Excel
将提示用户输入要输出文件的文件名。
Collate Variant
类型,可选。如果该值为
True
,则逐份打印每份副本。
PrToFileName
可选,
Variant
类型。如果
PrintToFile
为
True
,则本参数指定要打印到的文件名。
举例:
oSheet.PrintOut(1,10,"1","False","HPLaserJ","False","True","");
4.4
通过服务在系统间传输报表
生成用户报表的数据流程图
Web
服务程序
[WebMethod]
public
byte[] GetFamilyMember(string PersonIdentifier)
{
return FamilyMember.GetReport(PersonIdentifier); //The Bussiness of Create the
//report File and Return as The type
//of byte[]
}
在
Web
服务器段的主要的功能就是
提供一个接口供其他系统引用来获取他需要的数据。
Web
程序
将取得的报表二进制流发送给请求的客户
string ReportName ; //the created Report Name
byte[] result ; //the date which Tanslate from Web Server
HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
HttpContext.Current.Response.AppendHeader("Content-disposition","inline;filename="+Server.UrlEncode(ReportName+".xls"));
//define the header of Web pages
result= Server.
GetFamilyMember (TemplateName,PersonID); //get the date //from Web server
HttpContext.Current.Response.BinaryWrite(result);
HttpContext.Current.Response.End();
总结
我们可以通过录制宏
来了解
Excel
的操作的实现,并将代码转化成
C#
代码,对于大多数的
Excel
功能都可以实现。
------
徐文兵
2006-11-19
晚