zoukankan      html  css  js  c++  java
  • C# 操作Excel之旁门左道

    前言

      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 文件夹。

    结束

      解决一个问题尽量多想多了解多找一些方案和方法,比较各个方案的优缺点,再选一种适合自己实际情况的来实现。


    转:http://www.cnblogs.com/over140/archive/2009/05/25/1488913.html
  • 相关阅读:
    测试策略(1)
    css在网页中的一些重要运用
    拖拽禁止点击事件
    js入门的心结
    响应式布局
    web中的兼容性
    css中的bfc和ifc
    css格式化的基本运用
    css基础知识
    html中输入控件的元素
  • 原文地址:https://www.cnblogs.com/luluping/p/1489291.html
Copyright © 2011-2022 走看看