ASP导出Excel数据的四种方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、使用OWC

什么是OWC?

OWC是Office Web Compent的缩写,即Microsoft的Office Web组件,它为在Web中绘制图形提供了灵活的同时也是最基本的机制。在一个intranet环境中,如果可以假设客户机上存在特定的浏览器和一些功能强大的软件(如IE5和Office 2000),那么就有能力利用Office Web组件提供一个交互式图形开发环境。这种模式下,客户端工作站将在整个任务中分担很大的比重。

<%

Option Explicit

Class ExcelGen

Private objSpreadsheet

Private iColOffset

Private iRowOffset

Sub Class_Initialize()

Set objSpreadsheet = Server.CreateObject("OWC.Spreadsheet")

iRowOffset = 2

iColOffset = 2

End Sub

Sub Class_Terminate()

Set objSpreadsheet = Nothing "Clean up

End Sub

Public Property Let ColumnOffset(iColOff)

If iColOff > 0 then

iColOffset = iColOff

Else

iColOffset = 2

End If

End Property

Public Property Let RowOffset(iRowOff)

If iRowOff > 0 then

iRowOffset = iRowOff

Else

iRowOffset = 2

End If

End Property Sub GenerateWorksheet(objRS)

"Populates the Excel worksheet based on a Recordset"s contents

"Start by displaying the titles

If objRS.EOF then Exit Sub

Dim objField, iCol, iRow

iCol = iColOffset

iRow = iRowOffset

For Each objField in objRS.Fields

objSpreadsheet.Cells(iRow, iCol).Value =

objSpreadsheet.Columns(iCol).AutoFitColumns

"设置Excel表里的字体

objSpreadsheet.Cells(iRow, iCol).Font.Bold = True

objSpreadsheet.Cells(iRow, iCol).Font.Italic = False

objSpreadsheet.Cells(iRow, iCol).Font.Size = 10

objSpreadsheet.Cells(iRow, iCol).Halignment = 2 "居中

iCol = iCol + 1

Next "objField

"Display all of the data

Do While Not objRS.EOF

iRow = iRow + 1

iCol = iColOffset

For Each objField in objRS.Fields

If IsNull(objField.Value) then

objSpreadsheet.Cells(iRow, iCol).Value = ""

Else

objSpreadsheet.Cells(iRow, iCol).Value = objField.Value

objSpreadsheet.Columns(iCol).AutoFitColumns

objSpreadsheet.Cells(iRow, iCol).Font.Bold = False

objSpreadsheet.Cells(iRow, iCol).Font.Italic = False

objSpreadsheet.Cells(iRow, iCol).Font.Size = 10

End If

iCol = iCol + 1

Next "objField

objRS.MoveNext

Loop

End Sub Function SaveWorksheet(strFileName)




"Save the worksheet to a specified filename

On Error Resume Next

Call objSpreadsheet.ActiveSheet.Export(strFileName, 0)

SaveWorksheet = (Err.Number = 0)

End Function

End Class

Dim objRS

Set objRS = Server.CreateObject("ADODB.Recordset")

objRS.Open "SELECT * FROM xxxx", "Provider=SQLOLEDB.1;Persist Security

Info=True;User ID=xxxx;Password=xxxx;Initial Catalog=xxxx;Data source=xxxx;"

Dim SaveName

SaveName = Request.Cookies("savename")("name")

Dim objExcel

Dim ExcelPath

ExcelPath = "Excel\" & Save

Name & ".xls"

Set objExcel = New ExcelGen

objExcel.RowOffset = 1

objExcel.ColumnOffset = 1

objExcel.GenerateWorksheet(objRS)

If objExcel.SaveWorksheet(Server.MapPath(ExcelPath)) then

"Response.Write "已保存为Excel文件.

下载"

Else

Response.Write "在保存过程中有错误!"

End If

Set objExcel = Nothing

objRS.Close

Set objRS = Nothing

