exportar al clipboard para Excel

03/03/2005 - 10:17 por jose | Informe spam
Hola grupo !

Estoy realizando una aplicación y me gustaría exportar los datos de un
ListCtrl al clipboard para poder pegarlos en una hoja Excel. Hasta ahora
lo que he conseguido es exportar los datos como si fueran texto,
separando las columnas con un tabulador y las filas con un salto de línea
(el código al final del mensaje), pero este sistema tiene 2
inconvenientes, aunque el que me interesa resolver es sobre todo el
primero:
1) Formato de los datos: Los datos del ListCtrl pueden no ser de
tipo texto (bool, int, double, fecha.. ). Debido a la configuración
regional Excel, éste puede malinterpretar los datos, sobre todo en los
tipos double (por el separador decimal) y fechas (el orden de
día/mes/año)
2) Memoria: Los ListCtrl pueden contener miles de items. Para
ahorrar memoria utilizo en los ListCtrl "callback items". Para optimizar
el uso de memoria del portapapeles existe una opción similar a "callback
items" que es "DelayRenderData". Sólo cuando se realiza el "Paste" se
piden los datos que se necesitan.

He buscado por la web y no he encontrado información específica sobre
cómo insertar en el clipboard datos en formato Excel.

¿Alguien sabe de algún sitio dónde obtener información y/o ejemplos?

Un saludo y muchas gracias,

Jose

PD: Mi código para exportar al portapateles, por si le sirve a alguien

//-
void ExportarAlPortapapeles()
{
if( !OpenClipboard() ) return;
CString csClipboard;
if( !m_List.ObtenerDatosParaClipboard( csClipboard ) ) return;
EmptyClipboard();
HGLOBAL hClipboardData = GlobalAlloc( GMEM_DDESHARE,
csClipboard.GetLength() + 1 );
char *pchData = (char*)GlobalLock( hClipboardData );
strcpy( pchData, (LPCSTR)csClipboard );
GlobalUnlock( hClipboardData );
SetClipboardData( CF_TEXT, hClipboardData ); // Formato texto
CloseClipboard();
}

BOOL CMyListCtrl::ObtenerDatosParaClipboard( CString &csClipboard )
{
csClipboard = _T("");
int nItems = GetItemCount();
if( !nItems ) return FALSE;
for( int i = 0; i < nItems; i++ )
{
csClipboard += ObtenerDatosParaClipboard( int i );
}
return TRUE;
}

CString CMyListCtrl::ObtenerDatosParaClipboard( int nItem )
{
CString csRes;
for( int i = 0; i < m_nColumnas; i++ )
{
if( i != 0 ) csRes += '\t'; // Salto de columna
csRes += GetItemText( nItem, i );
}
csRes += _T(""); // Salto de fila
}
 

Leer las respuestas

#1 Rodrigo Corral [MVP]
07/03/2005 - 10:52 | Informe spam
Nunca he visto implementado lo que deseas sin que sea utilizando valores
separados por comas...

De todos modos la mejor manera de exportar datos a excel desde una
aplicación creo que es usar automatización.


Un saludo
Rodrigo Corral González [MVP]

FAQ de microsoft.public.es.vc++
http://rcorral.mvps.org

Preguntas similares