正常访问状态! 设为首页 | 加入收藏夹 | 浏览历史  
  http://www.guosp.com
 碧海澜涛居
  海纳百川,有容乃大。壁立千刃,无欲则刚!
 
 
关键词:
  网站首页 | 关于本站 | 技术资料 | 美文日志 | 读书收藏 | 影视收藏 | 软件收藏 | 摄影相册| 留言板 
  技术资料 >> ASP.Net资料库 关闭(快捷键alt+C)
搜索标签: 导出 Excel
asp.net导出Excel文件之方法比较
[阅读次数:1191次]  [发布时间:2013年12月26日]

web导出Excel也不是什么新鲜的话题了,到网上一查,结果一大堆。可是要挑选一个好的、合适的方法也不容易。再加上自己也没有真正的做过这方面的导出工作,到底选那种方法好呢?最近一个一个方法地试了一边,小结出来给大家做个参考。

测试题目:通过一个模板,导出Excel文件。(模板结构较复杂,有公式、样式、合并行等)

(一)、首先想到的是用服务器端的Excel软件com来生成目标Excel。
这个是网上找到介绍最多的方法。这方法不多说了,有需要的可以到网上找,这里简单讲讲。这种方法就是调用服务器端的Excel软件,来读取模板,填写模板的。就是后台启动Excel来处理的,在进程管理器里可以查看到它的进程。
方法缺点:服务器端要装Excel软件,处理效率低,容易产生进程无法回收。
优点:Excel处理功能丰富,多样,可以完成一切的Excel文件处理。

下面是在网上找到的一个利用Excel com处理Excel文件的类,自己整理了一下,代码:

using System;
using System.Reflection;

