Как конвертировать формат файла Excel в G-Sheet с помощью загрузки API диска?

Я могу загружать и конвертировать CSV-файлы с помощью Drive API без каких-либо проблем, но при отправке XLS (визуализируется с помощью PEAR XLS-Writer) или XLSX (визуализируется с помощью PHPExcel) 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", по-видимому, работает лучше, чем"application/vnd-excel"

когда я пишу XLSX с типом контента " application / vnd.openxmlformats-officedocument.spreadsheetml.- это одно и то же ... он застревает при загрузке предварительного просмотра, когда convert=true.

при создании файлов с MS Excel и загрузка их вручную он работает нормально.

Я могу вставлять/обновлять, загружать / открывать файлы (все в порядке) - но я хочу их конвертировать.

со всеми выполненными тестами я предполагаю, что проблема связана с созданным форматом файла или типом MIME.

любые подсказки, почему преобразование может завершиться неудачей...

" когда-нибудь кому-то удавалось конвертировать визуализированные XLS/XLSX?"

в вопрос в основном: каков ожидаемый формат файла + MIME-тип для преобразования в gSheet?

Я бы принял любой ответ за щедрость, который обеспечивает способ преобразования многомерного массива в gSheet с несколькими страницами, в случае, если это (пока) невозможно через API диска (наверняка, это был бы предпочтительный способ).

Это Google Drive API вопрос - для этого нет отдельного тега.

3 ответов


наиболее быстрой перемоткой была визуализация массива в Excel 2007 и просто установка приложения Google Drive на рабочие столы для доступа к данным. API электронных таблиц не может создавать документы, это необходимо сделать с помощью API Docs; в настоящее время оболочка API для PHP не поддерживает обе эти конечные точки - например, я могу также пересмотреть файлы. Своевременное усилие: 1h.

Update: при рендеринге XLSX с Excel2007 преобразование завершается неудачно. Когда я открываю тот же файл с MS-Excel и "сохранить как" - я могу преобразуйте его даже через API диска.

Я заметил некоторые вещи при распаковке файлов и сравнил:

a) MS-Excel использует значения " 0/1 "вместо" false / true"

b) каталог "xl / worksheets / _rels" удален (может быть, бесполезен?).

c) окончания строк XMLs были преобразованы из UNIX в DOS.

d) MS-Excel добавил все пустые ячейки в XML, которые PHPExcel не записал.

e) идентификаторы отношений быть смещенным ... там какой-то +3 расчет в коде??

проблема в том, что сгенерированный формат файла не соответствует XML-синтаксическому анализатору API диска.

Я все еще не совсем уверен, что не так с сгенерированным форматом файла, но исправление визуализированного XLSX-файла с XML-файлами, созданными MS-Excel, заставляет его работать:

/* 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();
}

форматирование ячейки не слишком правильное, но преобразование и предварительный просмотр работают.

можно даже пропустить некоторые XML-файлы от латать, некоторые другие делают его сломать.


вы можете загрузить свои документы Excel на Google Диск с помощью приложения или SDK Google Диска, но я не думаю, что Google предоставляет какой-либо способ конвертировать файлы еще.

может быть, стоит предложить преобразование файлов в команду Google? Я никогда не видел необходимости в этом лично, как Excel работает нормально.


в последней части альтернативных подходов вы можете просто использовать API электронной таблицы для записи непосредственно в электронную таблицу https://developers.google.com/google-apps/spreadsheets/. Это может дать вам полезный побочный эффект инкрементных обновлений.

например.