%>

二、用Excel的Application组件在客户端导出到Excel或Word

注意:两个函数中的“data“是网页中要导出的table的 id








导出到Excel代码






导出到Word代码



三、直接在IE中打开,再存为EXCEL文件

把读出的数据用

格式,在网页中显示出来,同时,加上下一句即可把EXCEL表在客客户端显示。

<%response.ContentType ="application/vnd.ms-excel"%>

注意:显示的页面中,只把
输出,最好不要输出其他表格以外的信息。

四、导出以半角逗号隔开的csv

用fso方法生成文本文件的方法,生成一个扩展名为csv文件。此文件,一行即为数据表的一行。生成数据表字段用半角逗号隔开。(有关fso生成文本文件的方法,在此就不做介绍了)

CSV文件介绍 (逗号分隔文件)

选择该项系统将创建一个可供下载的CSV 文件; CSV是最通用的一种文件格式,它可以非常容易地被导入各种PC表格及数据库中。

请注意即使选择表格作为输出格式,仍然可以将结果下载CSV文件。在表格输出屏幕的底部,显示有 "CSV 文件"选项,点击它即可下载该文件。

如果您把浏览器配置为将您的电子表格软件与文本(TXT)/逗号分隔文件(CSV) 相关联,当您下载该文件时,该文件将自动打开。下载下来后,如果本地已安装EXCEL,点击此文件,即可自动用EXCEL软件打开此文件。


- 作者: shawnyoung 2006年05月12日, 星期五 15:29 回复(0) | 引用(0) 加入博采

[转]ASP 操作EXCEL 总结
一、环境配置
服务器端的环境配置从参考资料上看,微软系列的配置应该都行,即:
1.Win9x+PWS+Office
2.Win2000 Professional+PWS+Office
3.Win2000 Server+IIS+Office
目前笔者测试成功的环境是后二者。Office的版本没有特殊要求,考虑到客户机配置的不确定性和下兼容特性,建议服务器端Office版本不要太高,以防止客户机下载后无法正确显示。
服务器端环境配置还有两个偶然的发现是:
1. 笔者开发机器上原来装有金山的WPS2002,结果Excel对象创建始终出现问题,卸载WPS2002后,错误消失。
2. 笔者开发ASP代码喜欢用FrontPage,结果发现如果FrontPage打开(服务器端),对象创建出现不稳定现象,时而成功时而不成功。扩展考察后发现,Office系列的软件如果在服务器端运行,则Excel对象的创建很难成功。
服务器端还必须要设置的一点是COM组件的操作权限。在命令行键入“DCOMCNFG”,则进入COM组件配置界面,选择Microsoft Excel后点击属性按钮,将三个单选项一律选择自定义,编辑中将Everyone加入所有权限。保存完毕后重新启动服务器。
客户端的环境配置

没发现什么特别讲究的地方,只要装有Office和IE即可,版本通用的好象都可以。

二、ASP对Excel的基本操作
1、 建立Excel对象
set objExcelApp = CreateObject("Excel.Application")
objExcelApp.DisplayAlerts = false 不显示警告
objExcelApp.Application.Visible = false 不显示界面
2、 新建Excel文件
objExcelApp.WorkBooks.add
set objExcelBook = objExcelApp.ActiveWorkBook
set objExcelSheets = objExcelBook.Worksheets
set objExcelSheet = objExcelBook.Sheets(1)
3、 读取已有Excel文件
strAddr = Server.MapPath(".")
objExcelApp.WorkBooks.Open(strAddr & "\Templet\Table.xls")
set objExcelBook = objExcelApp.ActiveWorkBook
set objExcelSheets = objExcelBook.Worksheets
set objExcelSheet = objExcelBook.Sheets(1)
4、 另存Excel文件
objExcelBook.SaveAs strAddr & "\Temp\Table.xls"
5、 保存Excel文件
objExcelBook.Save (笔者测试时保存成功,页面报错。)
6、 退出Excel操作
objExcelApp.Quit 一定要退出
set objExcelApp = Nothing

