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

简介:

一、目的 

    从数据库导出数据到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 文件夹。

本文转自博客园农民伯伯的博客,原文链接:C# 操作Excel之旁门左道 [ C# | Excel ],如需转载请自行联系原博主。

目录
相关文章
|
4月前
|
Java BI 数据处理
如何在Java中实现Excel操作
如何在Java中实现Excel操作
|
2月前
|
SQL C# 数据库
EPPlus库的安装和使用 C# 中 Excel的导入和导出
本文介绍了如何使用EPPlus库在C#中实现Excel的导入和导出功能。首先,通过NuGet包管理器安装EPPlus库,然后提供了将DataGridView数据导出到Excel的步骤和代码示例,包括将DataGridView转换为DataTable和使用EPPlus将DataTable导出为Excel文件。接着,介绍了如何将Excel数据导入到数据库中,包括读取Excel文件、解析数据、执行SQL插入操作。
EPPlus库的安装和使用 C# 中 Excel的导入和导出
|
5月前
|
Java 数据库 数据安全/隐私保护
Java操作Excel文件导入导出【内含有 jxl.jar 】
Java操作Excel文件导入导出【内含有 jxl.jar 】
84 0
|
3月前
|
文字识别 C# Python
使用C#将几个Excel文件合并去重分类
使用C#将几个Excel文件合并去重分类
32 3
|
3月前
|
开发框架 算法 .NET
C#使用MiniExcel导入导出数据到Excel/CSV文件
C#使用MiniExcel导入导出数据到Excel/CSV文件
81 0
Excel如何使用VBA操作引用其它工作簿中的单元格
Excel引用其它工作簿中的单元格的值及使用VBA操作
|
5月前
|
Python
【干货】python xlwt写入excel操作
【干货】python xlwt写入excel操作
|
5月前
|
C#
【C#】C#读写Excel文件
【C#】C#读写Excel文件
131 1
|
5月前
|
图形学
【unity小技巧】unity读excel配置表操作,excel转txt文本,并读取txt文本内容,实例说明
【unity小技巧】unity读excel配置表操作,excel转txt文本,并读取txt文本内容,实例说明
196 0
|
5月前
|
分布式计算 大数据 数据处理
MaxCompute操作报错合集之在本地用tunnel命令上传excel表格到mc遇到报错: tunnel upload C:\Users***\Desktop\a.xlsx mc里的非分区表名 -s false;该怎么办
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。