C#利用EXCEL做報表

本文介绍了如何利用C#操作Excel进行报表制作。首先,通过创建Excel实例并添加数据展示了简单的报表生成,然后重点讲解了通过预先设计Excel模板,结合宏自动排版,实现复杂报表的生成。这种方法允许在不修改程序的情况下调整模板,以适应不同的报表样式需求,简化了C#在Excel排版上的工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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危险品货车铁风SZG9220YY1110708900022836
浙KA4109危险品货车解放CA4110P1K2223132010898
浙KA0001A危险品货车南明LSY9190WS11102054580474636
浙KA0493上普货货车解放LSY9190WS11102559710094327
浙KA1045普货货车解放LSY9171WCD11103912260516003
浙KA1313普货货车解放9190WCD11103150270538701
浙KA1322普货货车解放LSY9190WS243233320538716
浙KA1575普货货车解放LSY9181WCD11103141490113018
浙KA1925普货货车解放LSY9220WCD111039062600268729
浙KA2258普货货车解放LSY9220WSP111048154200320

为了在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分别为“普通报表”和“高级报表”。

打开Visual Studio.Net,新建一个C#的windows应用程序,取名为MyExcel。根据个人爱好,对窗口做一些美化工作,然后放两个按钮:btnNormal和btnAdvance,Caption分别为“普通报表”和“高级报表”。

点“打开”按钮,再点“确定”按钮。

