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