天天看點

C# 操作Excel之旁門左道 [ C# | Excel ]

正文

  一、目的 

    從資料庫導出資料到Excel中并鎖定部分資料不讓修改。這裡以學生成績表為例, 學生編号、學生姓名、學生成績 三個字段從資料庫提取,并鎖定,老師評價欄在導出後可輸入。

  二、實作

    1.  制作Excel"模闆"

      注意這裡的模闆不是指excel裡面的模闆,主要為後面導出成html做準備。

      1.1  建立Excel,名稱為學生成績表.xls 。

      1.2  設定列名欄目,設定格式字型等資訊,最終形式的格式,如圖:

<a href="http://blog.51cto.com/attachment/201106/120417265.png" target="_blank"></a>

當機視窗的方法:比如要當機第一行,選擇第二行的第一個單元格,工具欄-&gt;視窗-&gt;當機視窗。

      1.3  鎖定區域

        1.3.1  Excel全選-&gt;右鍵 設定單元格格式-&gt;保護-&gt;去掉 鎖定 前複選框

        1.3.2  選擇學生編号、學生姓名、學生成績這三列,同上(1.3.1)步驟相反,即勾上 鎖定 前的複選框。

        1.3.3  輸入測試資料 1 張三 83。

        1.3.4  工具-&gt;保護-&gt;保護工作表,模闆完成!如果你在鎖定後再更改前面三列,将出現如下警告框:

2.  導出Excel為html格式并複制到一個空白的aspx頁面中

        2.1  工具欄 檔案-&gt;另存為網頁,導出後的檔案為學生成績表.htm。

        2.2  用記事本或UE打開,可以看到如下部分代碼:

&lt;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"&gt;

&lt;head&gt;

&lt;meta http-equiv=Content-Type content="text/html; charset=gb2312"&gt;

&lt;meta name=ProgId content=Excel.Sheet&gt;

&lt;meta name=Generator content="Microsoft Excel 11"&gt;

&lt;link rel=File-List href="學生成績表.files/filelist.xml"&gt;

&lt;link rel=Edit-Time-Data href="學生成績表.files/editdata.mso"&gt;

&lt;link rel=OLE-Object-Data href="學生成績表.files/oledata.mso"&gt;

&lt;!--[if gte mso 9]&gt;&lt;xml&gt;

 &lt;o:DocumentProperties&gt;

  &lt;o:Created&gt;1996-12-17T01:32:42Z&lt;/o:Created&gt;

  &lt;o:LastSaved&gt;2009-05-25T06:35:53Z&lt;/o:LastSaved&gt;

C# 操作Excel之旁門左道 [ C# | Excel ]
C# 操作Excel之旁門左道 [ C# | Excel ]

        2.3  建立aspx頁面:  Export.aspx。

        2.4  去掉Export.aspx中除&lt;%@ Page 的代碼,複制htm裡面的代碼到空白的Export.aspx中,添加&lt;form id="form1" runat="server"&gt;。

    3.  調取資料并顯示

      3.1  找到測試資料部分的html代碼替換為asp:Repeater控件代碼,如下

 &lt;!--

 &lt;tr height=19 style='height:14.25pt'&gt;

  &lt;td height=19 class=xl27 style='height:14.25pt' x:num&gt;1&lt;/td&gt;

  &lt;td class=xl27&gt;張三&lt;/td&gt;

  &lt;td class=xl27 x:num&gt;83&lt;/td&gt;

  &lt;td class=xl25&gt;&lt;/td&gt;

 &lt;/tr&gt;

 --&gt;

 &lt;asp:Repeater ID="rptData" runat="server"&gt;

    &lt;HeaderTemplate&gt;

    &lt;/HeaderTemplate&gt;

    &lt;ItemTemplate&gt;

        &lt;tr height=19 style='height:14.25pt'&gt;

            &lt;td height=19 class=xl27 style='height:14.25pt' x:num&gt;

                &lt;%#Eval("id")%&gt;

            &lt;/td&gt;

            &lt;td class=xl27&gt;

                &lt;%#Eval("name")%&gt;

            &lt;td class=xl27 x:num&gt;

                &lt;%#Eval("achievement")%&gt;

            &lt;td class=xl25&gt;&lt;/td&gt;

        &lt;/tr&gt;

    &lt;/ItemTemplate&gt;

    &lt;FooterTemplate&gt;

    &lt;/FooterTemplate&gt;

&lt;/asp:Repeater&gt;

      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&lt;User&gt; users = new List&lt;User&gt;();

        //測試資料

        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;

        /// &lt;summary&gt;

        ///  編号

        /// &lt;/summary&gt;

        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,如需轉載請自行聯系原作者