ASP 教程:与 Excel 和数据库的交互

本教程将分为三个主要部分:

asp excel数据库教程
(图片来源网络,侵删)
  1. ASP 与数据库交互:这是基础,所有操作都离不开从数据库读取数据。
  2. ASP 生成 Excel 文件,讲解如何将数据导出为 Excel 文件(.xls.xlsx)。
  3. ASP 读取 Excel 文件:讲解如何将 Excel 文件中的数据导入到数据库。

第一部分:ASP 与数据库交互

在将数据导出到 Excel 之前,我们首先需要从数据库(如 Access, SQL Server, MySQL 等)获取数据,这里我们以最经典的 ASP + AccessASP + SQL Server 为例。

1 准备工作

  • Web 服务器:安装了 IIS (Internet Information Services) 的 Windows 服务器。
  • ASP 环境:IIS 已配置好支持 ASP。
  • 数据库
    • Access:创建一个 .mdb 文件,db.mdb
    • SQL Server:确保 SQL Server 服务正在运行,并有一个数据库。
  • 数据表:在数据库中创建一个表,Products
    -- Access / SQL Server 通用
    CREATE TABLE Products (
        ID COUNTER PRIMARY KEY, -- Access 使用 COUNTER, SQL Server 使用 IDENTITY(1,1)
        ProductName VARCHAR(100),
        Price CURRENCY, -- Access 使用 CURRENCY, SQL Server 使用 MONEY
        Stock INT
    );

2 连接数据库并读取数据

连接数据库的最佳实践是使用 ADO (ActiveX Data Objects),我们将创建一个连接字符串和一个记录集对象。

示例代码:get_data.asp

<%
' --- 1. 定义连接字符串 ---
' --- 选择下面一种方式 ---
' 方式 A: 连接 Access 数据库
' 请将 "C:\path\to\your\db.mdb" 替换为你的 Access 数据库的实际路径
' 注意:路径最好使用物理路径,或者使用 Server.MapPath("/db/db.mdb")
Dim connStr
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\inetpub\wwwroot\myproject\db.mdb;"
' 方式 B: 连接 SQL Server 数据库
' Dim connStr
' connStr = "Provider=SQLOLEDB;Data Source=YOUR_SERVER_NAME;Initial Catalog=YOUR_DATABASE_NAME;User ID=your_user;Password=your_password;"
' --- 2. 创建 ADO 对象 ---
Dim conn, rs
Set conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
' --- 3. 打开连接并执行查询 ---
On Error Resume Next ' 错误处理,防止页面崩溃
conn.Open connStr
If Err.Number <> 0 Then
    Response.Write "数据库连接失败: " & Err.Description
    Response.End
End If
' SQL 查询语句
sql = "SELECT ProductName, Price, Stock FROM Products ORDER BY ProductName"
' 打开记录集
rs.Open sql, conn, 1, 1 ' 1=adOpenKeyset, 1=adLockReadOnly
' --- 4. 显示数据(可选,用于测试) ---
If rs.EOF And rs.BOF Then
    Response.Write "数据库中没有数据。"
Else
    Response.Write "<table border='1'>"
    Response.Write "<tr><th>产品名称</th><th>价格</th><th>库存</th></tr>"
    Do While Not rs.EOF
        Response.Write "<tr>"
        Response.Write "<td>" & rs("ProductName") & "</td>"
        Response.Write "<td>" & FormatCurrency(rs("Price")) & "</td>"
        Response.Write "<td>" & rs("Stock") & "</td>"
        Response.Write "</tr>"
        rs.MoveNext
    Loop
    Response.Write "</table>"
End If
' --- 5. 关闭并释放对象 ---
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
On Error GoTo 0
%>

第二部分:ASP 生成 Excel 文件

这是本教程的核心,我们将创建一个新的 ASP 页面,该页面不生成 HTML,而是直接生成一个 Excel 文件流,并提示用户下载。

asp excel数据库教程
(图片来源网络,侵删)

1 方法一:生成传统的 .xls 文件 (简单)

这种方法通过将 HTML 表格的 MIME 类型设置为 Excel 的类型,让浏览器用 Excel 打开。注意:此方法生成的不是真正的 Excel 文件,兼容性较差,但实现最简单。

示例代码:export_to_excel.asp

<%
' 引入第一部分的数据库连接和查询逻辑
' 为了方便,我们直接在这里重写
' --- 1. 连接数据库并获取数据 ---
Dim conn, rs, connStr, sql
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\inetpub\wwwroot\myproject\db.mdb;"
Set conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
conn.Open connStr
sql = "SELECT ProductName, Price, Stock FROM Products ORDER BY ProductName"
rs.Open sql, conn
' --- 2. 设置响应头,告诉浏览器这是一个 Excel 文件 ---
Response.Buffer = True ' 必须开启缓冲
Response.ContentType = "application/vnd.ms-excel"
' 设置一个随意的文件名,防止浏览器缓存
Response.AddHeader "Content-Disposition", "attachment; filename=产品列表_" & Year(Now()) & Month(Now()) & Day(Now()) & ".xls"
' --- 3. 输出 HTML 表格内容 ---会被 Excel 尝试解析
If rs.EOF And rs.BOF Then
    Response.Write "没有可导出的数据。"
