2012-08-16 36 views
8

puedo cargar y convertir archivos CSV mediante API Drive sin ningún problema, pero al enviar XLS (renderizado con PEAR XLS-escritor) o XLSX (renderizado con PHPExcel) de la API de Drive se queja: Tipo¿Cómo convertir el formato de archivo Excel a G-Sheet mediante la carga de Drive API?

"Error calling POST https://www.googleapis.com/upload/drive/v2/files?convert=true&uploadType=multipart&key=123: (500) Internal Error" 

MIME "application/vnd.ms-excel" aparentemente funciona mejor que "application/vnd-excel"

Cuando escribo XLSX con tipo de contenido "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" es bastante parecido ... se queda atascado al cargar la vista previa, cuando convert = true.

Al crear archivos con MS Excel y cargarlos manualmente funciona bien.

Puedo insertar/actualizar, descargar/abrir los archivos (todo bien) - pero quiero convertirlos.

Con todas las pruebas realizadas supongo que el problema está relacionado con el formato de archivo creado, o tipo MIME.

Alguna pista por qué la conversión puede fallar ...

"¿Alguna vez alguien se las arregló para convertir XLS prestado/XLSX?"

La pregunta es básicamente: ¿Cuál es el formato de archivo esperado + tipo MIME para convertir a gSheet?

Acepto cualquier respuesta para el bounty, que proporciona una forma de convertir una matriz multidimensional a gSheet con varias páginas, en caso de que no sea (todavía) posible a través de la API de Drive (seguro que sería el forma preferida).

Esta es una pregunta Google Drive API - simplemente no hay una etiqueta individual para esta disponible.

+0

Algunas aclaraciones: - 1. ¿Está diciendo que exactamente el mismo archivo puede cargarse/convertirse a través de la interfaz web, pero falla 50 a través de API? Si es así, verifique que su codificación Base64 sea correcta. 2. Puede cargar sin conversión. ¿Qué ocurre si intentas "convertir a documentos de Google" en la interfaz web? – pinoyyid

+0

si subo por navegador web con conversión, funciona, la conversión de archivos que se han guardado a través de la API no se convertirá (la barra de progreso se bloquea); Estoy usando el contenedor google-api para PHP. –

Respuesta

1

más avance rápido era hacer matriz para Excel 2007 y sólo tiene que instalar la aplicación Google Drive en los ordenadores de sobremesa para acceder a los datos. La API de hojas de cálculo no puede crear documentos, necesita hacer eso con la API de Documentos; Actualmente, el contenedor de API para PHP no es compatible con estos dos extremos: así también puedo revisar los archivos. Esfuerzo oportuno: 1h.

Actualización: Cuando renderizo XLSX con Excel2007 la conversión falla.Cuando abro el mismo archivo con MS-Excel y "Guardar como", puedo convertirlo incluso a través de la API de Drive.

me di cuenta de algunas cosas cuando descomprimir los archivos y comparación:

a) utiliza MS-Excel valores '0/1' en lugar de 'verdadero/falso'

b) xl directorio'/ hojas de trabajo/_rels 'eliminado (¿tal vez inútil?).

c) Las terminaciones de línea de los XML se convirtieron de UNIX a DOS.

d) MS-Excel agregó todas las celdas vacías al XML, que PHPExcel no escribió.

e) los ID de relación parecen estar desplazados ... ¿hay algún cálculo de +3 en el código?

El problema es que el formato de archivo generado no concuerda con el analizador XML de la API de Drive.

Todavía no estoy exactamente seguro de lo que está mal con el archivo de formato generado, pero parchear el archivo XLSX rendido con archivos XML de forma nativa creados por MS-Excel hace que funcione:

/* how-to patch the generated XLSX: */ 

$zip = new ZipArchive(); 
$zip->open($xlsx_path); 
$zip->extractTo($export_dir.'temp'); 
$zip->close(); 

$this->deleteDir($export_dir.'temp/xl/worksheets/_rels'); 

$files =array(
    '_rels/.rels', 
    'docProps/app.xml', 
    'docProps/core.xml', 
    'xl/workbook.xml', 
    'xl/_rels/workbook.xml.rels', 
    'xl/theme/theme1.xml' 
); 
foreach($files as $file){ 
    copy($export_dir.'template/'.$file, $export_dir.'temp/'.$file); 
} 

unlink($xlsx_path); 

if($zip->open($xlsx_path, ZIPARCHIVE::CREATE)) { 
$source = str_replace('\\', '/', realpath($export_dir.'temp')); 
if(is_dir($source) === true) { 
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST); 
    foreach ($files as $file) { 
     $file = str_replace('\\', '/', $file); 
     if(in_array(substr($file, strrpos($file, '/')+1), array('.', '..'))){continue;} 
     $file = realpath($file); 
     if(is_dir($file) === true){$zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));} 
     else if(is_file($file) === true){ 
       $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file)); 
      } 
     } 
    } 
    else if(is_file($source) === true) { 
     $zip->addFromString(basename($source), file_get_contents($source)); 
    } 
    $zip->close(); 
} 

La célula el formateo no es muy correcto, pero la vista previa de conversión & está funcionando.

Incluso puede omitir algunos archivos XML de parches, algunos otros lo rompen.

+0

Recientemente participé en una encuesta y aproveché la oportunidad para señalar algunos de los problemas que enfrenté; es de esperar que agreguen un poco más de error de validación de archivos hablando que solo HTTP500. –

+0

Actualización: las versiones reales de PHPExcel en combinación con Drive API se convierten en gSheet sin el requisito de corregir el paquete de Excel (al menos para mí). Me alegro de que lo arreglaron (sin saber quién era). –

0

Puede cargar sus documentos de Excel en Google Drive usando la aplicación o el SDK de Google Drive, pero no creo que Google proporcione ningún tipo de forma de convertir los archivos todavía.

¿Valdría la pena sugerir la conversión de archivos al equipo de Google? Nunca he visto una necesidad personal, ya que Excel funciona bien.

+0

Mi intención es obtener una vista previa de varias páginas dentro de un navegador web ... y CSV solo admite una dimensión. Su aplicación web lo admite, pero realmente no está seguro de la API, ya que la respuesta HTTP500 podría ser cualquier cosa. La aplicación de escritorio o SDK no son una opción: solo hay Drive API disponible en un entorno web. –

+0

¿No podría convertir CSV a XLS/XLSX y cargarlo en Google Drive para obtener una vista previa de varias páginas? – Jamesking56

+0

O (como un enfoque completamente diferente) si buscas una vista previa de varias páginas, podrías intentar usar PHP para convertir el archivo CSV en PDF ... – Jamesking56

0

En la última parte con enfoques alternativos, puede usar la API de hoja de cálculo para escribir directamente en la hoja de cálculo https://developers.google.com/google-apps/spreadsheets/. Esto puede darle un efecto secundario beneficioso de actualizaciones incrementales.

Por ejemplo.

+0

También puedo crear varias revisiones sobre la API de Drive ... Pero este es probablemente el menor esfuerzo para insertar esa matriz multidimensional - cada hipervínculo por anidación de bucle :) - una vez que tengo una gSheet, que puede exportarse para sobresalir. Aceptaré esta respuesta, si puedo insertar hojas/filas sobre el contenedor google-api. Tengo cURL instalado también, creo. –

+0

Si puedo insertar y convertir con https://developers.google.com/google-apps/documents-list/ API de lista de documentos, esto sería más adecuado que escribir fila por fila. Hoy probaremos lo que está accesible y funcionando. –

Cuestiones relacionadas