2010-06-21 58 views
3

我正在爲一個較大的項目編寫一個測試應用程序,而且似乎無法從Windows剪貼板中檢索Unicode CSV數據,我成功地在檢索CF_UNICODETEXT時使用內置的GetClipboardData api調用,但是當我將Unicode CSV放在剪貼板上時MSExcel並嘗試以CSV格式進行檢索,我收到了錯誤的數據。這裏是一些代碼;如何檢索Unicode CSV剪貼板數據MS Windows XP?

procedure TForm1.Button7Click(Sender: TObject); 
var 
    hMem  : THandle; 
    dwLen : DWord; 
    ps1, ps2 : pChar; 
begin 
    OpenClipboard(form1.Handle); 
    RichEdit1.Lines.Clear; 
    try 
     if Clipboard.HasFormat(CF_UNICODETEXT) then 
     begin 
     hMem := GetClipboardData(CF_UNICODETEXT); 
     ps1 := GlobalLock(hMem); 
     dwLen := GlobalSize(hMem); 
     ps2 := StrAlloc(1 + dwLen); 
     StrLCopy(ps2, ps1, dwLen); 
     GlobalUnlock(hMem); 
     RichEdit1.Lines.Add(ps2); 
     end 
     else 
     ShowMessage('No CF_UNICODETEXT on Clipboard!'); 
    finally 
     CloseClipboard; 
    end; 
end; 

下面這段代碼應該CSV以及工作,但是當我改變我的剪貼板格式是什麼,我希望,應用程序不會得到正確的數據。知道我可以得到標籤式的Unicode就可以了,可能很重要,只是沒有他想要的CSV。

回答

4

CSV剪貼板格式Excel使用is ANSI encoded,而不是Unicode。

從傾倒的Excel 2007中的剪貼板,這都是Unicode啓用的是:

  • CF_UNICODETEXT
  • 「HTML格式」
  • 「RTF格式」
  • 「XML電子表格」

「XML Spreadsheet」和「HTML Format」都有明確定義的表/行,所以它們不應該太難以從中提取數據。

+0

但是,但是,但是,從剪貼板中獲取數據應該做的CF_TEXT和CF_UNICODETEXT之間的自動轉換。請參閱:http://msdn.microsoft.com/zh-cn/library/ms649013(VS.85).aspx中的合成剪貼板格式。但是可能發生的情況是,CF_UNICODETEXT從剪貼板中取出UTF-8而不是UTF-16LE?雖然看到Windows本身就是UTF-16LE,但會感到奇怪。 – 2010-06-21 18:26:38

+0

@Marjan:CF_UNICODE可以工作,但它是*製表符*分隔的,而不是逗號分隔的。 Excel在包含ANSI編碼CSV的剪貼板中包含第二種格式,這就是wfoster所要求的。他的問題實際上是:「這段代碼工作正常,但如果我用'RegisterClipboardFormat('CSV')''替換'CF_UNICODETEXT',則失敗。 – 2010-06-21 18:45:40

+0

明白了。感謝您的澄清 – 2010-06-21 19:09:07

1

您需要請求CF_CSV格式。在你將數據作爲CF_CSV獲得後,你可以把它當作一個AnsiString,然後轉換成一個UnicodeString,如果你願意的話。

下面的截圖顯示了從Excel2007複製的6個單元。我捕獲到ClipMate作爲CF_CSV,然後顯示與ClipMate的十六進制查看器。您會看到這些字段之間用逗號分隔(十六進制爲2C),由CRLF(x0Dx0A)終止。您在下面看到的是帶註釋的組合,顯示Excel,複製的區域以及ClipMate以十六進制字節呈現CF_CSV。 ​​

而且,有趣的閱讀在這個相關主題: Get CSV Data from Clipboard (pasted from Excel) that contains accented characters

+0

標準的剪貼板格式列在http://msdn.microsoft.com/en-us/library/ff729168%28VS.85%29.aspx,並且CSV不是一個他們,所以是的,你需要使用RegisterClipboardFormat。由於這個問題特別是關於剪貼板上的Unicode數據,所以說他可以從ANSI轉換也沒有什麼幫助。 – 2010-06-22 14:54:47

+0

在Windows.pas中沒有聲明CF_CSV格式 – wfoster 2010-06-22 16:01:36

+0

@wfoster,@Craig - oops!對於那個很抱歉。 CF_CSV確實需要註冊。但它就是這樣,它不會是Unicode。因此,您可以將它視爲Ansi,或者您可以從UnicodeText構建自己的CSV,並猜測cols應該打破的位置。 – 2010-06-22 17:14:08