Pergunta

O que eu estou tentando fazer

  • Meu aplicativo gera alguns dados tabulares
  • Eu quero que o usuário seja capaz de lançar Excel e clique em "colar" para colocar os dados como células no Excel
  • Windows aceita um formato chamado "CommaSeparatedValue" que é usado com ele é APIs de modo que este parece possível
  • Colocar texto puro sobre as obras da área de transferência, mas tentando usar este formato não
  • NOTA:. I pode recuperar corretamente os dados CSV da área de transferência, o meu problema é sobre colando dados CSV para a área de transferência

O que eu tentei que não está funcionando

Clipboard.SetText ()

System.Windows.Forms.Clipboard.SetText(  
  "1,2,3,4\n5,6,7,8", 
  System.Windows.Forms.TextDataFormat.CommaSeparatedValue
  );

Clipboard.SetData ()

System.Windows.Forms.Clipboard.SetData(
  System.Windows.Forms.DataFormats.CommaSeparatedValue,
  "1,2,3,4\n5,6,7,8", 
  );

Em ambos os casos algo é colocado na área de transferência, mas quando colado no Excel aparece como uma célula de texto garbarge: "-§žý; pC|yVk²û"

Update 1: Solução usando SetText ()

resposta mostras de Como BFree SetText com TextDataFormat serve como uma solução

System.Windows.Forms.Clipboard.SetText(  
  "1\t2\t3\t4\n5\t6\t7\t8", 
  System.Windows.Forms.TextDataFormat.Text
  );

Eu tentei isso e confirme que agora colar em Excel e Word funciona corretamente. Em cada caso, ele cola como uma tabela com células em vez de texto simples.

Ainda curioso porque CommaSeparatedValue é não trabalho.

Foi útil?

Solução

O .NET Framework coloca DataFormats.CommaSeparatedValue na área de transferência como texto Unicode. Mas como mencionado em http://www.syncfusion.com/faq/windowsforms/faq_c98c aspx # q899q , Excel espera que os dados CSV para ser um UTF-8 fluxo de memória (é difícil dizer se .NET ou Excel é a culpa para a incompatibilidade).

A solução que eu vim acima com em meu próprio aplicativo é colocar duas versões dos dados tabulares na área de transferência simultaneamente como texto delimitado por tabulação e como um fluxo de memória CSV. Isso permite que o aplicativo de destino para adquirir os dados em seu formato preferido. Bloco de notas e Excel preferem o texto delimitado por tabulação, mas você pode forçar Excel para pegar os dados CSV através do ... comando Colar especial para fins de teste.

Aqui está um exemplo de código (note que WinForms equivalentes dos namespaces WPF são usados ??aqui):

// Generate both tab-delimited and CSV strings.
string tabbedText = //...
string csvText = //...

// Create the container object that will hold both versions of the data.
var dataObject = new System.Windows.DataObject();

// Add tab-delimited text to the container object as is.
dataObject.SetText(tabbedText);

// Convert the CSV text to a UTF-8 byte stream before adding it to the container object.
var bytes = System.Text.Encoding.UTF8.GetBytes(csvText);
var stream = new System.IO.MemoryStream(bytes);
dataObject.SetData(System.Windows.DataFormats.CommaSeparatedValue, stream);

// Copy the container object to the clipboard.
System.Windows.Clipboard.SetDataObject(dataObject, true);

Outras dicas

Use guias em vez de vírgulas. ou seja:

Clipboard.SetText("1\t2\t3\t4\t3\t2\t3\t4", TextDataFormat.Text);

Apenas testado isso mesmo, e funcionou para mim.

Eu tive sucesso colar em Excel usando \ t (ver resposta de BFree) como separadores de coluna e \ n como separadores de linha.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top