2010-06-21 80 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