台灣最大程式設計社群網站
線上人數
1024
 
會員總數:245968
討論主題:189548
歡迎您免費加入會員
討論區列表 >> ASP >> 加上onbeforeunload後,匯出的Excel檔變成無法打開?
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
加上onbeforeunload後,匯出的Excel檔變成無法打開?
價值 : 60 QP  點閱數:208 回應數:12
樓主

阿山
初學者
316 31
1052 145
發送站內信

各位前輩好,請幫幫小弟,這程式原本快完成了,卻卡在這個地方。

這個程式主要是抓取資料後匯出Excel檔,然後顯示下載連結提供下載,按下網頁中的關閉按鈕會刪除SERVER上的Excel檔並關閉,但考量到使用者可能按下右上角的叉叉,所以在body加上onbeforeunload去觸發按下右上角叉叉後,也要刪除匯出的Excel檔。

但問題來了,加上onbeforeunload後,匯出的excel就無法打開了,

且匯出的網頁還會顯示錯誤訊息


程式碼如下:


請問這問題該怎麼解決呢?或者是有其他建議的方法,我也可以修改,拜託各位前輩大大了,感激不盡!

搜尋相關Tags的文章: [ excel ] , [ 資料匯出 ] , [ onbeforeunload ] , [ 關閉視窗 ] ,
本篇文章發表於2020-07-03 18:24
1樓
回應

香帥
檢舉此回應
匯出之後,client端就收到資料,要不要打開,與server沒關係,
若有三個人下載,打不開的原因可能
第一個人可能沒裝excel軟體,可能就打不開
第二個人可能下載一半就中斷,可能就打不開
第三個人可能......,可能就打不開。(例如防毒軟體...記憶體不夠....)
再來談到server端
您若用同一個pc下載,(client與server同台電腦),當您下載後儲存在同一位置,
您關掉視窗後server刪除該檔案,再來打開該檔案,因已被刪除就打不開。
建議您server刪除檔案,不必馬上刪除,避免第2個人要重新下載,還要重新等待資料庫與excel間的操作(若上萬筆的時候就還要等很久),
過一段時間後才以時間序,利用系統非巔峰時間去判斷哪些檔案已經過期可以刪除再去刪
本篇文章回覆於2020-07-04 14:35
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

老頑童
捐贈 VP 給 老頑童 檢舉此回應
當點擊「點我下載Excel檔」連結時,就會觸發onbeforeunload事件
所以Excel檔就被filedel.asp刪掉了
接下來當然開不了檔案

若不一定要馬上刪除的話
我會考慮在global.asa的Session_OnEnd事件去檢查檔案在不在,在的話再做刪除動作
本篇文章回覆於2020-07-07 09:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

阿山
檢舉此回應
回香帥大:

關於你說的"匯出之後,client端就收到資料",我猜應該是如下語法:

但是這個做法有缺點,有時候直接開啟會打不開且出現錯誤,要下載儲存檔案才可以打開,

可以打開後又會先出現警告訊息,才可以打開

然後又會有開啟慢且檔案大的問題,所以才會使用Excel.Application的方式,來解決上述的問題。

"避免第2個人要重新下載,還要重新等待資料庫與excel間的操作"
意思是說要判斷檔名是否存在,存在就跳過資料庫查詢那段,直接顯示下載連結?
因為都是以日期條件查詢,所以判斷檔案是否存在感覺可行。

"過一段時間後才以時間序,利用系統非巔峰時間去判斷哪些檔案已經過期可以刪除再去刪"
這段好抽象,請問有範例可以參考嗎? 感覺起來好像要另外設計一個刪除檔案程式,然後排程非巔峰時間去刪除檔案
只是這樣會變多個排程工作外,這隻刪除程式會時常需要新增刪除語法,以便刪除不同路徑所產生的Excel檔。

謝謝!
本篇文章回覆於2020-07-08 17:15
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

阿山
檢舉此回應
回老頑童大

原來是點了連結,就會觸發onbeforeunload事件
檔案正在下載,又被刪除,所以檔案就錯亂了啊啊啊!

那我的理解是在匯出檔案後,先將路徑存成session變數,然後在global.asa的Session_OnEnd事件,
去判斷session中的檔案是否存在,存在就刪除檔案,這樣是否正確?

只是因為我們的ASP系統有很多模組,光現在這個模組的Excel匯出程式就有4~5隻
那不就需要在不同的匯出Excel程式,命名不同的session變數,
然後Session_OnEnd事件內,就要分很多行程式去判斷不同session變數的檔案是否存在?

思緒好亂啊~ 哭哭!

本篇文章回覆於2020-07-09 12:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

老頑童
捐贈 VP 給 老頑童 檢舉此回應
檔案太多就替每個Session用SessionID建一個資料夾
把該Session產生的Excel檔都放在該資料夾
Session_OnEnd時清空該資料夾就好,不用一個一個記
本篇文章回覆於2020-07-10 09:44
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

阿山
檢舉此回應
感謝老頑童的回覆!

但是這樣香帥大所說的"避免第2個人要重新下載,還要重新等待資料庫與excel間的操作"這個部分,是否就無法達成了呢?
也就是說其他使用者登入,就需要自己重新查詢資料,自己查詢的資料才能免重新查詢直接下載檔案?

謝謝!
本篇文章回覆於2020-07-10 11:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

老頑童
捐贈 VP 給 老頑童 檢舉此回應
這要看你資料共用性大不大來決定
若每個使用者查詢的條件都大同小異,當然可以考慮共用檔案
但要共用檔案,就要去記錄該Excel檔是在什麼查詢條件下產生的,這又是一份工
到底哪種合適,要依你的系統來評估了
若重覆性不高,產生Excel所花的時間也不長,其實可以不用考慮共用檔案的問題
本篇文章回覆於2020-07-10 11:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
作者回應

阿山
檢舉此回應
其實我也不知道算不算有共通性,但條件不多就是了,如下:





若是要共通檔案,不同使用者的情況下,程式又該如何設計呢?

謝謝!
本篇文章回覆於2020-07-10 17:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

老頑童
捐贈 VP 給 老頑童 檢舉此回應
這種情況我不會考慮共用檔案
畢竟光日期區間的組合就不知道有多少種
再加上結帳金額,重覆性應該不高
除非產生一個Excel要跑很久

真要做的話,最簡單的就依照查詢條件去命名Excel檔
例:20200701_20200710_勞務明細表.xlsx
然後去檢查該檔案存不存在,存在就捉舊檔,不存在再去產生Excel
本篇文章回覆於2020-07-10 17:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

阿山
檢舉此回應
好的,我修改程式看看,有問題我在上來發問,非常感謝老頑童大協助。

本篇文章回覆於2020-07-10 17:56
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

阿山
檢舉此回應
老頑童大,求救求救

login.asp


Global.asa



這樣並不會成功建立使用者工號的資料夾,但若是使用

則會成功建立test資料夾,請問該如何在登入後可以建立使用者資料夾呢?


謝謝!
本篇文章回覆於2020-07-22 14:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

老頑童
捐贈 VP 給 老頑童 檢舉此回應
Session_OnStart是在Session創立時觸發
此時session("EMPLOYEECODE") 一定還沒有值

建議在儲存檔案時再去創建資料夾即可
不然若使用者根本沒有要下載檔案,這些資料夾就白建了

另,Application是所有人共用的
將路徑存在Application可能要考慮互相覆蓋的問題
本篇文章回覆於2020-07-23 10:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.