在C#中利用Excel做高级报表.docx

上传人:b****3 文档编号:3900329 上传时间:2022-11-26 格式:DOCX 页数:16 大小:238.03KB
下载 相关 举报
在C#中利用Excel做高级报表.docx_第1页
第1页 / 共16页
在C#中利用Excel做高级报表.docx_第2页
第2页 / 共16页
在C#中利用Excel做高级报表.docx_第3页
第3页 / 共16页
在C#中利用Excel做高级报表.docx_第4页
第4页 / 共16页
在C#中利用Excel做高级报表.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

在C#中利用Excel做高级报表.docx

《在C#中利用Excel做高级报表.docx》由会员分享,可在线阅读,更多相关《在C#中利用Excel做高级报表.docx(16页珍藏版)》请在冰豆网上搜索。

在C#中利用Excel做高级报表.docx

在C#中利用Excel做高级报表

在C#中利用Excel做高级报表

VisualStudio.Net自2001年2月问世以来,受到越来越多人的喜爱,C#做为主力军,集VB、Delphi的简单和VC的简炼与强大于一体,更是让许多人爱不释手,纷纷倒向它的怀抱。

通常的软件都要用到数据库,数据库中必然要用到报表,在VisualStudio.Net中自带了一个水晶报表,虽然功能十分强大,但市面上相关资料非常缺乏,网上全面介绍其使用的文章也屈指可数。

Excel是微软公司办公自动化套件中的一个软件,主要是用来处理电子表格。

Excel以其功能强大,界面友好等受到了许多用户的欢迎,几乎每一台机器都安装了它,因此,我们可以将数据导入Excel进行排版。

由于Excel的格式是封闭的,无法直接创建一个Excel文件然后来排版,只有借助Com组件来完成,同样,介绍用C#操作Excel的文章也就那么几篇,基本上都是告诉你如何新建一个Excel文件,然后,将数据写入某单元格,最多再零星告诉你如何合并单元格,真正使用起来根本无法用C#做出漂亮报表。

本文巧妙利用Excel的宏来自动排版,大大减少了工作量,而且可以随时修改模板而无须修改程序,非常实用。

本人使用的是Office2000,操作系统为windows2000professinal,为使问题简单化,这里不介绍数据库的知识,我一个二维数组来代表一个数据库中的表,我们的目的是将该数组放到Excel中,并排版成需要的格式,数组如下:

车牌号

类型

品牌

型号

颜色

附加费证号

车架号

浙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

1110481542

00320

为了在C#中使用Excel,我们要先做一点准备工作,通过查找(前提是你安装VisualStudio.Net和Excel2000),在你的计算机中找到TlbImp和Excel9.olb,将他们复制到一个文件夹中,在DOS窗口中执行TlbImpExcel9.olb,这时会产生以下三个文件:

Excel.dll、Office.dll和VBIDE.dll。

我们来完成两项任务,一是按网上文章介绍的方法,增加将数据写入一个Excel文件,也就是做一个简单报表,二是用Excel创建一个文件,然后以此文件为模板生成高级报表。

打开VisualStudio.Net,新建一个C#的windows应用程序,取名为MyExcel。

根据个人爱好,对窗口做一些美化工作,然后放两个按钮:

btnNormal和btnAdvance,Caption分别为“普通报表”和“高级报表”。

从菜单中选择“项目”→“添加应用”,在弹出的对话框中选com页,再点浏览按钮,选择刚才生成的三个文件,如下:

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

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

usingSystem.IO;

usingSystem.Reflection;

再添加一个二维数组来表示数据表:

privatestring[,]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"}

};

切换回设计窗口,双击“普通报表”按钮,设计普通报表,代码如下:

privatevoidbtnNormal_Click(objectsender,System.EventArgse)

