system.data;
using system.drawing;
using system.text;
using system.windows.forms;
using microsoft.office.interop.excel;
using system.data.sqlclient;
using system.data.oledb;
using system.reflection;
namespace excelprj
{
///
/// excel 系统中的主文件excel.exe 本身就是 com 组件,通过在.net 项目中引用exel.exe 文件可以实现对excel 的功能控制
/// 与com 组件相互操作是通过使用"包装类"(wrapper class) 和"代理"(proxy) 的机制实现的.包装类使.net 程序可以识别com 组件提供的接口,而代理类则是提供对 com 接口的访问
///
public partial class form1 : form
{
public form1()
{
initializecomponent();
}
private void button3_click(object sender, eventargs e)
{
exporttasks(bind(), datagridview1);
}
//如果 excel 安装在计算机上,侧导出表格内容到 excel
public void exporttasks(dataset tasksdata, datagridview tasksgridview)
{
// 定义要使用的excel 组件接口
// 定义application 对象,此对象表示整个excel 程序
microsoft.office.interop.excel.application excelapp = null ;
// 定义workbook对象,此对象代表工作薄
microsoft.office.interop.excel.workbook workbook;
// 定义worksheet 对象,此对象表示execel 中的一张工作表
microsoft.office.interop.excel.worksheet ws=null;
//定义range对象,此对象代表单元格区域
microsoft.office.interop.excel.range r;
int row = 1; int cell = 1;
try
{
//初始化 application 对象 excelapp
excelapp = new microsoft.office.interop.excel.application();
//在工作薄的第一个工作表上创建任务列表
workbook = excelapp.workbooks.add(xlwbatemplate.xlwbatworksheet);
ws =(worksheet)workbook.worksheets[1];
// 命名工作表的名称为 "task management"
ws.name = "task management";
#region 创建表格的列头
// 遍历数据表中的所有列
foreach (datagridviewcolumn cs in tasksgridview.columns)
{
// 假如并不想把主键也显示出来
if (cs.headertext != "编号")
{
ws.cells[row, cell] = cs.headertext;
r = (range)ws.cells[row, cell];
ws.get_range(r, r).horizontalalignment = microsoft.office.interop.excel.xlvalign.xlvaligncenter;
//此处用来设置列的样式
cell++;
}
}
// 创建行,把数据视图记录输出到对应的excel 单元格
for (int i = 2; i < tasksdata.tables[0].rows.count; i++)
{
for (int j = 1; j < tasksdata.tables[0].columns.count; j++)
{
ws.cells[i, j] = tasksdata.tables[0].rows[i][j].tostring();
// r = (range)ws.cells[i,j];
range rg = (range)ws.get_range(ws.cells[i, j], ws.cells[i, j]);
rg.entirecolumn.columnwidth = 20;
// rg.columns.autofit();
rg.numberformatlocal = "@";
}
}
#endregion
}
catch (exception ex)
{
messagebox.show(ex.tostring());
}
//显示 excel
excelapp.visible = true;
}
private void button5_click(object sender, eventargs e)
{
dataset ds = bind();
datagridview1.datasource = ds.tables[0];
}
private dataset bind()
{
sqlconnection conn = new sqlconnection("server=.;database=testmanage;integrated security=sspi");
sqldataadapter da = new sqldataadapter("select fnumber,fexamnum,fname,fsex,fjobadd,fcardid,fbirdate from stuinfo", conn);
dataset ds = new dataset();
da.fill(ds);
return ds;
}
private void button2_click(object sender, eventargs e)
{
savefiledialog sfd = new savefiledialog();
sfd.title = "请选择将导出的excel文件存放路径";
sfd.filename = system.datetime.now.toshortdatestring() + "-学生信息";
sfd.filter = "excel文档(*.xls)|*.xls";
sfd.showdialog();
if (sfd.filename != "")
{
microsoft.office.interop.excel.application excelapp = new microsoft.office.interop.excel.application();
if (excelapp == null)
{
messagebox.show("无法创建excel对象,可能您的机器未安装excel");
}
else
{
microsoft.office.interop.excel.workbooks workbooks = excelapp.workbooks;
microsoft.office.interop.excel.workbook workbook = workbooks.add(xlwbatemplate.xlwbatworksheet);
microsoft.office.interop.excel.worksheet worksheet =(worksheet) workbook.worksheets[1];
dataset ds=bind();
for (int i = 1; i < ds.tables[0].rows.count; i++)
{
for (int j = 1; j < ds.tables[0].columns.count;j++ )
{
if (i == 1)
{
worksheet.cells[i, j] = datagridview1.columns[j].headertext;
}
worksheet.cells[i+1, j] = ds.tables[0].rows[i][j].tostring();
}
}
//保存方式一:保存workbook
//workbook.saveas(@"f:cdata.xls",
// missing.value,missing.value,missing.value,missing.value,missing.value,
// microsoft.office.interop.excel.xlsaveasaccessmode.xlnochange,missing.value,missing.value,missing.value,
// missing.value,missing.value);
//保存方式二:保存worksheet
// worksheet.saveas(@"f:cdata2.xls",
// missing.value, missing.value, missing.value, missing.value,
// missing.value, missing.value, missing.value, missing.value, missing.value);
////保存方式三
//workbook.saved = true;
//workbook.savecopyas(sfd.filename);
system.runtime.interoervices.marshal.releasecomobject(worksheet);
worksheet = null;
system.runtime.interopservices.marshal.releasecomobject(workbook);
workbook = null;
workbooks.close();
system.runtime.interopservices.marshal.releasecomobject(workbooks);
workbooks = null;
excelapp.quit();
system.runtime.interopservices.marshal.releasecomobject(excelapp);
excelapp = null;
messagebox.show("导出excel完成!");
}
}
}
private void button4_click(object sender, eventargs e)
{
string strexcelfilename = @"f:2007-07-16-学生信息.xls";
string strsheetname = "sheet1";
#region aspnet 操作excel 正确
////源的定义
//string strconn = "provider=microsoft.jet.oledb.4.0;data source = " + strexcelfilename + ";extended properties ='excel 8.0;hdr=no;imex=1'";
////sql语句
//string strexcel = "select * from [" + strsheetname + "$]";
////定义存放的数据表
//dataset ds = new dataset();
////连接数据源
//oledbconnection conn = new oledbconnection(strconn);
//conn.open();
////适配到数据源
//oledbdataadapter adapter = new oledbdataadapter(strexcel, conn);
//adapter.fill(ds,"res");
//conn.close();
//// 一般的情况下. excel 表格的第一行是列名
//datagridview2.datasource = ds.tables["res"];
#endregion
#region com 组件读取复杂excel
microsoft.office.interop.excel.application excelapp = null;
microsoft.office.interop.excel.workbook workbook;
microsoft.office.interop.excel.worksheet ws = null;
try
{
excelapp = new microsoft.office.interop.excel.application();
workbook = excelapp.workbooks.open(@"f:book1.xls", missing.value, missing.value, missing.value, missing.value, missing.value, missing.value, missing.value, missing.value, missing.value, missing.value, missing.value, missing.value, missing.value, missing.value);
ws = (worksheet)workbook.worksheets[1];
//excel 默认为 256www.3ppt.com 列..
messagebox.show(ws.cells.columns.count.tostring());
excelapp.quit();
}
catch (exception ex)
{
throw ex;
}
#endregion
}
}
}
一些excel操作详解
一) 使用动态创建的方法
首先创建 excel 对象,使用comobj:
var excelapp: variant;
excelapp := createoleobject( 'excel.application ' );
1) 显示当前窗口:
excelapp.visible := true;
2) 更改 excel 标题栏:
excelapp.caption := '应用程序调用 microsoft excel ';
3) 添加新工作簿:
excelapp.workbooks.add;
4) 打开已存在的工作簿:
excelapp.workbooks.open( 'c:exceldemo.xls ' );
5) 设置第2个工作表为活动工作表:
excelapp.worksheets[2].activate;
或
excelapp.workssheets[ 'sheet2 ' ].activate;
6) 给单元格赋值:
excelapp.cells[1,4].value := '第一行第四列 ';
7) 设置指定列的宽度(单位:字符个数),以第一列为例:
excelapp.activesheet.columns[1].columnswidth := 5;
8) 设置指定行的高度(单位:磅)(1磅=0.035厘米),以第二行为例:
excelapp.activesheet.rows[2].rowheight := 1/0.035; // 1厘米
9) 在第8行之前插入分页符:
excelapp.worksheets[1].rows[8].pagebreak := 1;
10) 在第8列之前删除分页符:
excelapp.activesheet.columns[4].pagebreak := 0;
11) 指定边框线宽度:
excelapp.activesheet.range[ 'b3:d4 ' ].borders[2].weight := 3;
1-左 2-右 3-顶 4-底 5-斜( ) 6-斜( / )
12) 清除第一行第四列单元格公式:
excelapp.activesheet.cells[1,4].clearcontents;
13) 设置第一行字体属性:
excelapp.activesheet.rows[1].font.name := '隶书 ';
excelapp.activesheet.rows[1].font.color := clblue;
excelapp.activesheet.rows[1].font.bold := true;
excelapp.activesheet.rows[1].font.underline := true;
14) 进行页面设置:
a.页眉:
excelapp.activesheet.pagesetup.centerheader := '报表演示 ';
b.页脚:
excelapp.activesheet.pagesetup.centerfooter := '第&p页 ';
c.页眉到顶端边距2cm:
excelapp.activesheet.pagesetup.headermargin := 2/0.035;
d.页脚到底端边距3cm:
excelapp.activesheet.pagesetup.headermargin := 3/0.035;
e.顶边距2cm:
excelapp.activesheet.pagesetup.topmargin := 2/0.035;
f.底边距2cm:
excelapp.activesheet.pagesetup.bottommargin := 2/0.035;
g.左边距2cm:
excelapp.activesheet.pagesetup.leftmargin := 2/0.035;
h.右边距2cm:
excelapp.activesheet.pagesetup.rightmargin := 2/0.035;
i.页面水平居中:
excelapp.activesheet.pagesetup.centerhorizontally := 2/0.035;
j.页面垂直居中:
excelapp.activesheet.pagesetup.centervertically := 2/0.035;
k.打印单元格网线:
excelapp.activesheet.pagesetup.printgridlines := true;
15) 拷贝操作:
a.拷贝整个工作表:
excelapp.activesheet.used.range.copy;
b.拷贝指定区域:
excelapp.activesheet.range[ 'a1:e2 ' ].copy;
c.从a1位置开始粘贴:
excelapp.activesheet.range.[ 'a1 ' ].pastespecial;
d.从文件尾部开始粘贴:
excelapp.activesheet.range.pastespecial;
16) 插入一行或一列:
a. excelapp.activesheet.rows[2].insert;
b. excelapp.activesheet.columns[1].insert;
17) 删除一行或一列:
a. excelapp.activesheet.rows[2].delete;
b. excelapp.activesheet.columns[1].delete;
18) 打印预览工作表:
excelapp.activesheet.printpreview;
19) 打印输出工作表:
excelapp.activesheet.printout;
20) 工作表保存:
if not excelapp.activeworkbook.saved then
excelapp.activesheet.printpreview;
21) 工作表另存为:
excelapp.saveas( 'c:exceldemo1.xls ' );
22) 放弃存盘:
excelapp.activeworkbook.saved := true;
23) 关闭工作簿:
excelapp.workbooks.close;
24) 退出 excel:
excelapp.quit;
(二) 使用delphi 控件方法
在form中分别放入excelapplication, excelworkbook和excelworksheet。
1) 打开excel
excelapplication1.connect;
2) 显示当前窗口:
excelapplication1.visible[0]:=true;
3) 更改 excel 标题栏:
excelapplication1.caption := '应用程序调用 microsoft excel ';
4) 添加新工作簿:
excelworkbook1.connectto(excelapplication1.workbooks.add(emptyparam,0));
5) 添加新工作表:
var temp_worksheet: _worksheet;
begin
temp_worksheet:=excelworkbook1.
worksheets.add(emptyparam,emptyparam,emptyparam,emptyparam,0) as _worksheet;
excelworksheet1.connectto(temp_worksheet);
end;
6) 打开已存在的工作簿:
excelapplication1.workbooks.open (c:a.xls
emptyparam,emptyparam,emptyparam,emptyparam,
emptyparam,emptyparam,emptyparam,emptyparam,
emptyparam,emptyparam,emptyparam,emptyparam,0)
7) 设置第2个工作表为活动工作表:
excelapplication1.worksheets[2].activate; 或
excelapplication1.workssheets[ 'sheet2 ' ].activate;
8) 给单元格赋值:
excelapplication1.cells[1,4].value := '第一行第四列 ';
9) 设置指定列的宽度(单位:字符个数),以第一列为例:
excelapplication1.activesheet.columns[1].columnswidth := 5;
10) 设置指定行的高度(单位:磅)(1磅=0.035厘米),以第二行为例:
excelapplication1.activesheet.rows[2].rowheight := 1/0.035; // 1厘米
11) 在第8行之前插入分页符:
excelapplication1.worksheets[1].rows[8].pagebreak := 1;
12) 在第8列之前删除分页符:
excelapplication1.activesheet.columns[4].pagebreak := 0;
13) 指定边框线宽度:
excelapplication1.activesheet.range[ 'b3:d4 ' ].borders[2].weight := 3;
1-左 2-右 3-顶 4-底 5-斜( ) 6-斜( / )
14) 清除第一行第四列单元格公式:
excelapplication1.activesheet.cells[1,4].clearcontents;
15) 设置第一行字体属性:
excelapplication1.activesheet.rows[1].font.name := '隶书 ';
excelapplication1.activesheet.rows[1].font.color := clblue;
excelapplication1.activesheet.rows[1].font.bold := true;
excelapplication1.activesheet.rows[1].font.underline := true;
16) 进行页面设置:
a.页眉:
excelapplication1.activesheet.pagesetup.centerheader := '报表演示 ';
b.页脚:
excelapplication1.activesheet.pagesetup.centerfooter := '第&p页 ';
c.页眉到顶端边距2cm:
excelapplication1.activesheet.pagesetup.headermargin := 2/0.035;
d.页脚到底端边距3cm:
excelapplication1.activesheet.pagesetup.headermargin := 3/0.035;
e.顶边距2cm:
excelapplication1.activesheet.pagesetup.topmargin := 2/0.035;
f.底边距2cm:
excelapplication1.activesheet.pagesetup.bottommargin := 2/0.035;
g.左边距2cm:
excelapplication1.activesheet.pagesetup.leftmargin := 2/0.035;
h.右边距2cm:
excelapplication1.activesheet.pagesetup.rightmargin := 2/0.035;
i.页面水平居中:
excelapplication1.activesheet.pagesetup.centerhorizontally := 2/0.035;
j.页面垂直居中:
excelapplication1.activesheet.pagesetup.centervertically := 2/0.035;
k.打印单元格网线:
excelapplication1.activesheet.pagesetup.printgridlines := true;
17) 拷贝操作:
a.拷贝整个工作表:
excelapplication1.activesheet.used.range.copy;
b.拷贝指定区域:
excelapplication1.activesheet.range[ 'a1:e2 ' ].copy;
c.从a1位置开始粘贴:
excelapplication1.activesheet.range.[ 'a1 ' ].pastespecial;
d.从文件尾部开始粘贴:
excelapplication1.activesheet.range.pastespecial;
18) 插入一行或一列:
a. excelapplication1.activesheet.rows[2].insert;
b. excelapplication1.activesheet.columns[1].insert;
19) 删除一行或一列:
a. excelapplication1.activesheet.rows[2].delete;
b. excelapplication1.activesheet.columns[1].delete;
20) 打印预览工作表:
excelapplication1.activesheet.printpreview;
21) 打印输出工作表:
excelapplication1.activesheet.printout;
22) 工作表保存:
if not excelapplication1.activeworkbook.saved then
excelapplication1.activesheet.printpreview;
23) 工作表另存为:
excelapplication1.saveas( 'c:exceldemo1.xls ' );
24) 放弃存盘:
excelapplication1.activeworkbook.saved := true;
25) 关闭工作簿:
excelapplication1.workbooks.close;
26) 退出 excel:
excelapplication1.quit;
excelapplication1.disconnect;
(三) 使用delphi 控制excle二维图
在form中分别放入excelapplication, excelworkbook和excelworksheet
var asheet1,achart, range:variant;
1)选择当第一个工作薄第一个工作表
asheet1:=excelapplication1.workbooks[1].worksheets[1];
2)增加一个二维图
achart:=asheet1.chartobjects.add(100,100,200,200);
3)选择二维图的形态
achart.chart.charttype:=4;
4)给二维图赋值
series:=achart.chart.seriescollection;
range:=sheet1!r2c3:r3c9;
series.add(range,true);
5)加上二维图的标题
achart.chart.hastitle:=true;
achart.chart.charttitle.characters.text:=’ excle二维图’
6)改变二维图的标题字体大小
achart.chart.charttitle.font.size:=6;