65.9K
CodeProject 正在变化。 阅读更多。
Home

客户端脚本导出到 Excel 2007

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.64/5 (13投票s)

2007年4月4日

CPOL

8分钟阅读

viewsIcon

153778

downloadIcon

1844

导出到 Excel 是业务用户最常要求的关键功能之一。我们通常使用 HTMLProjects,但它不适用于 Office 2007。以下是替代方案,该脚本适用于 Windows OS 上的所有 MS Office 版本。

目录

导出到 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 文件夹中,然后打开并将其提供给用户。现在让我们详细了解这个脚本的重要代码段。

  1. fso = CreateObject("Scripting.FileSystemObject") 用于返回一个可以读取或写入的 TextStream 对象。点击此处了解更多详情
  2. fso.GetSpecialFolder(2) 获取 TEMP 文件夹的完整文件夹路径。点击此处了解更多详情。
  3. fso.CreateTextFile(filePath).Write(sHTML) 使用所需文件名创建文件。点击此处了解更多详情。
  4. oExcel.Workbooks.open 打开指定的文件。它需要文件的路径作为参数。
  5. DO WHILE 循环。如果用户打开了一个文件实例,但又再次点击导出,那么 CreateTextFile 会出错。为了避免此类问题,我们首先检查是否可以创建一个新文件并保存它;如果不能,则在文件名后面添加数字然后保存。我们将文件名的引用存储在变量 filepath 中,并在代码的后续部分使用它。我们在循环中反复尝试,以确保即使用户打开了多个实例,包括一些带有数字作为其一部分的文件名,也不会出错。

    好了,这种机制也应该适用于早期版本的 Excel。此脚本已在早期拥有 Office 2003 并后来升级到 Office 2007 的计算机上进行了测试。强烈建议在已全新安装 Office 2007 的目标计算机上测试此脚本。

导出到 Excel 2007 的解决方案要点

此解决方案的要点是使用扩展名为 .xls 的文件。好吧,如果我们提供扩展名为 .xlsx 的文件名,它将不起作用。要对此进行测试,请尝试执行以下操作:

  1. 创建一个简单的文本文件,其中包含以下内容:
    <table>
        <tr>
            <td>A1</td><td>A2</td>
        </tr>
        <tr> 
            <td>B1</td><td>B2</td>
        </tr>
    </table>
    
  2. 将此文件保存为 Sample.xls 并双击在 Office 2007 中打开。您可能会收到一条消息,选择“是”,然后它应该打开并显示两行数据。
  3. 现在将此文件重命名为 Sample.xlsx 并双击在 Office 2007 中打开。它应该会报错,提示文件格式或文件扩展名无效,因此无法打开。

总结

导出到 Excel 是一个非常常见的需求。分析并确定服务器端方法或客户端方法是否符合您的需求。我相信上面提到的 Excel 2007 脚本只是其中一种解决方案,可能还有更多。Excel 2007 的脚本完全依赖于上面提到的关键点,即它取决于我们将文件保存在客户端计算机 TEMP 文件夹中的文件扩展名,因此在使用时请务必小心。

请花些时间评价和提供关于本文的反馈。您的几分钟时间可以帮助提高本文的质量。

如果您有兴趣,请点击此处查看我发布的所有文章。

© . All rights reserved.