Windows剪貼板無法複製超大Excel數據?問題與超時設置有關
伴隨Windows 發展已超25 年的Raymond Chen,剛剛在一篇《The Old New Thing》開發者博客中調侃了系統剪貼板(clipboard)存在的所謂“最大數據限制”Bug 。他以行數30 萬+的一份大型電子表格文件為例,當用戶打開後選中了所有行、並將之複製到剪貼板後,就會在粘貼至另一應用程序時遇到問題。
假設這個應用程序使用了GetClipboardData 函數,以檢索富文本格式的數據。那你就會遺憾地發現—— 函數竟然返回了空值(NULL)。
許多人或許會猜測,該問題或與剪貼板的數據上限有關。
然而Raymond Chen 指出,事情並非如此。
剪貼板未預設可提取數據的最大值,其內容僅受可用內存和地址空間的限制。
為避免GetClipboardData 調用失敗,主要有兩種替代方案—— 一種是將數據直接放到剪貼板,另一種就聲明擁有特定類型的數據、而不直接將它放到剪貼板上。
對於很少被使用、或生成資源耗費過高的數據格式時,常見優化方案是利用剪貼板的延遲渲染(delay-rendered)。
然後在被詢問數據的格式時,數據源的使用者會收到一條WM_RENDERFORMAT 消息—— 某人想調用該數據,你是否選擇即時生成?
Raymon Chen解釋稱:
Excel 本身無法以富文本格式運行,其放置在剪貼板上的此類數據,都是延遲渲染得來的。
然後當另一個程序要求提供富文本格式數據時,Excel 會給出這樣的回應—— 哦,好的,請稍等,我這就幫你去拿。
據悉,富文本並不是數據表的最佳格式,因為它主要是為了文本而設計的。即使可以搞定簡單的表格,但更複雜的任務就跑不順了。
當系統要求剪貼板的所有者呈現數據時,它會發送消息並等待最多30 秒返回。
若未能在30 秒內生成數據,則係統會放棄請求、並導致GetClipboardData 返回NULL 空值。
本例的問題,在於原表實在太大,導致Excel 需要超過30 秒才能生成富文本格式表。後續開發團隊會設想通過特殊手段,來延長此類處理的等待時間。