{

//创建一个Excel文件

Excel.ApplicationmyExcel=newExcel.Application();

myExcel.Application.Workbooks.Add(true);

//让Excel文件可见

myExcel.Visible=true;

//第一行为报表名称

myExcel.Cells[1,4]="普通报表";

//逐行写入数据,

for(inti=0;i<11;i++)

{

for(intj=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()

'

'宏1Macro

'苟安廷记录的宏2003-5-7

'

'

Selection.Borders(xlDiagonalDown).LineStyle=xlNone

Selection.Borders(xlDiagonalUp).LineStyle=xlNone

WithSelection.Borders(xlEdgeLeft)

.LineStyle=xlContinuous

.Weight=xlThin

.ColorIndex=xlAutomatic

EndWith

WithSelection.Borders(xlEdgeTop)

.LineStyle=xlContinuous

.Weight=xlThin

.ColorIndex=xlAutomatic

EndWith

WithSelection.Borders(xlEdgeBottom)

.LineStyle=xlContinuous

.Weight=xlThin

.ColorIndex=xlAutomatic

EndWith

WithSelection.Borders(xlEdgeRight)

.LineStyle=xlContinuous

.Weight=xlThin

.ColorIndex=xlAutomatic

EndWith

WithSelection.Borders(xlInsideVertical)

.LineStyle=xlContinuous

.Weight=xlThin

.ColorIndex=xlAutomatic

EndWith

WithSelection.Borders(xlInsideHorizontal)

.LineStyle=xlContinuous

.Weight=xlThin

.ColorIndex=xlAutomatic

EndWith

EndSub

图中表的数据都是供排版参考用的,结束前将实际内容删除掉,即只留下排好版的格式,包括标题、列标题等,将实际内容去掉。

将文件保存到一个地方,如D:

\Normal.xls,当然,实际开发时,可以放到执行文件所在目录下,为了防止用户随便修改,可以将文件名改为normal.rpt之类。

有了上面的准备,我们就可以在C#中使用了,添加“高级报表”按钮的响应代码。

下面是全部代码清单。

usingSystem;

usingSystem.Drawing;

usingSystem.Collections;

usingSystem.ComponentModel;

usingSystem.Windows.Forms;

usingSystem.Data;

usingSystem.IO;

usingSystem.Reflection;

namespaceMyExcel

{

///

///Form1的摘要说明。

///

publicclassForm1:

System.Windows.Forms.Form

{

privateSystem.Windows.Forms.ButtonbtnNormal;

privateSystem.Windows.Forms.ButtonbtnAdvace;

///

///必需的设计器变量。

///

privateSystem.ComponentModel.Containercomponents=null;

publicForm1()

{

//

//Windows窗体设计器支持所必需的

//

InitializeComponent();

//

//TODO:

在InitializeComponent调用后添加任何构造函数代码

//

}

///

///清理所有正在使用的资源。

///

protectedoverridevoidDispose(booldisposing)

{

if(disposing)

{

if(components!

=null)

{

components.Dispose();

}

}

base.Dispose(disposing);

}

#regionWindowsFormDesignergeneratedcode

///

///设计器支持所需的方法-不要使用代码编辑器修改

///此方法的内容。

///

privatevoidInitializeComponent()

{

this.btnNormal=newSystem.Windows.Forms.Button();

this.btnAdvace=newSystem.Windows.Forms.Button();

this.SuspendLayout();

//

//btnNormal

//

this.btnNormal.Location=newSystem.Drawing.Point(49,55);

this.btnNormal.Name="btnNormal";

this.btnNormal.TabIndex=0;

this.btnNormal.Text="普通报表";

this.btnNormal.Click+=newSystem.EventHandler(this.btnNormal_Click);

//

//btnAdvace

//

this.btnAdvace.Location=newSystem.Drawing.Point(169,55);

this.btnAdvace.Name="btnAdvace";

this.btnAdvace.TabIndex=1;

this.btnAdvace.Text="高级报表";

this.btnAdvace.Click+=newSystem.EventHandler(this.btnAdvace_Click);

//

//Form1

//

this.AutoScaleBaseSize=newSystem.Drawing.Size(6,14);

this.ClientSize=newSystem.Drawing.Size(292,133);

this.Controls.AddRange(newSystem.Windows.Forms.Control[]{

this.btnAdvace,

this.btnNormal});

this.Name="Form1";

this.StartPosition=System.Windows.Forms.FormStartPosition.CenterScreen;

this.Text="Form1";

this.ResumeLayout(false);

}

#endregion

///

///应用程序的主入口点。

///

[STAThread]

staticvoidMain()

{

Application.Run(newForm1());

}

privatestring[,]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"}

};

//普通报表,即单纯的文件导出功能

privatevoidbtnNormal_Click(objectsender,System.EventArgse)

{

//创建一个Excel文件

Excel.ApplicationmyExcel=newExcel.Application();

myExcel.Application.Workbooks.Add(true);

//让Excel文件可见

myExcel.Visible=true;

//第一行为报表名称

myExcel.Cells[1,4]="普通报表";

//逐行写入数据,

for(inti=0;i<11;i++)

{

for(intj=0;j<7;j++)

{

//以单引号开头,表示该单元格为纯文本

myExcel.Cells[2+i,1+j]="'"+myData[i,j];

}

}

}

//高级报表,根据模板生成的报表

privatevoidbtnAdvace_Click(objectsender,System.EventArgse)

{

stringfilename="";

//将模板文件复制到一个新文件中

SaveFileDialogmySave=newSaveFileDialog();

mySave.Filter="Excel文件(*.XLS)|*.xls|所有文件(*.*)|*.*";

if(mySave.ShowDialog()!

=DialogResult.OK)

{

return;

}

else

{

filename=mySave.FileName;

//将模板文件copy到新位置,建议实际开发时用相对路径,如Application.StartupPath.Trim()+"\\report\\normal.xls"

stringfilenameold=mySave.FileName;

FileInfomode=newFileInfo("d:

\\normal.xls");

try

{

mode.CopyTo(filename,true);

}

catch(Exceptionee)

{

MessageBox.Show(ee.Message);

return;

}

}

//打开复制后的文件

objectmissing=Missing.Value;

Excel.ApplicationmyExcel=newExcel.Application();

//打开新文件

myExcel.Application.Workbooks.Open(filename,

missing,

missing,

missing,

missing,

missing,

missing,

missing,

missing,

missing,

missing,

missing,

missing);

//将Excel显示出来

myExcel.Visible=true;

//逐行写入数据,数组中第一行我列标题,忽略

for(inti=1;i<11;i++)

{

for(intj=0;j<7;j++)

{

//以单引号开头,表示该单元格为纯文本

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1