10

我可以毫无问题地通过 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"

MIME 类型“application/vnd.ms-excel”显然比“application/vnd-excel”效果更好

当我用内容类型“application/vnd.openxmlformats-officedocument.spreadsheetml.sheet”写出 XLSX 时,情况完全一样……加载预览时,当 convert=true 时,它​​会卡住。

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

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

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

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

“有人设法转换渲染的 XLS/XLSX 吗?”

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

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

这是一个Google Drive API问题 - 没有可用的单独标签。

4

3 回答 3

2

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

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

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

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

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

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

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

e)关系ID似乎发生了变化......代码中有一些+3计算?

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

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

/* 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 文件,而另一些则使其中断。

于 2012-09-09T03:14:34.527 回答
0

您可以使用该应用程序或 Google Drive 的 SDK 将 Excel 文档上传到 Google Drive,但我认为 Google 还没有提供任何转换文件的方法。

可能值得向 Google 团队建议文件转换?我个人从未见过它需要它,因为 Excel 工作得很好。

于 2012-09-04T12:33:00.850 回答
0

在最后一部分替代方法中,您可以简单地使用电子表格 API 直接写入电子表格https://developers.google.com/google-apps/spreadsheets/。这可能会给您带来增量更新的有益副作用。

例如。

于 2012-09-05T02:18:48.590 回答