namespace MyExcelClass{
/// <summary>
/// ExcelClass 的摘要说明。
/// </summary>
public class ExcelClass
{
/// <summary>
/// 构建ExcelClass类
/// </summary>
public ExcelClass()
{
this.m_objExcel=new Excel.Application();
}
/// <summary>
/// 构建ExcelClass类
/// </summary>
/// <param name="objExcel">Excel.Application</param>
public ExcelClass(Excel.Application objExcel)
{
this.m_objExcel=objExcel;
}

/// <summary>
/// 列标号
/// </summary>
private string AList="ABCDEFGHIJKLMNOPQRSTUVWXYZ";

/// <summary>
/// 获取描述区域的字符
/// </summary>
/// <param name="x"></param>
/// <param name="y"></param>
/// <returns></returns>
public string GetAix(int x,int y)
{
char [] AChars=AList.ToCharArray();
if(x>=26){return "";}
string s="";
s=s+AChars[x-1].ToString();
s=s+y.ToString();
return s;
}

/// <summary>
/// 给单元格赋值1
/// </summary>
/// <param name="x">行号</param>
/// <param name="y">列号</param>
/// <param name="align">对齐(CENTER、LEFT、RIGHT)</param>
/// <param name="text">值</param>
public void setValue(int y,int x,string align,string text)
{
Excel.Range range=sheet.get_Range(this.GetAix(x,y),miss);
range.set_Value(miss,text);
if(align.ToUpper()=="CENTER")
{
range.HorizontalAlignment=Excel.XlHAlign.xlHAlignCenter;
}
if(align.ToUpper()=="LEFT")
{
range.HorizontalAlignment=Excel.XlHAlign.xlHAlignLeft;
}
if(align.ToUpper()=="RIGHT")
{
range.HorizontalAlignment=Excel.XlHAlign.xlHAlignRight;
}
}

/// <summary>
/// 给单元格赋值2
/// </summary>
/// <param name="x">行号</param>
/// <param name="y">列号</param>
/// <param name="text">值</param>
public void setValue(int y,int x,string text)
{
Excel.Range range=sheet.get_Range(this.GetAix(x,y),miss);
range.set_Value(miss,text);
}

/// <summary>
/// 给单元格赋值3
/// </summary>
/// <param name="x">行号</param>
/// <param name="y">列号</param>
/// <param name="text">值</param>
/// <param name="font">字符格式</param>
/// <param name="color">颜色</param>
public void setValue(int y,int x,string text,System.Drawing.Font font,System.Drawing.Color color)
{
this.setValue(x,y,text);
Excel.Range range=sheet.get_Range(this.GetAix(x,y),miss);
range.Font.Size=font.Size;
range.Font.Bold=font.Bold;
range.Font.Color=color;
range.Font.Name=font.Name;
range.Font.Italic=font.Italic;
range.Font.Underline=font.Underline;
}

/// <summary>
/// 插入新行
/// </summary>
/// <param name="y">模板行号</param>
public void insertRow(int y)
{
Excel.Range range=sheet.get_Range(GetAix(1,y),GetAix(25,y));
range.Copy(miss);
range.Insert(Excel.XlDirection.xlDown,miss);
range.get_Range(GetAix(1,y),GetAix(25,y));
range.Select();
sheet.Paste(miss,miss);

}

/// <summary>
/// 把剪切内容粘贴到当前区域
/// </summary>
public void past()
{
string s="a,b,c,d,e,f,g";
sheet.Paste(sheet.get_Range(this.GetAix(10,10),miss),s);
}
/// <summary>
/// 设置边框
/// </summary>
/// <param name="x1"></param>
/// <param name="y1"></param>
/// <param name="x2"></param>
/// <param name="y2"></param>
/// <param name="Width"></param>
public void setBorder(int x1,int y1,int x2,int y2,int Width)
{
Excel.Range range=sheet.get_Range(this.GetAix(x1,y1),this.GetAix(x2,y2));
range.Borders.Weight=Width;
}
public void mergeCell(int x1,int y1,int x2,int y2)
{
Excel.Range range=sheet.get_Range(this.GetAix(x1,y1),this.GetAix(x2,y2));
range.Merge(true);
}

public Excel.Range getRange(int x1,int y1,int x2,int y2)
{
Excel.Range range=sheet.get_Range(this.GetAix(x1,y1),this.GetAix(x2,y2));
return range;
}

private object miss=Missing.Value; //忽略的参数OLENULL
private Excel.Application m_objExcel;//Excel应用程序实例
private Excel.Workbooks m_objBooks;//工作表集合
private Excel.Workbook m_objBook;//当前操作的工作表
private Excel.Worksheet sheet;//当前操作的表格

public Excel.Worksheet CurrentSheet
{
get
{
return sheet;
}
set
{
this.sheet=value;
}
}

public Excel.Workbooks CurrentWorkBooks
{
get
{
return this.m_objBooks;
}
set
{
this.m_objBooks=value;
}
}

public Excel.Workbook CurrentWorkBook
{
get
{
return this.m_objBook;
}
set
{
this.m_objBook=value;
}
}

/// <summary>
/// 打开Excel文件
/// </summary>
/// <param name="filename">路径</param>
public void OpenExcelFile(string filename)
{
UserControl(false);

m_objExcel.Workbooks.Open( filename,miss,miss,miss,miss,miss,miss,miss,
miss,miss,miss,miss,miss,miss,miss);

m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;

m_objBook = m_objExcel.ActiveWorkbook;
sheet = (Excel.Worksheet)m_objBook.ActiveSheet;
}
public void UserControl(bool usercontrol)
{
if(m_objExcel==null){return ;}
m_objExcel.UserControl=usercontrol;
m_objExcel.DisplayAlerts=usercontrol;
m_objExcel.Visible = usercontrol;
}
public void CreateExceFile()
{
UserControl(false);
m_objBooks = (Excel.Workbooks)m_objExcel.Workbooks;
m_objBook = (Excel.Workbook)(m_objBooks.Add(miss));
sheet = (Excel.Worksheet)m_objBook.ActiveSheet;
}
public void SaveAs(string FileName)
{
m_objBook.SaveAs(FileName, miss, miss, miss, miss,
miss, Excel.XlSaveAsAccessMode.xlNoChange,
Excel.XlSaveConflictResolution.xlLocalSessionChanges,
miss,miss, miss, miss);
//m_objBook.Close(false, miss, miss);
}
public void ReleaseExcel()
{
m_objExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject((object)m_objExcel);
System.Runtime.InteropServices.Marshal.ReleaseComObject((object)m_objBooks);
System.Runtime.InteropServices.Marshal.ReleaseComObject((object)m_objBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject((object)sheet);
m_objExcel=null;
m_objBooks=null;
m_objBook=null;
sheet=null;
GC.Collect();
}

/////////////////////////////////
public bool KillAllExcelApp()
{
try
{
if(m_objExcel != null) // isRunning是判断xlApp是怎么启动的flag.
{
m_objExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objExcel);
//释放COM组件,其实就是将其引用计数减1
//System.Diagnostics.Process theProc;
foreach(System.Diagnostics.Process theProc in System.Diagnostics.Process.GetProcessesByName("EXCEL"))
{
//先关闭图形窗口。如果关闭失败...有的时候在状态里看不到图形窗口的excel了,
//但是在进程里仍然有EXCEL.EXE的进程存在,那么就需要杀掉它:p
if( theProc.CloseMainWindow() == false )
{
theProc.Kill();
}
}
m_objExcel = null;
return true;
}
}
catch
{
return false;
}
return true;
}
/////////////////////////////////////////////
}
}
当然,使用的时候要先在工程引入Excel com,我用的是11版本。