Else
    ' 写入表头
    Response.Write "<table border='1'>"
    Response.Write "<tr><b><th>产品名称</th><th>价格</th><th>库存</th></b></tr>"
    ' 写入数据行
    Do While Not rs.EOF
        Response.Write "<tr>"
        Response.Write "<td>" & rs("ProductName") & "</td>"
        Response.Write "<td>" & rs("Price") & "</td>"
        Response.Write "<td>" & rs("Stock") & "</td>"
        Response.Write "</tr>"
        rs.MoveNext
    Loop
    Response.Write "</table>"
End If
' --- 4. 关闭并释放对象 ---
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
' 结束响应,确保只输出 Excel 内容
Response.End
%>

2 方法二:生成真正的 .xlsx 文件 (推荐)

这种方法使用服务器端的 Excel 组件(如 Microsoft Office Interop)来创建一个真实的 Excel 文件。注意:此方法需要在服务器上安装 Microsoft Excel,并且性能较差,不适合高并发场景。

前提条件:

asp excel数据库教程
(图片来源网络,侵删)
  1. 服务器上安装了 Microsoft Excel。
  2. 配置 DCOM 权限:运行 dcomcnfg,找到 "Microsoft Excel 应用程序",在 "安全" 选项卡中为 "启动和激活权限" 以及 "访问权限" 添加 IUSR (或你的 Web 服务器运行账户) 并赋予本地启动和访问权限。

示例代码:generate_real_xlsx.asp

<%
' --- 1. 连接数据库并获取数据 ---
' (同上,省略详细注释)
Dim conn, rs, connStr, sql
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\inetpub\wwwroot\myproject\db.mdb;"
Set conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
conn.Open connStr
sql = "SELECT ProductName, Price, Stock FROM Products ORDER BY ProductName"
rs.Open sql, conn
' --- 2. 创建 Excel 对象 ---
Dim objExcel, objWorkbook, objSheet
Set objExcel = Server.CreateObject("Excel.Application")
objExcel.Visible = False ' 不在服务器上显示 Excel 界面
Set objWorkbook = objExcel.Workbooks.Add
Set objSheet = objWorkbook.Worksheets(1)
' --- 3. 写入数据到 Excel 工作表 ---
' 写入表头
objSheet.Cells(1, 1).Value = "产品名称"
objSheet.Cells(1, 2).Value = "价格"
objSheet.Cells(1, 3).Value = "库存"
' 设置表头加粗
objSheet.Range("A1:C1").Font.Bold = True
' 写入数据行
Dim i
i = 2 ' 从第二行开始写数据
Do While Not rs.EOF
    objSheet.Cells(i, 1).Value = rs("ProductName")
    objSheet.Cells(i, 2).Value = rs("Price")
    objSheet.Cells(i, 3).Value = rs("Stock")
    rs.MoveNext
    i = i + 1
Loop
' 自动调整列宽
objSheet.Columns("A:C").AutoFit
' --- 4. 保存文件并处理下载 ---
Dim filePath, fileName
fileName = "产品列表_" & Year(Now()) & Month(Now()) & Day(Now()) & ".xlsx"
filePath = Server.MapPath("/temp/") & fileName
' 确保临时文件夹存在
Dim fso
Set fso = Server.CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(Server.MapPath("/temp/")) Then
    fso.CreateFolder(Server.MapPath("/temp/"))
End If
' 保存文件
objWorkbook.SaveAs filePath, 51 ' 51 代表 .xlsx 格式
' --- 5. 清理 Excel 对象 ---
objWorkbook.Close False
objExcel.Quit
Set objSheet = Nothing
Set objWorkbook = Nothing
Set objExcel = Nothing
' 释放数据库对象
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
' --- 6. 将文件提供给用户下载 ---
Response.Buffer = True
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
Response.AddHeader "Content-Disposition", "attachment; filename=" & fileName
Response.Flush
' 使用二进制方式读取并输出文件
Set fso = Nothing ' 重新创建 fso 对象
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Dim fileStream
Set fileStream = fso.OpenTextFile(filePath, 1, False, -1) ' -1 表示以二进制模式打开
Response.BinaryWrite fileStream.Read()
fileStream.Close
Set fileStream = Nothing
' --- 7. 删除临时文件 ---
fso.DeleteFile filePath
Set fso = Nothing
Response.End
%>

第三部分:ASP 读取 Excel 文件

这个功能常用于数据导入,例如批量上传产品信息到数据库。

1 上传 Excel 文件

我们需要一个 HTML 表单来让用户选择并上传 Excel 文件。

示例代码:upload_form.html

<!DOCTYPE html>
<html>
<head>上传 Excel 文件</title>
</head>
<body>
    <h2>请选择要导入的 Excel 文件</h2>
    <form action="import_excel.asp" method="post" enctype="multipart/form-data">
        <input type="file" name="excelFile" accept=".xls,.xlsx" />
        <br /><br />
        <input type="submit" value="上传并导入" />
    </form>
</body>
</html>

