我正在为一个更大的项目编写一个测试应用程序,似乎无法从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。
答案 0 :(得分:4)
CSV剪贴板格式Excel使用is ANSI encoded,而非Unicode。
从转储Excel 2007剪贴板,启用Unicode的剪贴板是:
“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