(二)、利用MSOWC,即是微软的 office web component。
安装office就有安装到这个组件。文件和编程参考在系统盘的Program Files\Common Files\Microsoft Shared\下有Office10或者Office11版本。文件夹中还有帮助文件和例子。
网上找的一段导出Excel的简短例子:

//请在项目中引用OWC11(COM组件)

OWC11.SpreadsheetClass xlsheet =new OWC11.SpreadsheetClass();
//合并单元格
xlsheet.get_Range(xlsheet.Cells[1,1],xlsheet.Cells[1,14]).set_MergeCells(true);
xlsheet.ActiveSheet.Cells[1,1] ="一级帐表";
//字体加粗
xlsheet.get_Range(xlsheet.Cells[1,1],xlsheet.Cells[1,14]).Font.set_Bold(true);
//单元格文本水平居中对齐
xlsheet.get_Range(xlsheet.Cells[1,1],xlsheet.Cells[1,14]).set_HorizontalAlignment(OWC11.XlHAlign.xlHAlignCenter );
//设置字体大小
xlsheet.get_Range(xlsheet.Cells[1,1],xlsheet.Cells[1,14]).Font.set_Size(14);
//设置列宽
xlsheet.get_Range(xlsheet.Cells[1,3],xlsheet.Cells[1,3]).set_ColumnWidth(50);

//画边框线
xlsheet.get_Range(xlsheet.Cells[1,1],xlsheet.Cells[10,15]).Borders.set_LineStyle(OWC11.XlLineStyle.xlContinuous );

//写入数据 (这里可根据需要由DS生成)
for (int row=2;row<10;row ) //注意写入数据时,必须从第一行开始写EXCEL里没有第"0"行
{
for(int i = 0 ;i< 15 ;i )
{
xlsheet.ActiveSheet.Cells[row, i 1] =123.456;
}
}
try
{
//将数字格式化为金额(要格式化的单元格内的值必须为数值型)
xlsheet.get_Range(xlsheet.Cells[2,1],xlsheet.Cells[10,15]).set_NumberFormat("¥#,##0.00");
xlsheet.Export("D:\\ExportToExcel\\TestOWC.xls",OWC11.SheetExportActionEnum.ssExportActionNone,OWC11.SheetExportFormat.ssExportXMLSpreadsheet);
Response.Write("Export OK");
}
catch
{
}


这个方法我没有比较全面的试用过。用的时候,好像没有找到它打开Excel文件的方法,不知道是没有还是我没留心找。我在试用的时候,是用它来设计Excel表的,要画边框,设置样式等,好像很繁。
(三)、导出XML类型的Excel文件。其实是一个XML文件。
这个方法好啊,用起来放心。因为asp.net里面提供了很多丰富易用的xml类,xml处理起来明了,简单。我把原来的Excel文件保存为xml文件,用做模板。接着就是读写Xml文件了。想这么读就怎么读,想怎么写就怎么写,查找记录、改变属性值方便。
优点:不用安装Excel等软件,处理灵活,效率高。
缺点:Excel2000版本不支持xml,不知道其他版本支不支持。我用的是2003版本。
(四)、用htm文件。
还好Excel2000支持htm,可以把Excel内容保存到htm中。其实就是旧版本的xml吗。当然,样式和公式也可以用。我正打算用这个方法来做。(还没有去全面试用,不过自己对html还是很熟的,处理起来应该没问题。)
优缺点先不说,不过它代替xml在低版本的Excel中兼容。

(五)、网上也有说用text做中介的。
可是这种文件表示不了样式,公式等等,格式也很死板。
(六)、ado.net
容易出错,而且操作也不灵活,插入等经常遇到问题,而且不能删除行。比较适用于结构单一的Excel表。

////连接
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\dd.xls; Extended Properties="Excel 8.0;HDR=YES;"
HDR表示是否把第一行当作表头。如果为"NO"则系统或自动给行命名为F1,F2,F3.....等
///////获取默认的Excel表
DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
tableName = dt.Rows[0][2].ToString().Trim();
///更新数据
update [titles$] set F1='dd'
///插入数据
INSERT INTO DataTable values(1,'e2')
///查询数据
select * from [Sheet1$] where F1=5

