




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在C#中利用Excel做高级报表浙江省丽水市汽车运输集团有限公司信息中心 苟安廷 Visual Studio.Net 自2001年2月问世以来,受到越来越多人的喜爱,C#做为主力军,集VB、Delphi的简单和VC的简炼与强大于一体,更是让许多人爱不释手,纷纷倒向它的怀抱。通常的软件都要用到数据库,数据库中必然要用到报表,在Visual Studio.Net中自带了一个水晶报表,虽然功能十分强大,但市面上相关资料非常缺乏,网上全面介绍其使用的文章也屈指可数。Excel是微软公司办公自动化套件中的一个软件,主要是用来处理电子表格。Excel以其功能强大,界面友好等受到了许多用户的欢迎,几乎每一台机器都安装了它,因此,我们可以将数据导入Excel进行排版。由于Excel的格式是封闭的,无法直接创建一个Excel文件然后来排版,只有借助Com组件来完成,同样,介绍用C#操作Excel的文章也就那么几篇,基本上都是告诉你如何新建一个Excel文件,然后,将数据写入某单元格,最多再零星告诉你如何合并单元格,真正使用起来根本无法用C#做出漂亮报表。本文巧妙利用Excel的宏来自动排版,大大减少了工作量,而且可以随时修改模板而无须修改程序,非常实用。本人使用的是Office 2000,操作系统为windows 2000 professinal,为使问题简单化,这里不介绍数据库的知识,我一个二维数组来代表一个数据库中的表,我们的目的是将该数组放到Excel中,并排版成需要的格式,数组如下:车牌号类 型品 牌型 号颜 色附加费证号车架号浙KA3676危险品货车铁风SZG9220YY白1110708900022836浙KA4109危险品货车解放CA4110P1K2白223132010898浙KA0001A危险品货车南明LSY9190WS白11102054580474636浙KA0493上普货货车解放LSY9190WS白11102559710094327浙KA1045普货货车解放LSY9171WCD蓝11103912260516003浙KA1313普货货车解放9190WCD蓝11103150270538701浙KA1322普货货车解放LSY9190WS蓝243233320538716浙KA1575普货货车解放LSY9181WCD蓝11103141490113018浙KA1925普货货车解放LSY9220WCD蓝111039062600268729浙KA2258普货货车解放LSY9220WSP蓝111048154200320为了在C#中使用Excel,我们要先做一点准备工作,通过查找(前提是你安装Visual Studio.Net和Excel 2000),在你的计算机中找到TlbImp和Excel9.olb,将他们复制到一个文件夹中,在DOS窗口中执行 TlbImp Excel9.olb,这时会产生以下三个文件:Excel.dll、Office.dll和VBIDE.dll。我们来完成两项任务,一是按网上文章介绍的方法,增加将数据写入一个Excel文件,也就是做一个简单报表,二是用Excel创建一个文件,然后以此文件为模板生成高级报表。打开Visual Studio.Net,新建一个C#的windows应用程序,取名为MyExcel。根据个人爱好,对窗口做一些美化工作,然后放两个按钮:btnNormal和btnAdvance,Caption分别为“普通报表”和“高级报表”。从菜单中选择“项目”“添加应用”,在弹出的对话框中选com页,再点浏览按钮,选择刚才生成的三个文件,如下:点“打开”按钮,再点“确定”按钮。切换到代码窗口中,在文件头添加下面两个引用:using System.IO;using System.Reflection;再添加一个二维数组来表示数据表:private string , myData= 车牌号,类 型,品 牌,型 号,颜 色,附加费证号,车架号,浙KA3676,危险品,货车,铁风SZG9220YY,白,1110708900,022836,浙KA4109,危险品,货车,解放CA4110P1K2,白,223132,010898,浙KA0001A,危险品,货车,南明LSY9190WS,白,1110205458,0474636,浙KA0493,上普货,货车,解放LSY9190WS,白,1110255971,0094327,浙KA1045,普货,货车,解放LSY9171WCD,蓝,1110391226,0516003,浙KA1313,普货,货车,解放9190WCD,蓝,1110315027,0538701,浙KA1322,普货,货车,解放LSY9190WS,蓝,24323332,0538716,浙KA1575,普货,货车,解放LSY9181WCD,蓝,1110314149,0113018,浙KA1925,普货,货车,解放LSY9220WCD,蓝,1110390626,00268729,浙KA2258,普货,货车,解放LSY9220WSP,蓝,111048152,00320;切换回设计窗口,双击“普通报表”按钮,设计普通报表,代码如下:private void btnNormal_Click(object sender, System.EventArgs e)/创建一个Excel文件Excel.Application myExcel = new Excel.Application ( ) ;myExcel.Application.Workbooks.Add ( true ) ;/让Excel文件可见myExcel.Visible=true;/第一行为报表名称myExcel.Cells1,4=普通报表;/逐行写入数据,for(int i=0;i11;i+)for(int j=0;j7;j+)/以单引号开头,表示该单元格为纯文本myExcel.Cells2+i,1+j=+myDatai,j;说明一下,Cells2,1指第2行第1个单元格,是以1为基准的,而在C#中的数组是以0为基准的,另外,我们还发现,对于编号之类的数据,实际是文本,而Excel将它认成了数字,由于太长,自动换成了科学计数,这不是我们要求的,在Excel中,如果某单元格以单引号“”开头,表示该单元格为纯文本,因此,我们在每个单元格前面加单引号。运行结果如下:可以看出,该报表非常简陋,标题行没有合并局,字体大小也不合适,连表格线都没有。当然,我们可以写代码来设置单元格字体、大小等等工作,这类技巧网上很多,但如果真要用C#来完成,是一件非常难的事情,还有个办法就是将想要的操作录制成宏,研究一下宏代码,但宏是用VBA写的,要转换成果C#可不是件容易的事情。第一种办法不是本文的重点,就到此为止。下面进行高级报表设计,该方法的原理为:首先打开Excel,按照要求排好版,保存为一个文件做为模板,然后在C中将该文件复制为一个新文件,在指定位置填入数据就可以了,为了添加表格线,我们录制了一个宏,在C#中执行该宏即可。参考模板如下:当然,你还可以排得更漂亮,因为是单纯的Excel操作,不需要特殊说明。如果记录很多,往往一页无法打印完成,我们要求在每一页都显示报表标题和小标题,也就是上图中的第1、2行,这里有一个技巧:选择Excel的菜单“文件”“页面设置”,选择“工作表”,在“顶端标题行”后的框中输入“$1:$2”,也就是12行,当然,你也点右边的红箭头,然后用鼠标选择。当你的记录超过一页时,会自动在下一页加入标题,非常方便。表格中目前还没有表格线,因为我们不知道到底有多少数据,因此,也无法知道为多少单元格设置边框,我们借助宏来完成。按下面步骤录制一个宏:1、 随便选择几个单元格;2、 选择菜单“工具”“宏”“录制新宏”,输入宏的名称,就用默认的“宏1”吧,点确定;3、 选择菜单“格式”“单元格”,在对话框中选择“边框”,将内边框和外边框均选中,按确定;4、 此时,刚才选择的单元格就有了边框,再点工具栏中的“停止录制宏”按钮来结束宏录制。刚才的操作目的是录制宏而不是加边框,因此,我们按“Ctrl+Z”来撤消刚才的操作,通过按Alt+F8来调出宏,选择“宏1”,选择编辑,看到的代码应该如下:Sub 宏1() 宏1 Macro 苟安廷 记录的宏 2003-5-7 Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End WithEnd Sub图中表的数据都是供排版参考用的,结束前将实际内容删除掉,即只留下排好版的格式,包括标题、列标题等,将实际内容去掉。将文件保存到一个地方,如D:Normal.xls,当然,实际开发时,可以放到执行文件所在目录下,为了防止用户随便修改,可以将文件名改为normal.rpt之类。有了上面的准备,我们就可以在C#中使用了,添加“高级报表”按钮的响应代码。下面是全部代码清单。using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using System.Data;using System.IO;using System.Reflection;namespace MyExcel/ / Form1 的摘要说明。/ public class Form1 : System.Windows.Forms.Formprivate System.Windows.Forms.Button btnNormal;private System.Windows.Forms.Button btnAdvace;/ / 必需的设计器变量。/ private System.ComponentModel.Container components = null;public Form1()/ Windows 窗体设计器支持所必需的/InitializeComponent();/ TODO: 在 InitializeComponent 调用后添加任何构造函数代码/ / 清理所有正在使用的资源。/ protected override void Dispose( bool disposing )if( disposing )if (components != null) components.Dispose();base.Dispose( disposing );#region Windows Form Designer generated code/ / 设计器支持所需的方法 - 不要使用代码编辑器修改/ 此方法的内容。/ private void InitializeComponent()this.btnNormal = new System.Windows.Forms.Button();this.btnAdvace = new System.Windows.Forms.Button();this.SuspendLayout();/ / btnNormal/ this.btnNormal.Location = new System.Drawing.Point(49, 55);this.btnNormal.Name = btnNormal;this.btnNormal.TabIndex = 0;this.btnNormal.Text = 普通报表;this.btnNormal.Click += new System.EventHandler(this.btnNormal_Click);/ / btnAdvace/ this.btnAdvace.Location = new System.Drawing.Point(169, 55);this.btnAdvace.Name = btnAdvace;this.btnAdvace.TabIndex = 1;this.btnAdvace.Text = 高级报表;this.btnAdvace.Click += new System.EventHandler(this.btnAdvace_Click);/ / Form1/ this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);this.ClientSize = new System.Drawing.Size(292, 133);this.Controls.AddRange(new System.Windows.Forms.Control this.btnAdvace, this.btnNormal);this.Name = Form1;this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;this.Text = Form1;this.ResumeLayout(false);#endregion/ / 应用程序的主入口点。/ STAThreadstatic void Main() Application.Run(new Form1();private string , myData= 车牌号,类 型,品 牌,型 号,颜 色,附加费证号,车架号,浙KA3676,危险品,货车,铁风SZG9220YY,白,1110708900,022836,浙KA4109,危险品,货车,解放CA4110P1K2,白,223132,010898,浙KA0001A,危险品,货车,南明LSY9190WS,白,1110205458,0474636,浙KA0493,上普货,货车,解放LSY9190WS,白,1110255971,0094327,浙KA1045,普货,货车,解放LSY9171WCD,蓝,1110391226,0516003,浙KA1313,普货,货车,解放9190WCD,蓝,1110315027,0538701,浙KA1322,普货,货车,解放LSY9190WS,蓝,24323332,0538716,浙KA1575,普货,货车,解放LSY9181WCD,蓝,1110314149,0113018,浙KA1925,普货,货车,解放LSY9220WCD,蓝,1110390626,00268729,浙KA2258,普货,货车,解放LSY9220WSP,蓝,111048152,00320;/普通报表,即单纯的文件导出功能private void btnNormal_Click(object sender, System.EventArgs e)/创建一个Excel文件Excel.Application myExcel = new Excel.Application ( ) ;myExcel.Application.Workbooks.Add ( true ) ;/让Excel文件可见myExcel.Visible=true;/第一行为报表名称myExcel.Cells1,4=普通报表;/逐行写入数据,for(int i=0;i11;i+)for(int j=0;j7;j+)/以单引号开头,表示该单元格为纯文本myExcel.Cells2+i,1+j=+myDatai,j;/高级报表,根据模板生成的报表private void btnAdvace_Click(object sender, System.EventArgs e)string filename=;/将模板文件复制到一个新文件中SaveFileDialog mySave=new SaveFileDialog();mySave.Filter=Excel文件(*.XLS)|*.xls|所有文件(*.*)|*.*;if(mySave.ShowDialog()!=DialogResult.OK)return;elsefilename=mySave.FileName;/将模板文件copy到新位置,建议实际开发时用相对路径,如Application.StartupPath.Trim()+reportnormal.xlsstring filenameold=mySave.FileName;FileInfo mode=new FileInfo(d:normal.xls);trymode.CopyTo(filename,true);catch(Exception ee)MessageBox.Show(ee.Message);return;/打开复制后的文件object missing=Missing.Value;Excel.Application myExcel=new Excel.Application ( );/打开新文件myExcel.Application.Workbooks.Open(filename,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing,missing); /将Excel显示出来myExcel.Visible=true;/逐行写入数据,数组中第一行我列标题,忽略for(int i=1;i11;i+)for(int j=0;j7;j+)/以单引号开头,表示该单元格为纯文本myExcel.Cells4+i,1+j=+myDatai,j;/将列标题和实际内容选中Excel.Workbook myBook=myExcel.Workbooks1;Excel.Worksheet mySheet=(Excel.Worksheet)myBook.Worksheets1;Excel.Range r=mySheet.get_Range(mySheet.Cells3,1,mySheet.Cells14,7);r.Select();/=通过执行宏来格表格加边框=/trymyExcel.Run(宏1,missing,missing
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度航空航天零部件供应与全面技术支持协议
- 2025年农产品加工企业有机肥料供应合同范本
- 2025年绿色建筑节能改造项目合作协议书模板
- 2025年度专业印刷厂定制高端产品说明书采购合同
- 2025年金融行业员工健康检查与劳动能力鉴定综合服务协议
- 2025年度有机茶叶批发代理服务合同
- 2025年森林生态系统重建工程苗木补植与补造施工合同
- 2025年度数字版权交易安全保证金合同
- 2025年度生物能源项目研发团队员工劳动合同规范
- 2025年现代化办公空间改造项目承包合同
- 2025海南省老干部服务管理中心招聘事业编制人员6人(第1号)考试备考题库及答案解析
- 2025年内江市总工会公开招聘工会社会工作者(14人)笔试模拟试题及答案解析
- 2025云南辅警笔试题目及答案
- 2025四川内江市总工会招聘工会社会工作者14人笔试备考试题及答案解析
- 2025-2026学年湘教版(2024)初中数学八年级上册教学计划及进度表
- 2025至2030中国公安行业发展趋势分析与未来投资战略咨询研究报告
- 2025年三支扶陕西试题及答案
- 新生儿持续性肺动脉高压个案护理
- bbc国际音标教学课件
- GB/T 45763-2025精细陶瓷陶瓷薄板室温弯曲强度试验方法三点弯曲或四点弯曲法
- 2025年新修订《治安管理处罚法》
评论
0/150
提交评论