2010-06-21 1 views
3

Я пишу тестовое приложение для более крупного проекта и, похоже, извлекаю данные CSV Unicode из буфера обмена Windows, мне удается получить 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, а не Юникод.

С демпинг 2007 буфер обмена Excel, те, которые разрешены Unicode являются:

  • CF_UNICODETEXT
  • "Формат HTML"
  • "Rich Text Format"
  • "XML Spreadsheet"

«XML-таблица» и «Формат HTML» имеют хорошо определенные таблицы/строки, поэтому их не должно быть слишком сложно извлечь данные.

+0

Но, но, но, получая данные из буфера обмена должен сделать автоматическое преобразование между CF_TEXT и CF_UNICODETEXT. См. Синтезированные форматы буфера обмена в http://msdn.microsoft.com/en-us/library/ms649013(VS.85).aspx. Но что может случиться, так это то, что CF_UNICODETEXT вытаскивает UTF-8 из буфера обмена вместо UTF-16LE? Было бы странно видеть, что Windows является UTF-16LE изначально. –

+0

@Marjan: CF_UNICODE работает, но он * tab * ограничен, не разделен запятой. Excel содержит второй формат в буфере обмена, который является CSV с кодировкой ANSI, и об этом спрашивает wfoster. Его вопрос на самом деле: «Этот код работает правильно, но не работает, если я заменю' CF_UNICODETEXT' на 'RegisterClipboardFormat ('CSV')'. –

+0

Получил это. Спасибо за разъяснение –

1

Необходимо запросить формат CF_CSV. ПОСЛЕ того, как вы получите данные как CF_CSV, вы можете рассматривать его как AnsiString, а затем, если хотите, преобразовать в UnicodeString.

Вот скриншот, показывающий 6 ячеек, скопированных из Excel2007. Я попал в ClipMate как CF_CSV, а затем отобразился с помощью шестнадцатеричного просмотра ClipMate. Вы увидите, что поля разделяются запятыми (hex 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

+0

Стандартные форматы буфера обмена перечислены на http://msdn.microsoft.com/en-us/library/ff729168%28VS.85%29.aspx, а CSV - не один из них, так что да, вам нужно использовать RegisterClipboardFormat. Поскольку вопрос касался только данных Unicode в буфере обмена, говоря, что он может конвертировать из ANSI, это тоже не полезно. –

+0

Нет формата CF_CSV, объявленного в Windows.pas – wfoster

+0

@wfoster, @Craig - oops! Извини за это. CF_CSV необходимо зарегистрировать.Но это то, что есть, и это не будет Unicode. Таким образом, вы можете рассматривать его как Ansi, или вы можете создать свой собственный CSV из UnicodeText и угадать, где колоссы должны сломаться. –

 Смежные вопросы

  • Нет связанных вопросов^_^