客户端脚本导出到 Excel 2007






4.64/5 (13投票s)
导出到 Excel 是业务用户最常要求的关键功能之一。我们通常使用 HTMLProjects,但它不适用于 Office 2007。以下是替代方案,该脚本适用于 Windows OS 上的所有 MS Office 版本。
目录
- 导出到 Excel
- 实现导出到 Excel 的方法
- 服务器端导出到 Excel 的方法
- 客户端导出到 Excel 的方法
- 导出到 Excel 的客户端脚本
- 导出到 Excel 2003 或更早版本的脚本
- 导出到 Excel 2007 的脚本
- 总结
导出到 Excel
导出到 Excel 是业务用户最常要求的重要功能之一。在报表领域中,这一需求相当普遍。可能的要求是,我们点击某个按钮/链接,在服务器处理请求后,在客户端机器上打开一个包含所需数据的 Excel 文件。另一方面,可能的要求是,我们首先以用户期望的格式在客户端工具(如 IE 浏览器)中显示数据,然后点击某个链接/按钮,将该数据导出到 Excel。
坦白说,这与其说是一篇技术文章或代码片段,不如说是我尝试解决一个困扰我一段时间的问题的方案。我正在使用客户端 VBScript 来实现将 DataGrid 的数据导出到 Excel 的机制。问题出现在我们的客户将机器从 Office 2003 升级到 Office 2007 后,我原有的脚本就无法正常工作了。在这里,我们将简要了解导出到 Excel 的服务器端和客户端方法,然后重点关注可用于将 DataGrid 数据导出到 Excel 的 VBScript。
实现导出到 Excel 的方法
根据需求,我们可以在服务器端处理请求并将响应作为 Excel 数据返回,或者,我们可以先渲染数据,然后在用户进行任何操作时将其导出。让我们简要概述这两种方法。
服务器端导出到 Excel 的方法
在此类方法中,我们使用服务器端代码转换数据并将 Excel 发送到客户端。有几种方法可以做到,例如:
- 只需设置 Response 对象的 ContentType 属性,即可指定客户端可以预期的文件类型。我们还可以指定文件名。用户将以 Excel 表格的形式获取数据。
- 使用 OWC 等组件创建 Excel 对象,以所需的格式填充所需数据,然后将该对象发送到客户端。
如果您对此更感兴趣,请点击此处查看微软知识库文章。
客户端导出到 Excel 的方法
在此类方法中,我们首先在客户端(如最终用户计算机的 IE 浏览器)以期望的格式渲染数据,然后将其导出到 Excel,并保留完整的格式,如字体、颜色等。在此需要注意的重要一点是,只有当客户端计算机已安装 MS Excel 时,才能使用客户端脚本将渲染的数据导出到 Excel。如果客户端计算机未安装 Excel,我们应该使用服务器端方法导出到 Excel。
使用客户端脚本,我们可以通过任何客户端脚本使用 ActiveX 组件来实现这一点。通过这种方法,我们可以保证我们只导出用户已审查、甚至可能已在客户端处理过的期望数据,从而确保用户获得他们想要的内容。对于此类需求,客户端导出到 Excel 是最适合的,并且当我们使用客户端脚本将数据导出到 Excel 时,实际上节省了服务器端的请求。
好吧,在这篇文章中,我们将只关注使用客户端脚本将已经在 IE 中显示的 DataGrid/GridView 数据导出到 Excel。
导出到 Excel 的客户端脚本
如前所述,我们可以使用客户端脚本将渲染的表格数据导出到 Excel。现在我们将使用 VBScript 来实现。我们需要根据客户端计算机上的 Office 版本使用两个不同的脚本。如果客户端使用的是 Office 2003 或更早版本的 Office,那么我们可以安全地使用第一个脚本。但是,如果客户端计算机已升级到 Office 2007,我们必须使用第二个脚本来实现相同的功能。
导出到 Excel 2003 或更早版本的脚本
让我们先看一下可以满足我们需求的脚本,然后再详细介绍。所以,这是用于此目的的 VBScript。
<script language="vbscript">
Function ExportToExcel2003(objToExport)
Dim sHTML, oExcel, oBook
sHTML = document.all.item(objToExport).outerhtml
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Add
oBook.HTMLProject.HTMLProjectItems("Sheet1").Text = sHTML
oBook.HTMLProject.RefreshDocument
oExcel.Visible = true
oExcel.UserControl = true
End Function
</script>
上面的脚本非常直接,大多数人肯定在某个应用程序中用过。在该脚本中,我们只需将已在屏幕上渲染的 HTML 对象传递给函数,它就会通过客户端已有的 Office 导出到 Excel。简而言之,我们首先创建一个 Excel.Application 的 ActiveX 对象,然后向其添加一个 Workbook。然后,我们将 Excel 应用程序可以识别的 HTML 内容使用 HTMLProject 和 HTML ProjectItems 放置到工作簿的第一个工作表(Sheet1)中。Excel 随后解析此 HTML 并在“Sheet1”上进行渲染。在此需要注意的一个重要事项是,用户在 Excel 中看到的实际上并不是 Excel 的二进制数据文件,而是 Excel 应用程序解析和渲染的 HTML 数据。
好吧,HTMLProject 在 Office 2007 中不再受支持,因此我们上面提到的脚本出现了问题。在 Office 2007 中,脚本会在 `oBook.HTMLProject.HTMLProjectItems("Sheet1").Text = sHTML` 这一行出现错误,错误消息为“此方法或属性在此版本的 Excel 中不再受支持。”
好吧,在与这个问题斗争了相当一段时间后,我找到了一种替代方案。让我们来看看。
导出到 Excel 2007 的脚本
当用户升级到 Office 2007 时,我们将用于导出到 Excel 的脚本如下。让我们先看看脚本,然后再看看它是如何为我们工作的。
<script language="vbscript">
Function Export(objToExport)
ON ERROR RESUME NEXT
DIM sHTML, oExcel, fso, filePath
sHTML = document.all(objToExport).outerHTML
SET fso = CreateObject("Scripting.FileSystemObject")
filePath = fso.GetSpecialFolder(2) & "\MyExportedExcel.xls"
fso.CreateTextFile(filePath).Write(sHTML)
DIM i
SET i = 0
DO WHILE err.number > 0
err.Clear()
filePath = fso.GetSpecialFolder(2) & "\MyExportedExcel" & i & ".xls"
i = i + 1
LOOP
SET oExcel = CreateObject("Excel.Application")
IF err.number>0 OR oExcel =NULL THEN
msgbox("You need to have Excel Installed and Active-X Components Enabled on your System.")
EXIT FUNCTION
END IF
oExcel.Workbooks.open(filePath)
oExcel.Workbooks(1).WorkSheets(1).Name = "My Excel Data"
oExcel.Visible = true
Set fso = Nothing
End Function
</script>
相信我,它不像看起来那么复杂。让我们看看我们在做什么。简而言之,上面的代码创建一个名为 MyExportedExcel.xls 的文件,将其保存在 Windows 的 TEMP 文件夹中,然后打开并将其提供给用户。现在让我们详细了解这个脚本的重要代码段。
fso = CreateObject("Scripting.FileSystemObject")
用于返回一个可以读取或写入的TextStream
对象。点击此处了解更多详情。fso.GetSpecialFolder(2)
获取 TEMP 文件夹的完整文件夹路径。点击此处了解更多详情。fso.CreateTextFile(filePath).Write(sHTML)
使用所需文件名创建文件。点击此处了解更多详情。oExcel.Workbooks.open
打开指定的文件。它需要文件的路径作为参数。DO WHILE
循环。如果用户打开了一个文件实例,但又再次点击导出,那么 CreateTextFile 会出错。为了避免此类问题,我们首先检查是否可以创建一个新文件并保存它;如果不能,则在文件名后面添加数字然后保存。我们将文件名的引用存储在变量filepath
中,并在代码的后续部分使用它。我们在循环中反复尝试,以确保即使用户打开了多个实例,包括一些带有数字作为其一部分的文件名,也不会出错。好了,这种机制也应该适用于早期版本的 Excel。此脚本已在早期拥有 Office 2003 并后来升级到 Office 2007 的计算机上进行了测试。强烈建议在已全新安装 Office 2007 的目标计算机上测试此脚本。
导出到 Excel 2007 的解决方案要点
此解决方案的要点是使用扩展名为 .xls 的文件。好吧,如果我们提供扩展名为 .xlsx 的文件名,它将不起作用。要对此进行测试,请尝试执行以下操作:
- 创建一个简单的文本文件,其中包含以下内容:
<table> <tr> <td>A1</td><td>A2</td> </tr> <tr> <td>B1</td><td>B2</td> </tr> </table>
- 将此文件保存为 Sample.xls 并双击在 Office 2007 中打开。您可能会收到一条消息,选择“是”,然后它应该打开并显示两行数据。
- 现在将此文件重命名为 Sample.xlsx 并双击在 Office 2007 中打开。它应该会报错,提示文件格式或文件扩展名无效,因此无法打开。
总结
导出到 Excel 是一个非常常见的需求。分析并确定服务器端方法或客户端方法是否符合您的需求。我相信上面提到的 Excel 2007 脚本只是其中一种解决方案,可能还有更多。Excel 2007 的脚本完全依赖于上面提到的关键点,即它取决于我们将文件保存在客户端计算机 TEMP 文件夹中的文件扩展名,因此在使用时请务必小心。
请花些时间评价和提供关于本文的反馈。您的几分钟时间可以帮助提高本文的质量。
如果您有兴趣,请点击此处查看我发布的所有文章。