Запрос на загрузку для xls в asp загружает страницу в excel вместо данных - PullRequest
0 голосов
/ 10 февраля 2012

Я пытаюсь настроить страницу, которая загружает таблицу SQL и дает пользователю приглашение сохранить ее в Excel. Это будет использовано в ужасной вещи под названием IE7.

Проблема в том, что вместо загрузки файла, который, как я знаю, существует, он генерирует страницу asp в файл xls и называет его «DataManager.xls». Поэтому, если я открою это, я получу строку заголовка страницы asp, и если я пропущу резонанс. Конец, я получу тело страницы и нижний колонтитул. Но все мои исследования говорят, что этот код должен загружать существующий файл, а не создавать его.

Ни одна из моих трассировщиков response.write не работает. Но strSQL работает правильно, потому что он генерирует файл.

        dim strSQL

    if(Request.QueryString("submitbutton") = "Download") then
        dim fn
        dim FPath
        strSQL = "EXECute [TABLE2EXCEL] 'S007\SQLSRV','" & UCase(request.QueryString("SelTABLE")) & "','" & UCase(request.QueryString("SelTABLE")) & "','" & Replace(Request.ServerVariables("LOGON_USER"),"CORP\","") & "'"
        fn = cnt.execute(strSQL)

        response.write strSQL
        response.write fn
        response.write FPath

         Response.ContentType = "application/vnd.ms-excel" ' arbitrary 
        FPath = fn 
        Response.AddHeader "Content-Disposition","attachment; filename=ASSOCIATEROSTERFeb102012909AMNBKMZEJ.xls" '& fn 

        Set adoStream = CreateObject("ADODB.Connection") 
        adoStream.Open() 
        adoStream.Type = 2
        adoStream.LoadFromFile("\\s007\folder\DataFactory\ASSOCIATEROSTERFeb102012909AMNBKMZEJ.xls")'(FPath) 
        Response.BinaryWrite adoStream.Read() 
        adoStream.Close 
        Set adoStream = Nothing 
Response.End 
end if

А для полноты данных вот мой SQL-код:

ALTER procedure [dbo].[TABLE2EXCEL]
(
    @db_name    varchar(100),
    @table_name varchar(100),   
    @file_name  varchar(100),
    @NBK    varchar(10)
)
as

--Generate column names as a recordset
declare @columns varchar(8000), @sql varchar(8000), @data_file varchar(100)

select 
    @columns=coalesce(@columns+',','')+column_name+' as '+column_name 
from 
    information_schema.columns
where 
    table_name=@table_name
select @columns=''''''+replace(replace(@columns,' as ',''''' as '),',',',''''')

declare @TimeStamp varchar(50)
SELECT @TimeStamp = Replace(Replace(CAST(CONVERT(datetime,getdate())as varchar),':',''),' ','') + @NBK

print @TimeStamp

--Set folder for output file
set @file_name = '\\s007\folder\DataFactory\' + @file_name + @TimeStamp + '.xls'

--Create a dummy file to have actual data
select @data_file='\\s007\folder\DataFactory\data_fildat' + @TimeStamp + '.xls'--substring(@file_name,1,len(@file_name)-charindex('\',reverse(@file_name)))+'\data_filez.xls'
print @data_file
--Generate column names in the passed EXCEL file
set @sql='exec master..xp_cmdshell ''bcp " select * from (select '+@columns+') as t" queryout "'+@file_name+'" -c -S S007\SQLSRV -U userlogin -P passwordisbestpassword -k'''
exec(@sql)

--Generate data in the dummy file
set @sql='exec master..xp_cmdshell ''bcp " select * from '+@table_name+'" queryout "'+@data_file+'" -c  -S S007\SQLSRV -U userlogin -P passwordisbestpassword -k'''

exec(@sql)
PRINT @sql 
PRINT @data_file 

--Copy dummy file to passed EXCEL file
set @sql= 'exec master..xp_cmdshell ''type "'+@data_file+'" >> "'+@file_name+'"'''
exec(@sql)

--Delete dummy file 
set @sql= 'exec master..xp_cmdshell ''del '+@data_file+''''
exec(@sql)


return @file_name

1 Ответ

0 голосов
/ 10 февраля 2012

Обычно это делается путем генерации обычной таблицы HTML с данными в ней и отправки MIME-типа Excel.

Response.ContentType = "application/vnd.ms-excel"

(затем вывести таблицу HTML)

См. Этот вопрос для примера: Ошибка экспорта данных в файл Excel из Classic ASP

...