不知道你有沒有注意,如果你從IE複製表格式資料到MS Word,會顯得很慢,但是表格的格式和樣式都會儲存下來,但是在別的瀏覽器,比如Firefox,Opera等複製表格式資料到MS Word,則會快很多,效果和複製到記事本是一樣的。難道是因為不同的複製來源(不同的瀏覽器),使得在剪貼簿的資料不一樣嗎?
先看一下,從IE複製到Word(2003和2007效果是差不多的,就不了)裡的效果:
如果從Firefox、Opera複製到Word,效果如(上面一段是從Opera,下面那一段是從Firefox複製的):
在運行裡輸入"clipbrd.exe",查看剪貼簿(沒有?在這裡可以下載>)上的內容(上面的是IE,下面的是Firefox,有“略微的區別”):
複製資料時,注意到word的狀態列提示“串連伺服器”的字樣,於是拿出Wireshark,抓包分析了一下,果然(注意第四項,word發送了一個Http Get請求,請求的內容恰好是該網頁的css檔案,"HTTP GET /inc/ftp.css HTTP/1.1”):
顯然,如果是表格式資料的話,CSS一定定義了樣式,於是Word自己拿了過來並解析,將表格樣式顯示了出來,而從別的瀏覽器粘貼時,卻沒有這一步,自然就沒有樣式了。
上面說到,複製到剪貼簿上的資料也“略微的差別”,的確是這種差別導致了,粘貼到word時產生的不同行為。Windows中剪貼簿有兩種,一種是Windows標準剪貼簿,一種是Ole(Object Linking and Embedding,對象連結和嵌入)剪貼簿,但實際上,標準剪貼簿的API介面雖然沒變,但是內部實現實際上已經使用Ole資料轉送機制來實現了。Ole支援UDT(Uniform Data Transfer,統一資料轉送),並可以通過拖放操作實現剪貼簿的剪下、複製和粘貼等操作。OLE剪貼簿除了擁有標準Windows剪貼簿的效能外,還支援傳輸使用者自訂的剪貼簿格式,並能夠在傳輸資料時綁定OLE格式(如字型、字型大小等)。
所以從IE複製資料時,使用的是Ole剪貼簿,綁定了Ole格式,而格式的來源又是在網路上的css檔案,所以word才會去擷取這個css檔案。微軟的word、excel、ie等都可以被稱作OLE文檔包容器,粘貼時自然能夠識別到Ole格式的資料。而別的瀏覽器複製的時候並沒有這種Ole格式,自然粘貼時只是純文字了。如果是Ole格式的資料,但是粘貼時不時Ole容器,比如記事本,就會當作普通的文本複製。這就是為什麼有人喜歡先把網頁上的內容先粘貼到記事本,清楚掉格式,然後再複製到Word中的原因。
如果想瞭解更多關於:OLE(對象串連和嵌入),UDT(統一資料轉送)可以參考《COM本質論》、《Visual C++技術內幕》 。
如何使用Ole剪貼簿進行編程可以參考MSDN:
http://msdn.microsoft.com/en-us/library/6www2be1(VS.80).aspx
http://support.microsoft.com/kb/83659/zh-cn