更多可以查看MSDN读取 ExcelMSDN写入Excel

(六)、也有方法在客户端导出Excel。就是用脚本。
脚本导出:
function run(mytb)
{
var mysheet=new ActiveXObject("OWC.Spreadsheet");
with(mysheet)
{
DataType = "HTMLData";
HTMLData =mytb.outerHTML;
try{
ActiveSheet.Export("c:\\dxx.xls", 0);
alert('汇出完毕');
};
catch (e){
alert('导出Excel表失败,请确定已安装Excel2000(或更高版本),并且没打开同名xls文件');
};
}
}

=============================
补充:
最近在导出DataGrid/GridView数据行到Excel的时候,如果文件名为中文的话,就会出现乱码。晕了一个下午,终于找到解决方法,现记载如下:

1Response.Clear();
2 Response.Buffer = true
;
3 Response.Charset = "gb2312"
;
4 Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312"
);
5 Response.AppendHeader("content-disposition","attachment;filename=\"" + System.Web.HttpUtility.UrlEncode("中文名称",System.Text.Encoding.UTF8) + ".xls\""
);
6 Response.ContentType = "Application/ms-excel";
3、身份证号码的问题:存储为字符串
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Cells[2].Attributes.Add("style", "vnd.ms-excel.numberformat:@");//身份证号列
e.Item.Cells[3].Attributes.Add("style","vnd.ms-excel.numberformat:¥#,###.00");//金额
}




本页地址: [复制地址]
该页内容非本站原创 收藏自:http://www.cnblogs.com/lxinxuan/archive/2006/10/31/545533.html
返回顶部 关闭(快捷键alt+C)
评论统计(0条)| 我要评论
暂无评论内容!
我要评论 
我要评论: 带*部分需要填写
 姓名称呼: * 请填写您的姓名或呢称
联系方式: QQ,MSN,Email都可以,方便交流 (仅管理员可见)
 评论内容: * 不超过100字符,50汉字
验证码:
    
  推荐链接
·html页面表格导出到excel总...
·如何去除Access字段中的空格...
·以Word,Excl等各种格式保存...
·.net教程:反编译工具Reflec...
·从网页导出数据生成Excel后...
·asp遍历IIS站点,并导出域名...
·用HTML 格式导出Excel 时,...
·C#读取Excel遇到无法读取的...
·ASP中导入Excel数据时的连接...
·ASP学习摘要,VBscript函数汇...
·关于HTML导出到excel中的问...
·C#读取Excel的简单实现
·asp.net导出为pdf文件
·【为WIN2000系统添加远程桌...
·asp.net生成pdf文件
·mssql数据导入导出详解 企业...
·MySql的使用
·Err.number错误号和错误说明...
·asp.net2.0导出pdf文件完美...
·excel2003函数大全
  最近更新  
·Host 'XXX' is not allowed...
·Win2008或IIS7的文件上传大...
·IIS7.0上传文件限制的解决方...
·测试信息2015-03-11
·asp.net中处理图片
·ASP.NET之Web打印-终极解决...
·Asp.net下C#调用Word模版实...
·asp.net下将页面内容导入到...
·asp.net导出为pdf文件
·asp.net生成pdf文件
·FCKeditor 文本编辑器的使用...
·ASP.NET 将数据生成PDF
·asp.net2.0导出pdf文件完美...
·AspJpeg的安装与测试
·JS验证浏览器版本对IE11的支...
  热门浏览  
·IE8和IE9出现“此网页上的问...
·无线路由器密码破解,教你断...
·js替换所有回车换行符
·QQ/MSN在线交流代码
·如何取消键盘上的一些快捷键...
·IE弹出“中国工商银行防钓鱼...
·win7声音小的解决方法
·webdav漏洞的利用
·强制两端对齐的函数或者CSS...
·win7下成功安装sql server ...
·显示器分辨率调的过高导致电...
·天诺时空技术技术论坛
·js验证手机号码格式
·JS展开和收缩效果(二)
·本地计算机上的 MSSQLSERVE...
  碧海澜涛居
网站首页关于本站站长简介开发案例技术资料美文日志摄影相册读书收藏影视收藏留言板
版权所有:碧海澜涛 QQ:410436434 Email:shaopo_guo@163.com 苏ICP备15000526号
免责声明:本站为个人网站,站内所有文字、图片等各类资料均为个人兴趣爱好所收集,不用作任何商业用途,亦不保证资料的真实性,若有因浏览本站内容而导致的各类纠纷,本站也不承担任何责任。本站部分内容来自互联网,如有涉及到您的权益或隐私请联系站长解决。