VBA(Excel)和网页

如果你是Excel的资深用户,一定会留恋VBA,实际上你的VBA知识在Foxtable一样有用,原来的VBA代码只需稍作修改,就可以在Foxtable中使用。

关于如何在Foxtable使用VBA操作Excel文件,参考:Excel与VBA

本节介绍如何将VBA处理后的Excel文件转换为网页或PDF文件发送到客户端,考虑Foxtable的Excel报表功能并不支持图表,本节的内容对于需要实现图文并茂网页的用户很有意义。

HttpRequest有两个方法,WriteExcelAsHTML和WriteExcelAsPDF,分别用于将Workbook对象转换为网页或PDF文件发送到客户端。

一个简单的例子

1、打开CaseStudy目录下的文件"Excel报表.foxtdb"

2、将HttpRequest事件代码设置为:

If e.Path.StartsWith("Reports\")
    e.ResponseEncoding = "gb2312"
    Select Case e.Path
        Case  "Reports\table1.htm"
            Dim app As New MSExcel.Application
            Dim wb As MSExcel.Workbook = app.WorkBooks.Open(ProjectPath & "Attachments\table.xlsx")
           
'VBA
代码
            e.WriteExcelAsHTML(wb)
        Case  "Reports\table2.htm"
            Dim app As New MSExcel.Application
            Dim wb As MSExcel.Workbook = app.WorkBooks.Open(ProjectPath & "Attachments\table.xlsx")
           
'VBA代码
            e.WriteExcelAsPDF(wb)
        Case Else
            e.AsReportServer("Reports\")
    End
Select

End
If

3、在命令窗口执行:

HttpServer.Prefixes.Add("http://127.0.0.1/")
HttpServer
.Start()

现在在浏览器输入网址:

http://127.0.0.1/Reports/table1.htm

即可得到网页:

如果在浏览器输入网址:

http://127.0.0.1/Reports/table2.htm

会以PDF格式显示上图中的内容。

一定要多线程

以上代码并不会自动多线程执行,所以效率很低,实际应用的时候,一定要多线程执行,否则多个用户同时访问的时候,排队等候的时间会很长,甚至会出现超时错误。

我们可以用异步函数实现多线程,异步函数后面会有专门的章节介绍,目前我们只需大概了解其用法即可。

我们看看如何通过异步函数将上述代码改为多线程执行。

1、新建一个内部函数,函数名"ExcelWeb"(名称可以随意),代码为:

Dim e As RequestEventArgs = args(0)
e
.ResponseEncoding = "gb2312"
Select
Case e.Path
    Case  "Reports\table1.htm"
        Dim app As New MSExcel.Application
        Dim wb As MSExcel.Workbook = app.WorkBooks.Open(ProjectPath & "Attachments\table.xlsx")
        'VBA
代码
        e.WriteExcelAsHTML(wb)
    Case  "Reports\table2.htm"
        Dim app As New MSExcel.Application
        Dim wb As MSExcel.Workbook = app.WorkBooks.Open(ProjectPath & "Attachments\table.xlsx")
        'VBA
代码
        e.WriteExcelAsPDF(wb)
    Case Else
        e.AsReportServer("Reports\")

End
Select
e
.Handled = True '通知系统异步函数执行完毕,可以关闭信道

2、将HttpRequest事件代码改为:

If e.Path.StartsWith("Reports\")
   
e.AsyncExecute = True  '通知系统异步执行,不要关闭信道
    Functions.AsyncExecute("ExcelWeb",e)

End
If


本页地址:http://www.foxtable.com/mobilehelp/topics/0291.htm