三、ASP操作Excel生成数据表
1、 在一个范围内插入数据
objExcelSheet.Range("B3:k3").Value = Array("67", "87", "5", "9", "7", "45", "45", "54", "54", "10")
2、 在一个单元格内插入数据
objExcelSheet.Cells(3,1).Value="Internet Explorer"
3、 选中一个范围
4、 单元格左边画粗线条
5、 单元格右边画粗线条
6、 单元格上边画粗线条
7、 单元格下边画粗线条
8、 单元格设定背景色
9、 合并单元格
10、 插入行
11、 插入列

四、ASP操作Excel生成Chart图
1、 创建Chart图
objExcelApp.Charts.Add
2、 设定Chart图种类
objExcelApp.ActiveChart.ChartType = 97
注:二维折线图,4;二维饼图,5;二维柱形图,51
3、 设定Chart图标题
objExcelApp.ActiveChart.HasTitle = True
objExcelApp.ActiveChart.ChartTitle.Text = "A test Chart"
4、 通过表格数据设定图形
objExcelApp.ActiveChart.SetSourceData objExcelSheet.Range("A1:k5"),1
5、 直接设定图形数据(推荐)
objExcelApp.ActiveChart.SeriesCollection.NewSeries
objExcelApp.ActiveChart.SeriesCollection(1).Name = "=""333"""
objExcelApp.ActiveChart.SeriesCollection(1).Values = "={1,4,5,6,2}"
6、 绑定Chart图
objExcelApp.ActiveChart.Location 1
7、 显示数据表
objExcelApp.ActiveChart.HasDataTable = True
8、 显示图例
objExcelApp.ActiveChart.DataTable.ShowLegendKey = True

五、服务器端Excel文件浏览、下载、删除方案
浏览的解决方法很多,“Location.href=”,“Navigate”,“Response.Redirect”都可以实现,建议用客户端的方法,原因是给服务器更多的时间生成Excel文件。
下载的实现要麻烦一些。用网上现成的服务器端下载组件或自己定制开发一个组件是比较好的方案。另外一种方法是

在客户端操作Excel组件,由客户端操作服务器端Excel文件另存至客户端。这种方法要求客户端开放不安全ActiveX控件的操作权限,考虑到通知每个客户将服务器设置为可信站点的麻烦程度建议还是用第一个方法比较省事。
删除方案由三部分组成:
A: 同一用户生成的Excel文件用同一个文件名,文件名可用用户ID号或SessionID号等可确信不重复字符串组成。这样新文件生成时自动覆盖上一文件。
B: 在Global.asa文件中设置Session_onEnd事件激发时,删除这个用户的Excel暂存文件。
C: 在Global.asa文件中设置Application_onStart事件激发时,删除暂存目录下的所有文件。
注:建议目录结构 \Src 代码目录 \Templet 模板目录 \Temp 暂存目录

六、附录
出错时Excel出现的死进程出现是一件很头疼的事情。在每个文件前加上“On Error Resume Next”将有助于改善这种情况,因为它会不管文件是否产生错误都坚持执行到“Application.Quit”,保证每次程序执行完不留下死进程。
- 作者: shawnyoung 2006年05月12日, 星期五 13:25 回复(0) | 引用(0) 加入博采

分享个极好的无刷新二级联动下拉列表,同样适用与firefox
可能"极好的"又会带来很多的非议,但是我认为这确实很好,我看了大约20个无刷新的连动下拉列表,他们在firefox下面就一团糟.为了这个我差不多搞了两天,就是如果提交窗体后如何保持第二个列表框的值,因为通过js 给下拉框添加条目那么他的状态是不会被保存的
测试平台:ie6,firefox
功能:二级无刷新连动
特点:跨浏览器;提交窗体取第二下拉框的值;数据来源于数据库;以xmlhttp来发送请求,实现无刷新
请求:如果您能够找到更好的方法请告诉我,非常感谢,您的批评和建议对我是莫大的鼓励
webform1.aspx:
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="drop.WebForm1" %>



