如何检索Unicode CSV剪贴板数据MS Windows XP?

时间:2010-06-21 17:40:01

标签: delphi windows-xp clipboard

我正在为一个更大的项目编写一个测试应用程序,似乎无法从Windows剪贴板中检索Unicode CSV数据,我成功地使用内置的GetClipboardData api调用检索CF_UNICODETEXT,但是当我将Unicode CSV放在剪贴板上时在MSExcel中并尝试使用CSV格式检索,我得到了错误的数据。这是一些代码;

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。

2 个答案:

答案 0 :(得分:4)

CSV剪贴板格式Excel使用is ANSI encoded,而非Unicode。

从转储Excel 2007剪贴板,启用Unicode的剪贴板是:

  • CF_UNICODETEXT
  • “HTML格式”
  • “富文本格式”
  • “XML电子表格”

“XML Spreadsheet”和“HTML Format”都有明确定义的表/行,所以它们不应该太难以从中提取数据。

答案 1 :(得分:1)

您需要申请CF_CSV格式。在您将数据作为CF_CSV获取之后,您可以将其视为AnsiString,然后根据需要转换为UnicodeString。

以下是显示从Excel2007复制的6个单元格的屏幕截图。我作为CF_CSV捕获到ClipMate,然后与ClipMate的十六进制查看器一起显示。您将看到字段以逗号分隔(十六进制2C),由CRLF(x0Dx0A)终止。您在下面看到的是一个带注释的复合,显示Excel,复制的区域,以及ClipMate将CF_CSV渲染为十六进制字节。 alt text http://www.thornsoft.com/images/support/excel_csv_2.png

另外,在这个相关主题中有趣的阅读: Get CSV Data from Clipboard (pasted from Excel) that contains accented characters