切换到代码窗口中,在文件头添加下面两个引用:

  • 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.Cells[1,4]="普通报表";

    //逐行写入数据,

    for(int i=0;i<11;i++)
    {
    for(int j=0;j<7;j++)
    {
    //以单引号开头,表示该单元格为纯文本
    myExcel.Cells[2+i,1+j]="'"+myData[i,j];
    }
    }
    }

    说明一下,Cells[2,1]指第2行第1个单元格,是以1为基准的,而在C#中的数组是以0为基准的,另外,我们还发现,对于编号之类的数据, 实际是文本,而Excel将它认成了数字,由于太长,自动换成了科学计数,这不是我们要求的,在Excel中,如果某单元格以单引号“’”开头,表示该单 元格为纯文本,因此,我们在每个单元格前面加单引号。

    运行结果如下:

    可以看出,该报表非常简陋,标题行没有合并局,字体大小也不合适,连表格线都没有。当然,我们可以写代码来设置单元格字体、大小等等工作,这类技巧 网上很多,但如果真要用C#来完成,是一件非常难的事情,还有个办法就是将想要的操作录制成宏,研究一下宏代码,但宏是用VBA写的,要转换成果C#可不 是件容易的事情。

    第一种办法不是本文的重点,就到此为止

    下面进行高级报表设计,该方法的原理为:首先打开Excel,按照要求排好版,保存为一个文件做为模板,然后在C#中将该文件复制为一个新文件,在指定位置填入数据就可以了,为了添加表格线,我们录制了一个宏,在C#中执行该宏即可。

    参考模板如下:

    当然,你还可以排得更漂亮,因为是单纯的Excel操作,不需要特殊说明。如果记录很多,往往一页无法打印完成,我们要求在每一页都显示报表标题和 小标题,也就是上图中的第1、2行,这里有一个技巧:选择Excel的菜单“文件”→“页面设置”,选择“工作表”,在“顶端标题行”后的框中输入 “$1:$2”,也就是1~2行,当然,你也点右边的红箭头,然后用鼠标选择。当你的记录超过一页时,会自动在下一页加入标题,非常方便。

    表格中目前还没有表格线,因为我们不知道到底有多少数据,因此,也无法知道为多少单元格设置边框,我们借助宏来完成。

    按下面步骤录制一个宏:

    1、随便选择几个单元格;
    2、选择菜单“工具”→“宏”→“录制新宏”,输入宏的名称,就用默认的“宏1”吧,点确定;
    3、选择菜单“格式”→“单元格”,在对话框中选择“边框”,将内边框和外边框均选中,按确定;
    4、此时,刚才选择的单元格就有了边框,再点工具栏中的“停止录制宏”按钮 来结束宏录制。

    刚才的操作目的是录制宏而不是加边框,因此,我们按“Ctrl+Z”来撤消刚才的操作,通过按Alt+F8来调出宏,选择“宏1”,选择编辑,看到的代码应该如下:

    Sub
    宏1()
    ' 宏1 Macro
    ' xx 记录的宏 2003-5-1 Selection.Borders(xlDiagonalDown).LineS
    <!--endprint--> </li> <li style="font-weight: bold;
    font-size: 14px; color: #993366; text-align: right; height: 24px;">
    <a href="javascript:;" onclick="doPrint()" style="color:
    #808000">打印这篇文章</a> </li> <li style="color: #ffffff;
    background-color: #c8bda9; width: 800px; height: 24px; border-bottom:
    #999966 1px solid; font-size: 14px; font-weight: bold; line-height:
    24px;"> 与本文主题相关的文章 </li> <li> <div style="width:
    800px;"> <ul style='width: 808px;'><li style='width:
    402px;'><a class='onetilte' title='十二则技巧 Excel操作效率大大提高'
    href='/newOperate/html/7/71/711/18786.html'>十二则技巧
    Excel操作效率大大提高</li><li style='width: 402px;'><a
    class='onetilte' title='Asp.NET导出Excel文件乱码解决若干方法'
    href='/newOperate/html/1/11/112/18716.html'>Asp.NET导出Excel文件乱码解决若干方法&
    lt;/li></ul><ul style='width: 808px;'><li
    style='width: 402px;'><a class='onetilte'
    title='关于C#调用Excel的资源占用问题'
    href='/newOperate/html/1/12/121/18700.html'>关于C#调用Excel的资源占用问题<
    /li><li style='width: 402px;'><a class='onetilte'
    title='网页上显示word和Excel'
    href='/newOperate/html/1/11/112/17227.html'>网页上显示word和Excel</li&
    gt;</ul><ul style='width: 808px;'><li style='width:
    402px;'><a class='onetilte' title='在vs2008环境C#对Excel基本操作'
    href='/newOperate/html/1/11/112/17113.html'>在vs2008环境C#对Excel基本操作<
    /li><li style='width: 402px;'><a class='onetilte'
    title='SQL Server BI Step by Step SSIS 3—批量导入Excel表'
    href='/newOperate/html/3/31/311/17089.html'>SQL Server BI Step by
    Step SSIS 3—批量导</li></ul><ul style='width:
    808px;'><li style='width: 402px;'><a class='onetilte'
    title='从Excel中指定的sheet名称或索引读取数据到DataTable,以便用户更'
    href='/newOperate/html/1/12/121/16094.html'>从Excel中指定的sheet名称或索引读取数据
    到</li><li style='width: 402px;'><a class='onetilte'
    title='将DataGrid中的数据导出为Excel的方法'
    href='/newOperate/html/1/12/121/15882.html'>将DataGrid中的数据导出为Excel的方法&
    lt;/li></ul><ul style='width: 808px;'><li
    style='width: 402px;'><a class='onetilte' title='ADO.NET 如何读取
    Excel (下)' href='/newOperate/html/1/11/116/15396.html'>ADO.NET 如何读取
    Excel (下)</li><li style='width: 402px;'><a
    class='onetilte' title='ADO.NET 如何读取 Excel (上)'
    href='/newOperate/html/1/11/116/15395.html'>ADO.NET 如何读取 Excel
    (上)</li></ul><ul style='width: 808px;'><li
    style='width: 402px;'><a class='onetilte'
    title='.net解决数据导出excel时的格式问题'
    href='/newOperate/html/1/11/112/15394.html'>.net解决数据导出excel时的格式问题<
    /li><li style='width: 402px;'><a class='onetilte' title='扩展
    GridView 控制项:支援 Excel 及 Word 匯出'
    href='/newOperate/html/1/11/111/15126.html'>扩展 GridView 控制项:支援 Excel
    及 Word</li></ul><ul style='width: 808px;'><li
    style='width: 402px;'><a class='onetilte'
    title='asp.net里导出excel表方法汇总'
    href='/newOperate/html/1/12/121/15120.html'>asp.net里导出excel表方法汇总<
    /li><li style='width: 402px;'><a class='onetilte'
    title='C#将DateTable表数据导出到Excel中'
    href='/newOperate/html/1/12/121/15119.html'>C#将DateTable表数据导出到Excel中&
    lt;/li></ul><ul style='width: 808px;'><li
    style='width: 402px;'><a class='onetilte'
    title='JavaScript利用ActiveX导出Excel,Word'
    href='/newOperate/html/2/22/222/14907.html'>JavaScript利用ActiveX导出
    Excel,Word</li><li style='width: 402px;'><a
    class='onetilte' title='ASP.NET将Excel转换为SQL Server数据库'
    href='/newOperate/html/1/11/116/14742.html'>ASP.NET将Excel转换为SQL
    Server数据库</li></ul><ul style='width: 808px;'><li
    style='width: 402px;'><a class='onetilte'
    title='GridView数据导入Excel/Excel数据读入GridView'
    href='/newOperate/html/1/11/116/14739.html'>GridView数据导入Excel/Excel数据
    读入GridV</li><li style='width: 402px;'><a
    class='onetilte' title='读取Excel文件时出现null的解决方法'
    href='/newOperate/html/1/11/112/14554.html'>读取Excel文件时出现null的解决方法<
    /li></ul><ul style='width: 808px;'><li style='width:
    402px;'><a class='onetilte' title='C#合并多个结构一样的Excel'
    href='/newOperate/html/1/12/121/14222.html'>C#合并多个结构一样的Excel</li&
    gt;<li style='width: 402px;'><a class='onetilte'
    title='找回断电、死机前未储存的Word,Excel文件' href='/newOperate
    /html/7/71/711/14128.html'>找回断电、死机前未储存的Word,Excel文件</li><
    /ul><ul style='width: 808px;'><li style='width:
    402px;'><a class='onetilte' title='Asp.net 保存并导入Excel数据'
    href='/newOperate/html/1/11/112/14102.html'>Asp.net
    保存并导入Excel数据</li><li style='width: 402px;'><a
    class='onetilte' title='c#中高效的excel导入oracle的方法'
    href='/newOperate/html/1/12/121/14019.html'>c#中高效的excel导入oracle的方法&
    lt;/li></ul><ul style='width: 808px;'><li
    style='width: 402px;'><a class='onetilte' title='ASP.NET MVC Tip
    #2 - 创建可以返回Excel文档的自定义ActionResu'
    href='/newOperate/html/1/11/112/13734.html'>ASP.NET MVC Tip #2 -
    创建可以返回Excel文</li><li style='width: 402px;'><a
    class='onetilte' title='扩展GridView 控件—支持 Excel 及 Word 汇出'
    href='/newOperate/html/1/11/111/13061.html'>扩展GridView 控件—支持 Excel 及
    Word 汇</li></ul><ul style='width: 808px;'><li
    style='width: 402px;'><a class='onetilte'
    title='JSP中将部分数据生成Excel格式'
    href='/newOperate/html/2/22/222/12490.html'>JSP中将部分数据生成Excel格式<
    /li><li style='width: 402px;'><a class='onetilte'
    title='告别ASP.NET操作EXCEL的烦恼(总结篇)——放到首页奢侈下'
    href='/newOperate/html/1/11/112/12383.html'>告别ASP.NET操作EXCEL的烦恼(总结篇)
    ——放</li></ul><ul style='width: 808px;'><li
    style='width: 402px;'><a class='onetilte'
    title='Asp.net程序中生成Excel报表'
    href='/newOperate/html/1/11/112/12379.html'>Asp.net程序中生成Excel报表<
    /li><li style='width: 402px;'><a class='onetilte'
    title='C#WIN窗体读取EXCEL存入SQL数据库'
    href='/newOperate/html/1/12/121/12307.html'>C#WIN窗体读取EXCEL存入SQL数据库&
    lt;/li></ul><ul style='width: 808px;'><li
    style='width: 402px;'><a class='onetilte' title='DreamWeaver
    视频教程:导入Excel文件与导出表格'
    href='/newOperate/html/9/92/922/10050.html'>DreamWeaver
    视频教程:导入Excel文件与导出</li><li style='width: 402px;'><a
    class='onetilte' title='C#与EXCEL的数据交互(二)'
    href='/newOperate/html/1/12/122/8663.html'>C#与EXCEL的数据交互(二)</li&
    gt;</ul><ul style='width: 808px;'><li style='width:
    402px;'><a class='onetilte' title='C#与EXCEL的数据交互(一)'
    href='/newOperate/html/1/12/122/8662.html'>C#与EXCEL的数据交互(一)</li&
    gt;<li style='width: 402px;'><a class='onetilte'
    title='大量数据导出为Excel文件的问题解决(C#,ASP.NET)'
    href='/newOperate/html/1/11/112/8406.html'>大量数据导出为Excel文件的问题解决
    (C#,ASP</li></ul><ul style='width: 808px;'><li
    style='width: 402px;'><a class='onetilte'
    title='.net中清除EXCEL进程最有效的方法'
    href='/newOperate/html/1/12/121/7600.html'>.net中清除EXCEL进程最有效的方法<
    /li><li style='width: 402px;'><a class='onetilte'
    title='用Visual C#向Excel2002传输XML数据'
    href='/newOperate/html/1/12/122/7068.html'>用Visual
    C#向Excel2002传输XML数据</li></ul><ul style='width:
    808px;'><li style='width: 402px;'><a class='onetilte'
    title='.NET处理Excel表格'
    href='/newOperate/html/1/11/112/6291.html'>.NET处理Excel表格</li>&
    lt;li style='width: 402px;'><a class='onetilte'
    title='将Oracle的数据倒入EXCEL中的方法'
    href='/newOperate/html/3/32/322/5567.html'>将Oracle的数据倒入EXCEL中的方法<
    /li></ul><ul style='width: 808px;'><li style='width:
    402px;'><a class='onetilte' title='浅谈Java中利用JCOM实现仿Excel编程'
    href='/newOperate/html/2/22/222/5262.html'>浅谈Java中利用JCOM实现仿Excel编程&
    lt;/li><li style='width: 402px;'><a class='onetilte'
    title='在Java中利用JCOM实现仿Excel编程详解'
    href='/newOperate/html/2/22/221/5089.html'>在Java中利用JCOM实现仿Excel编程详解&
    lt;/li></ul><ul style='width: 808px;'><li
    style='width: 402px;'><a class='onetilte'
    title='从DataGrid导出Excel产生乱码的一个很好的解决方案'
    href='/newOperate/html/1/11/111/3933.html'>从DataGrid导出Excel产生乱码的一个很好的
    解</li><li style='width: 402px;'><a class='onetilte'
    title='在ASP.NET中将数据直接输出成Excel内容'
    href='/newOperate/html/1/11/112/3573.html'>在ASP.NET中将数据直接输出成Excel内容&
    lt;/li></ul> </div> </li> <li style="width:
    800px; height: 24px; background-color: #c8bda9"><a
    href='http://www.tzwhx.com/' dir="ltr" shape="rect" target="_blank"
    style="color: #663300;"><span style="color: #ff0066; font-size:
    10pt;"><strong>返回首页</strong></span> </a>
    </li> <li style="width: 800px;">
    <iframe id="baiduSpFrame" border="0" vspace="0" hspace="0"
    marginwidth="0" marginheight="0" framespacing="0" frameborder="0"
    scrolling="no" width="800" height="60"
    src="http://spcode.baidu.com/spcode/spstyle/style2829.jsp?tn=bdwhx_sp&ctn=0&styleid=2829"></iframe>

    </li> </ul> </div> </div> <div
    style="font-size: 16px; background-color: #9d8d7d; color: #FFFFFF;
    line-height: 32px; width: 1008px;"> <ul> <li
    style="font-weight: bold">友情链接</li> </ul> </div>
    <div class="banner"> </div> <!--<div
    style="font-size: 16px; background-color: #9d8d7d; color: #FFFFFF;
    line-height: 24px; width: 1008px;"> <ul class="ul_B"
    style="margin-left: 350px; line-height: 24px;"> <li> <a
    href="http://www.hao3gp.com/" target="_blank" style="color:
    #ffffff;">3GP手机电影</a> </li> <li
    class="menuDiv_B"></li> <li><a
    href="http://vane.name/" target="_blank" style="color: #ffffff;">风向标
    </a> </li> <li class="menuDiv_B"></li>
    <li><a href="http://www.mlr.gov.cn/" target="_blank"
    style="color: #ffffff;">国土资源部 </a> </li> <li
    class="menuDiv_A"></li> <li><a
    href="http://www.sbsm.gov.cn/" target="_blank" style="color:
    #ffffff;">国家测绘局 </a></li> </ul> </div>-->
    <div> <ul> <li style="width: 1008px; text-align:
    center;"><span style="color: #003366">泰州市国土资源局</span>
    <span style="color: #ff0066">王宏喜</span><br />
    <span style="color: #660033">地址</span>:<span
    style="color: #000066">泰州市凤凰东路81号</span> <span
    style="color: #990066">邮编</span>:225300<br /> <span
    style="color: #990066; border-top: #999966 1px
    solid;">电话</span>:<span style="color:
    #000066">0523-86883298 电子邮件</span>: <span style="color:
    #0000ff">Tzgtwhx@163.com  <span style="color:
    #ff0066"> QQ:70712371</span></span><br /> <a
    href="http://www.miibeian.gov.cn/" style="color: #003366; font-weight:
    normal; font-size: 12px;" target="_blank"><span style="color:
    #333333; font-weight: bold;">苏ICP备07039034号</span>
    </a></li> </ul> </div> </div>
    </body>
    </html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值