HOWTO: Add Custom Table to the Clipboard to be Pasted into Word

ID: Q216676


The information in this article applies to:


SUMMARY

This article shows how to place a custom table on the clipboard so that it is recognized by Microsoft Word as a table when pasting into a document.


MORE INFORMATION

When pasting text into a document, Microsoft Word does not recognize common table formats such as tab-delimited text and CSV (Comma Separated Values). However, it does recognize Rich Text Format (RTF). By building your custom table in RTF and adding it to the clipboard, you can then paste the information into Word as a properly formatted table.

The following code demonstrates how to add a table to the clipboard in both RTF and tab-delimited text so it can be pasted into Microsoft Word and/or Microsoft Excel:


// Open the clipboard...
if(!OpenClipboard()) {
   ::MessageBox(NULL, "Cannot open clipboard.", "Error", 0x10010);
   return;
}

// Get Clipboard format id for RTF.
UINT cf = RegisterClipboardFormat("Rich Text Format");

// Empty anything already there...
EmptyClipboard();

// *** This section of code adds the RTF table to the clipboard
// *** RTF-Data to put on clipboard
const char *text =
   "{\\rtf1\\par "
   "\\trowd \\trgaph30\\trleft-30\\trrh262\\cellx980\\cellx1991\\cellx3001"
   "\\intbl \\qr \\f0\\fs20 \\cf 1\\cell \\qr 2\\cell\\qr 3\\cell \\intbl \\row"
   "\\trowd \\trgaph30\\trleft-30\\trrh262\\cellx980\\cellx1991\\cellx3001"
   "\\intbl \\qr \\f0\\fs20 \\cf 4\\cell \\qr 5\\cell\\qr 6\\cell \\intbl \\row}";

// Allocate global memory for transfer...
HGLOBAL hText = GlobalAlloc(GMEM_MOVEABLE |GMEM_DDESHARE, strlen(text)+4);

// Put our string in the global memory...
char *ptr = (char *)GlobalLock(hText);
strcpy(ptr, text);
GlobalUnlock(hText);

// Put data on the clipboard!
::SetClipboardData(cf, hText);

// Free memory...
GlobalFree(hText);

// *** Now, add a version of the same data as tab-delimited text...
// *** This will be used by Microsoft Excel
char *text2 = "1\t2\t3\n4\t5\t6";

// Allocate global memory for transfer...
hText = GlobalAlloc(GMEM_MOVEABLE |GMEM_DDESHARE, strlen(text2)+4);

// Put our string in the global memory...
ptr = (char *)GlobalLock(hText);
strcpy(ptr, text2);
GlobalUnlock(hText);

// Put data on the clipboard as CF_TEXT
::SetClipboardData(CF_TEXT, hText);

// Free memory...
GlobalFree(hText);

// Close clipboard...
CloseClipboard(); 


REFERENCES

For more information on using RTF, please see the RTF specification in the MSDN under "Rich Text Format (RTF) Specification and Sample RTF Reader Program."

Please be aware that Microsoft does not provide technical support for the RTF reader code or the RTF specification. If you have trouble creating RTF syntax, you can always use Microsoft Word to create some examples for you. Just create a Microsoft Word document with the type of data you are interested in, save it as RTF and open it in Notepad.

© Microsoft Corporation 1999, All Rights Reserved.
Contributions by Joe Crump, Microsoft Corporation

Additional query words: html CF_DIF xltable


Keywords          : kbClipboard kbVC kbVC500 kbVC600 kbWord kbGrpDSO kbOffice2000 
Version           : :; WINDOWS:97; winnt:5.0,6.0
Platform          : WINDOWS winnt 
Issue type        : kbhowto 

Last Reviewed: June 1, 1999