正文
一、目的
從資料庫導出資料到Excel中并鎖定部分資料不讓修改。這裡以學生成績表為例, 學生編号、學生姓名、學生成績 三個字段從資料庫提取,并鎖定,老師評價欄在導出後可輸入。
二、實作
1. 制作Excel"模闆"
注意這裡的模闆不是指excel裡面的模闆,主要為後面導出成html做準備。
1.1 建立Excel,名稱為學生成績表.xls 。
1.2 設定列名欄目,設定格式字型等資訊,最終形式的格式,如圖:
<a href="http://blog.51cto.com/attachment/201106/120417265.png" target="_blank"></a>
當機視窗的方法:比如要當機第一行,選擇第二行的第一個單元格,工具欄->視窗->當機視窗。
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 class=xl27 x:num>
<%#Eval("achievement")%>
<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;
/// 姓名
public string name
get { return _name; }
set { _name = value; }
private decimal _achievement;
/// 成績
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程序!
本文轉自over140 51CTO部落格,原文連結:http://blog.51cto.com/over140/584862,如需轉載請自行聯系原作者