C# 操作Excel之旁门左道 [ 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

时间: 2024-09-11 00:02:45

C# 操作Excel之旁门左道 [ C# | Excel ]的相关文章

vb操作excel内容。在excel表格中搜索B列内容

问题描述 vb操作excel内容.在excel表格中搜索B列内容 vb读取excel内容.我想获取的是这样的.在excel表格中搜索B列内容为"32KP"对应的E列的内容比如B17为"32KP"则读取E17的内容到text1中.我是这样读取表格的Dim ExcelApp oBook a cSet ExcelApp = CreateObject(""Excel.Application"")Set oBook = ExcelApp

excel文件-c#操作Excel,我把Excel文件放在当前项目下,怎么写读取路径?

问题描述 c#操作Excel,我把Excel文件放在当前项目下,怎么写读取路径? setexcel = new SetExcel(@"E:01.xls");//我放在E盘中读取文件 我现在把Excel文件放到项目中去,怎么写读取路径? 解决方案 你要知道什么是相对路径和绝对路径 asp.net里用server.mapPath() winform用 Application.StartupPath+001.xls 解决方案二: 如果当前目录只有一个 Excel 文件,可以考虑先获取当前工作

c#操作Excel 一定需要安装Excel吗

问题描述 c#操作Excel一定需要安装Excel吗 解决方案 解决方案二:是的.解决方案三:现在在做一个项目,需要导出Excel格式化文件,但客户用Wps解决方案四:我觉得不一定,至少c#操作Access是可以不安装Access的,你可以找台没装Excel的机器试试啊解决方案五:操作excel调用的是com组件吧,有这个com组件就行解决方案六:没安装Excel无法将COM组件添加到程序中解决方案七:不需安装,windows自带oledb和odbc.解决方案八:引用4楼的回复: 操作excel

操作几万条,甚至几十万条数据导入导出 用什么方式比较好?除了数据库外,用NPOI好像不行,有没有大神操作过几十万条EXCEL数据的?

问题描述 操作几万条,甚至几十万条数据导入导出用什么方式比较好?(这里指的导入导出是数据导入到程序里,进行一些修改操作,然后再导出目前操作5000条数据是没问题的,但是超过1W条就报错了,)报了一个这样的错误:其他信息:Exception:WrongLocalheadersignature:0x5757575A我觉得应该是长度受限制了,但是又没有什么好的方法解决除了数据库外,用NPOI好像不行,有没有大神操作过几十万条EXCEL数据的?是怎么解决的求指教 解决方案 解决方案二:没人给回复呀?解决

导入导出-C#怎样通过代码实现讲数据导入excel表并将excel设置为只读模式

问题描述 C#怎样通过代码实现讲数据导入excel表并将excel设置为只读模式 C#怎样通过代码实现讲数据导入excel表并将excel设置为只读模式,目前写入数据没问题,关键就是怎么设为只读 解决方案 不用宏也可以做到的,直接用C#去调用excel com组件 这是我以前的解决方案:http://www.ourcodelife.com/thread-49258-1-1.html 解决方案二: 参考:http://office.jb51.net/excel/3889.html 你录制一个宏,看

请问:数据导出到excel的问题,excel中包含控件

问题描述 數據導出到excel的問題,excel中顯示的是RadioButton,需要根據頁面中dropdownlist的選中情況使excel中的對應RadioButton選中.怎么办?我现在会将数据导出到excel,但如何操作excel中的radiobutton呢? 解决方案 解决方案二://使用GridView导出excel表格,导出excel对特殊的控件进行模式化处理publicstaticvoidPrepareGridViewForExport(Controlgv)//模式化特殊元素的函

怎么用excel做甘特图?excel甘特图制作方法

利用excel制作甘特图,可以明确表示并行处理的任务,每个任务处理所需要的时间等.下面就为大家介绍一下,来看看吧! 软件名称:Excel2003绿色版 EXCEL2003精简绿色版 (附excel2003绿色工具)软件大小:13.3MB更新时间:2012-06-19 步骤 1.打开excel2010,准备要好整理的数据. 2.调整excel格式,一般excel格式为时间格式的,需要调整成常规. 3.选择数据,点击'插入'菜单,找到条形图---二维条形图---堆积条形图,点击选择即可. 4.将时间

php excel reader2.21导出excel中文乱码解决方法说明

之前我的PHP教程博客访友询问使用php excel reader2.21导出excel时中文出现乱码如何解决,现我说明下php excel reader导出excel中文乱码的解决方法,希望对使用php excel reader导出excel的朋友有所帮助. php excel reader介绍 php excel reader是一个读取Excel xsl文件内容的一个php excel类,目前最新版本是php excel reader2.21,网上可自行搜索,sourceforge上的php

winform中 将DataGrid中的数据导入Excel中,并显示Excel应用程序

datagrid|excel|程序|数据|显示    /// <summary>        /// 将DataGrid中的数据导入Excel中,并显示Excel应用程序,        /// 注意调用该方法必须有安装Excel 2000应用程序,并且假定DataGrid中绑定的是一DataSet        /// </summary>        /// <param name="grid"></param>        /