2 处理上传并读取 Excel 数据

我们将使用 ADO 的 Stream 对象或直接连接 Excel 文件来读取数据,这里我们使用连接 Excel 文件的方式,因为它更直接。

示例代码:import_excel.asp

<%
' --- 1. 检查是否有文件上传 ---
If Request.TotalBytes = 0 Then
    Response.Write "没有选择文件!"
    Response.End
End If
' --- 2. 保存上传的文件到服务器 ---
Dim upload, file, fileName, filePath, fileExt
Set upload = Server.CreateObject("Persits.Upload") ' 需要安装 ASPUpload 组件,这是一个第三方组件
' 如果没有组件,可以使用更基础的 Request.BinaryRead,但代码更复杂
' 这里假设你有一个可以处理上传的组件或方法
' 为了简化,我们假设你已经将文件上传到了一个临时位置,"C:\uploads\"
' 在实际应用中,你需要处理文件上传逻辑
' fileName = Request.Form("excelFile") ' 这种方式不正确,仅作示例
' --- 模拟文件已上传到指定路径 ---
' 在真实环境中,你需要使用上传组件将文件保存到服务器
' 这里我们直接使用一个固定的路径作为示例
filePath = "C:\inetpub\wwwroot\myproject\uploads\import_data.xlsx"
' 注意:你需要确保这个文件夹存在,并且有写入权限
' --- 3. 连接到 Excel 文件并读取数据 ---
Dim conn, rs, connStr, sql
' Excel 连接字符串
' HDR=Yes 表示第一行是列名
' IMEX=1 表示强制混合列(文本和数字)作为文本读取,避免类型转换问题
connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & filePath & ";Extended Properties='Excel 12.0 Xml;HDR=Yes;IMEX=1;'"
' 如果是旧版 .xls 文件,使用以下连接字符串
' connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & filePath & ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'"
Set conn = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
On Error Resume Next
conn.Open connStr
If Err.Number <> 0 Then
    Response.Write "无法打开 Excel 文件,请检查文件格式和路径,错误: " & Err.Description
    Response.End
End If
' 获取第一个工作表的名字
' 注意:Excel 中的表名通常是 'Sheet1$'
sql = "SELECT * FROM [Sheet1$]"
rs.Open sql, conn
' --- 4. 遍历 Excel 数据并插入到数据库 ---
Dim dbConn, dbRs, dbSql
Set dbConn = Server.CreateObject("ADODB.Connection")
dbConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\inetpub\wwwroot\myproject\db.mdb;"
If rs.EOF And rs.BOF Then
    Response.Write "Excel 文件中没有数据。"
Else
    Dim productName, price, stock
    Do While Not rs.EOF
        ' 假设 Excel 的列顺序是 A:ProductName, B:Price, C:Stock
        productName = rs(0) ' 第一列
        price = rs(1)    ' 第二列
        stock = rs(2)    ' 第三列
        ' 防止 SQL 注入,使用参数化查询是最佳实践,但这里为了简单,使用拼接
        ' 实际项目中请务必使用参数化查询!
        dbSql = "INSERT INTO Products (ProductName, Price, Stock) VALUES ('" & Replace(productName, "'", "''") & "', " & price & ", " & stock & ")"
        dbConn.Execute dbSql
        rs.MoveNext
    Loop
    Response.Write "数据导入成功!"
End If
' --- 5. 清理所有对象 ---
rs.Close
conn.Close
dbConn.Close
Set rs = Nothing
Set conn = Nothing
Set dbConn = Nothing
' --- 6. 删除上传的临时文件 ---
' Set fso = Server.CreateObject("Scripting.FileSystemObject")
' fso.DeleteFile filePath
' Set fso = Nothing
On Error GoTo 0
%>

总结与注意事项

  1. 安全第一

    • SQL 注入:在拼接 SQL 语句时,务必对数据进行转义(如 Replace(s, "'", "''")),但更推荐使用 参数化查询
    • 文件上传:严格限制上传文件的类型(只允许 .xls, .xlsx),并对文件内容进行扫描,防止上传恶意脚本。
  2. 性能与架构

    • Office Interop 方法虽然功能强大,但会占用大量服务器资源,且 Excel 进程可能无法正确释放,导致服务器内存泄漏。不推荐用于生产环境或高流量网站
    • 对于 .xlsx 文件,可以考虑使用 第三方组件(如 Aspose.Cells, SpreadsheetGear)或开源库(如 NPOI 的 .NET 版本,如果使用 .NET),这些组件不依赖安装 Office,性能和稳定性更好。
    • 方法一(MIME 类型) 最轻量,但功能有限,无法设置单元格格式、公式等。
  3. 错误处理: 始终使用 On Error Resume NextErr.Number 来捕获和处理可能发生的错误,如文件不存在、数据库连接失败、权限不足等,并向用户友好的提示。

  4. 路径问题: 在 Web 开发中,尽量使用 Server.MapPath() 将虚拟路径转换为服务器物理路径,避免因路径配置错误导致程序无法运行。

希望这份详细的教程能帮助你掌握 ASP 与 Excel 和数据库交互的核心技术!