以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  writebook测试问题  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=159912)

--  作者:hammerlucy
--  发布时间:2021/1/13 14:04:00
--  writebook测试问题
将EXCEL报表向前端输送的过程中,根据教材论,writebook最为合宜,省去了book.save的写硬盘时间及重名问题,但实际测试时,发现writebook输出报表,在前端无法弹出下载窗口。
--  作者:hammerlucy
--  发布时间:2021/1/13 14:08:00
--  
代码如下(部分交互参数可以进行替换):
\'同步执行函数,用于导出下载excel文件
\'必备参数1.e参数2.sql字符串
\'可选参数1.下载的表名tablename
\'----------通过创建查询表来生成table------------------
Dim e As RequestEventArgs = args(0)
Dim tb As new QueryBuilder
If e.Values.containskey("sql") Then  
    If e.Values.containskey("tablename") Then
        tb.TableName= e.Values("tablename")
    Else
        tb.TableName="导出数据"
    End If
    tb.ConnectionName= e.Cookies("con")
    tb.SelectString= e.Values("sql")
    tb.Build
    \'----------生成EXCEL表格文件------------------
    Dim tbl As Table = Tables(tb.TableName)
    Dim hdr As Integer = tbl.HeaderRows \'获得表头的层数
    Dim Book As New XLS.Book
    Dim Sheet As XLS.Sheet = Book.Sheets(0)
    tbl.CreateSheetHeader(Sheet,0,0,False) \'生成表头,且为多层模式
    \'填充数据
    For c As Integer = 0 To tbl.Cols.Count - 1
        For r As Integer = 0 To tbl.Rows.Count - 1
            sheet(r + hdr,c).value = tbl(r,c)
        Next
    Next
    book.PreBuild = False \'非报表模请将PreBuild 属性设置为False
    e.WriteBook(book,"download.xls",False)
    \'Book.Save("d:\\web\\file_download\\" & tb.TableName & ".xls") 
    \'e.WriteString("<a href=\'./file_download/" & tb.TableName & ".xls\'" & ">下载导出文件</a>")
End If


前端测试显示效果为(preview):
0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAEAAAAg........


--  作者:hammerlucy
--  发布时间:2021/1/13 14:10:00
--  
上述代码中,采用book.save方法测试是可行的,但弊端过多
--  作者:有点蓝
--  发布时间:2021/1/13 14:21:00
--  
我使用帮助的例子测试没有问题,请上传可以测试的例子说明


图片点击可在新窗口打开查看此主题相关图片如下:1.png
图片点击可在新窗口打开查看


--  作者:hammerlucy
--  发布时间:2021/1/13 22:14:00
--  
经多轮测试,只能以网址的形式请求writebook方能输出到前端,如http://127.0.0.1/excel_download?tablename=参数
现有限制:参数尽量少,避免超出url限制
而前端采用$.post("excel_downlod",{tablename:参数},function(){})这种方式,只能收到文件流(显示为一串乱码)
[此贴子已经被作者于2021/1/13 22:38:40编辑过]

--  作者:hammerlucy
--  发布时间:2021/1/13 23:03:00
--  
利用form采用post的方式提交,再用利用$(\'form\').form()的方式则可以完美解决传参动态生成EXCEL报表的问题