前言
C#使用自带的库(Excel 11.0/5.0 Object Library)操作Excel一直以来都有些问题,最严重的要数有时候Excel进程结束不掉这个问题,操作起来也不是很方便。其实Excel用得稍熟点的朋友就知道Excel可以导出为html格式的文件,我想说到这里大家应该大致明白本文的意图了,下面我为大家做一个范例。
环境
1. Microsoft Office Excel 2003
正文
一、目的
从数据库导出数据到Excel中并锁定部分数据不让修改。这里以学生成绩表为例, 学生编号、学生姓名、学生成绩 三个字段从数据库提取,并锁定,老师评价栏在导出后可输入。
二、实现
1. 制作Excel"模板"
注意这里的模板不是指excel里面的模板,主要为后面导出成html做准备。
1.1 新建Excel,名称为学生成绩表.xls 。
1.2 设置列名栏目,设置格式字体等信息,最终形式的格式,如图:
冻结窗口的方法:比如要冻结第一行,选择第二行的第一个单元格,工具栏->窗口->冻结窗口。
1.3 锁定区域
1.3.1 Excel全选->右键 设置单元格格式->保护->去掉 锁定 前复选框
1.3.2 选择学生编号、学生姓名、学生成绩这三列,同上(1.3.1)步骤相反,即勾上 锁定 前的复选框。
1.3.3 输入测试数据 1 张三 83。
1.3.4 工具->保护->保护工作表,模板完成!如果你在锁定后再更改前面三列,将出现如下警告框:
2. 导出Excel为html格式并复制到一个空白的aspx页面中
2.1 工具栏 文件->另存为网页,导出后的文件为学生成绩表.htm。
2.2 用记事本或UE打开,可以看到如下部分代码:
<
html
xmlns:o
="urn:schemas-microsoft-com:office:office"
xmlns:x
="urn:schemas-microsoft-com:office:excel"
xmlns
="http://www.w3.org/TR/REC-html40"
>
<
head
>
<
meta
http-equiv
=Content-Type
content
="text/html; charset=gb2312"
>
<
meta
name
=ProgId
content
=Excel.Sheet
>
<
meta
name
=Generator
content
="Microsoft Excel 11"
>
<
link
rel
=File-List
href
="学生成绩表.files/filelist.xml"
>
<
link
rel
=Edit-Time-Data
href
="学生成绩表.files/editdata.mso"
>
<
link
rel
=OLE-Object-Data
href
="学生成绩表.files/oledata.mso"
>
<!--
[if gte mso 9]><xml>
<o:DocumentProperties>
<o:Created>1996-12-17T01:32:42Z</o:Created>
<o:LastSaved>2009-05-25T06:35:53Z</o:LastSaved>
2.3 新建aspx页面: Export.aspx。
2.4 去掉Export.aspx中除<%@ Page 的代码,复制htm里面的代码到空白的Export.aspx中,添加<form id="form1" runat="server">。
3. 调取数据并显示
3.1 找到测试数据部分的html代码替换为asp:Repeater控件代码,如下
<!--
<tr height=19 style='height:14.25pt'>
<td height=19 class=xl27 style='height:14.25pt' x:num>1</td>
<td class=xl27>张三</td>
<td class=xl27 x:num>83</td>
<td class=xl25></td>
</tr>
-->
<
asp:Repeater
ID
="rptData"
runat
="server"
>
<
HeaderTemplate
>
</
HeaderTemplate
>
<
ItemTemplate
>
<
tr
height
=19
style
='height:14.25pt'
>
<
td
height
=19
class
=xl27
style
='height:14.25pt'
x:num
>
<%
#
Eval
(
"
id
"
)
%>
</
td
>
<
td
class
=xl27
>
<%
#
Eval
(
"
name
"
)
%>
</
td
>
<
td
class
=xl27
x:num
>
<%
#
Eval
(
"
achievement
"
)
%>
</
td
>
<
td
class
=xl25
></
td
>
</
tr
>
</
ItemTemplate
>
<
FooterTemplate
>
</
FooterTemplate
>
</
asp:Repeater
>
3.2 后台调取数据,导成excel并下载
这里就不连接数据库了,直接在程序里面模拟一些数据。
protected
void
Page_Load(
object
sender, EventArgs e)
{
this
.EnableViewState
=
false
;
//
加载数据
LoadData();
Response.Clear();
Response.Buffer
=
true
;
Response.Charset
=
"
GB2312
"
;
Response.AppendHeader(
"
Content-Disposition
"
,
"
attachment; filename=
"
+
HttpUtility.UrlEncode(
"
学生成绩表.xls
"
, System.Text.Encoding.UTF8));
Response.ContentEncoding
=
System.Text.Encoding.GetEncoding(
"
GB2312
"
);
Response.ContentType
=
"
application/ms-excel
"
;
//
Response.End();
}
private
void
LoadData()
{
IList
<
User
>
users
=
new
List
<
User
>
();
//
测试数据
users.Add(
new
User(
1
,
"
刘一
"
,
81
));
users.Add(
new
User(
2
,
"
陈二
"
,
82
));
users.Add(
new
User(
3
,
"
张三
"
,
83
));
users.Add(
new
User(
4
,
"
李四
"
,
84
));
users.Add(
new
User(
5
,
"
王五
"
,
85
));
users.Add(
new
User(
6
,
"
赵六
"
,
86
));
users.Add(
new
User(
7
,
"
孙七
"
,
87
));
users.Add(
new
User(
8
,
"
周八
"
,
88
));
users.Add(
new
User(
9
,
"
吴九
"
,
89
));
users.Add(
new
User(
10
,
"
郑十
"
,
80
));
rptData.DataSource
=
users;
rptData.DataBind();
}
[Serializable]
private
class
User
{
public
User()
{
}
public
User(
int
id,
string
name,
decimal
achievement)
{
this
._id
=
id;
this
._name
=
name;
this
._achievement
=
achievement;
}
private
int
_id;
///
<summary>
///
编号
///
</summary>
public
int
id
{
get
{
return
_id; }
set
{ _id
=
value; }
}
private
string
_name;
///
<summary>
///
姓名
///
</summary>
public
string
name
{
get
{
return
_name; }
set
{ _name
=
value; }
}
private
decimal
_achievement;
///
<summary>
///
成绩
///
</summary>
public
decimal
achievement
{
get
{
return
_achievement; }
set
{ _achievement
=
value; }
}
}
代码说明:
Page_Load中依次加载数据,然后以ms-excel类型讲web浏览变成excel文件下载。
3.3 导出后的excel截图
3.3.1 下载
3.3.2 修改锁定的三列截图
很明显,动态输出表格是我们擅长的,也不用你去翻N多N多的API了,最重要的是这里没有Excel进程!
三、下载
1. 源代码2009-5-25
四、注意
1. 下载回来的excel如果直接在上面操作的话可能产生 [excel名称].files 文件夹。
结束
解决一个问题尽量多想多了解多找一些方案和方法,比较各个方案的优缺点,再选一种适合自己实际情况的来实现。