Как восстановить данные буфера обмена Unicode CSV MS Windows XP? - PullRequest
3 голосов
/ 21 июня 2010

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

4 голосов
/ 21 июня 2010

В формате буфера обмена CSV Excel использует в кодировке ANSI , а не в кодировке Unicode.

При выводе буфера обмена в Excel 2007 включается Unicode:

  • CF_UNICODETEXT
  • "Формат HTML"
  • "Расширенный формат текста"
  • "Электронная таблица XML"

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

1 голос
/ 22 июня 2010

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

Вот скриншот, показывающий 6 ячеек, скопированных из Excel2007. Я записал в ClipMate как CF_CSV, а затем отобразил с помощью шестнадцатеричной программы просмотра ClipMate. Вы увидите, что поля разделены запятыми (шестнадцатеричные 2C), оканчивающиеся на CRLF (x0Dx0A). То, что вы видите ниже, представляет собой аннотированный композит, показывающий Excel, скопированную область и ClipMate-рендеринг CF_CSV в виде шестнадцатеричных байтов. альтернативный текст http://www.thornsoft.com/images/support/excel_csv_2.png

Также интересно читать в этой теме: Получить данные CSV из буфера обмена (вставленные из Excel), содержащие символы с акцентом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...