WebForm1








runat="server">
摩托罗拉
诺基亚

runat="server">
Text="Button">




后台webform1.aspx.cs:
using System;
using System.Collections;
using ponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Configuration;
using System.Data.SqlClient;

namespace drop
{
///


/// WebForm1 的摘要说明。
///

public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DropDownList dListParent;
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.WebControls.DropDownList dListChild;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
//if(!IsPostBack)
//{
BindDrop();//如果不是提交回来就绑定列表框
//}
}

protected void BindDrop()
{
//首先我想父dropdownlist也绑定数据库,后面想没必要
//if(!IsPostBack)
//{
//绑定父dListParent
// BindParent();
//}
//获得传递过来的parent_id值,如果是第一次请求他为null
string str = Request.QueryString["parent_id"];
string str1 = dListParent.SelectedValue;;
Response.Write(str1);
//如果str加个字符串!=原来的字符串则说明触发过dListParent的onchange事件
if((str+"abc")!="abc")
{
//绑定 dListChild控件
BindChild(str);//把传来的父DropDownList的value做为参数
}
else
BindParent(str1);
}


protected void BindParent(string str)
{
//如果是第一次请求或者是刷新这个页面则根据dListParent的值来选择
//把参数转化成int
int i = Convert.ToInt32(str);
dListChild.Items.Clear();
dListChild.Items.Add(new ListItem("全部型号","0"));
//得到数据库连接字符串
string connStr = ConfigurationSettings.AppSettings["ConnString"].ToString();
//初始化个conn对象
SqlConnection conn = new SqlConnection(connStr);
//数据库语句
string commStr = string.Format("select type_value,type_text from phone_type where parent_id={0}",i);
//建立数据库命令对象
SqlCommand comm = new SqlCommand(commStr,conn);
//打开数据库
conn.Open();
//执行命令
SqlDataReader dr = comm.ExecuteReader();
//循环dr,给dListParent添加条目
while(dr.Read())
{
dListChild.Items.Add(new ListItem(dr[1].ToString(),dr[0].ToString()));
//也可以这样
//dListParent.Items.Add(new ListItem(dr["phone_text"].ToString(),dr["phone_value"].ToString()));
}
dListParent.Items[0].Selected = true;
//添加下面这话的意思是当点提交按钮提交窗体的时候第二个dListChild的状态能够得到保存
dListChild.SelectedValue = Request.Form["dListChild"];
dr.Close();
conn.Close();
}



protected void BindChild(string str)
{
//通过js给包括dropdownlist任何控件添加的内容不会被保存状态
//把参数转化成int
int i = Convert.ToInt32(str);
//定义个字符串用保存从数据库返回的数据
string result = "";
//先清空输出的东西
Response.Clear();
string connStr = ConfigurationSettings.AppSettings["ConnString"].ToString();
SqlConnection conn = new SqlConnection(connStr);
SqlCommand comm = conn.CreateCommand();
string commStr = string.Format("select type_value,type_text from phone_type where parent_id = {0}",i);
mandText = commStr;
conn.Open();
SqlDataReader dr = comm.ExecuteReader();
while(dr.Read())
{
result += ","+dr[0].ToString() +"|" + dr[1].ToString();
//dListChild.Items.Add(new ListItem(dr[1].ToString(),dr[0].ToString()));
}
//把从数据库得到的信息输出到客户端
Response.Write(result);
//输出完成关闭Response,以免造成不必要的输出
Response.Flush();
Response.Close();
dr.Close();
conn.Close();
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

///


/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
///

private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

private void Button1_Click(object sender, System.EventArgs e)
{
Response.Write(Request.Form["dListChild"].ToString());
}
}
}