如何通过Drive API上传将Excel文件格式转换为G-Sheet?

Mar*_*ler 10 php xlsx phpexcel google-drive-api

我可以通过Drive API上传和转换CSV文件,没有任何问题,但是当发送XLS(使用PEAR XLS-Writer呈现)或XLSX(使用PHPExcel呈现)时,Drive API会抱怨:

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

MIME类型"application/vnd.ms-excel"显然比"application/vnd-excel"更好用

当我用内容类型"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"写出XLSX时,它完全相同......当加载预览时,当转换= true时,它会卡住.

使用MS Excel创建文件并手动上传时,它可以正常工作.

我可以插入/更新,下载/打开文件(一切正常) - 但我想转换它们.

执行完所有测试后,我猜测问题与创建的文件格式或MIME类型有关.

有关转换可能失败的任何提示......

"有没有人设法转换渲染的XLS/XLSX?"

问题基本上是:为了转换为gSheet,预期的文件格式+ MIME类型是什么?

我接受了赏金的任何答案,它提供了一种方法,可以将多维数组转换为具有多个页面的gSheet,以防万一通过Drive API(可能是首选方式).

这是一个Google云端硬盘API问题 - 这里没有单独的标记.

Mar*_*ler 2

最快速的方法是将数组渲染到 Excel 2007,然后只需在桌面上安装 Google Drive 应用程序即可访问数据。Spreadsheets API 无法创建文档,需要使用 Docs API 来创建文档;目前 PHP 的 API 包装器不支持这两个端点 - 像这样我也可以修改文件。及时努力:1h。

\n\n

更新:当我使用 Excel2007 渲染 XLSX 时,转换失败。当我使用 MS-Excel 和“另存为”打开同一个文件时,我什至可以通过 Drive API 对其进行转换。

\n\n

我在解压文件并进行比较时注意到一些事情:

\n\n

a) MS-Excel 使用值“0/1”而不是“false/true”

\n\n

b) 目录“xl/worksheets/_rels”被删除(也许没用?)。

\n\n

c) XML\xc2\xb4s 的行尾从 UNIX 转换为 DOS。

\n\n

d) MS-Excel 将所有空单元格添加到 XML - PHPExcel 没有写出。

\n\n

e) 关系 ID 似乎发生了偏移...代码中存在一些 +3 计算?

\n\n

问题是,生成的文件格式与 Drive API 的 XML 解析器不匹配。

\n\n

我仍然不确定生成的文件格式有什么问题,但使用 MS-Excel 本机创建的 XML 文件修补渲染的 XLSX 文件使其可以工作:

\n\n
/* how-to patch the generated XLSX: */\n\n$zip = new ZipArchive();\n$zip->open($xlsx_path);\n$zip->extractTo($export_dir.\'temp\');\n$zip->close();\n\n$this->deleteDir($export_dir.\'temp/xl/worksheets/_rels\');\n\n$files =array(\n   \'_rels/.rels\',\n   \'docProps/app.xml\',\n   \'docProps/core.xml\',\n   \'xl/workbook.xml\',\n   \'xl/_rels/workbook.xml.rels\',\n   \'xl/theme/theme1.xml\'\n);\nforeach($files as $file){\n   copy($export_dir.\'template/\'.$file, $export_dir.\'temp/\'.$file);\n}\n\nunlink($xlsx_path);\n\nif($zip->open($xlsx_path, ZIPARCHIVE::CREATE)) {\n$source = str_replace(\'\\\\\', \'/\', realpath($export_dir.\'temp\'));\nif(is_dir($source) === true) {\n    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST);\n    foreach ($files as $file) {\n        $file = str_replace(\'\\\\\', \'/\', $file);\n        if(in_array(substr($file, strrpos($file, \'/\')+1), array(\'.\', \'..\')) ){continue;}\n        $file = realpath($file);\n        if(is_dir($file) === true){$zip->addEmptyDir(str_replace($source . \'/\', \'\', $file . \'/\'));}\n        else if(is_file($file) === true){\n              $zip->addFromString(str_replace($source . \'/\', \'\', $file), file_get_contents($file));\n           }\n        }\n    }\n    else if(is_file($source) === true) {\n       $zip->addFromString(basename($source), file_get_contents($source));\n    }\n    $zip->close();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

单元格格式不太正确 - 但转换和预览正常。

\n\n

甚至可以跳过一些 XML 文件来进行修补,而另一些文件则会使其损坏。

\n