如何通过云端硬盘 API 上传将 Excel 文件格式转换为 G-Sheet


How to convert Excel File-Format to G-Sheet by Drive API upload?

我可以通过云端硬盘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时,它是一样的......加载预览时,当转换=true时,它会卡住。

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

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

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

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

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

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

我会接受赏金的任何答案,它提供了一种将多维数组转换为具有多个页面的 gSheet 的方法,以防(尚)无法通过驱动器 API 实现(当然这将是首选方式)。

这是一个 Google 云端硬盘 API 问题 - 只是没有可用的单个标签。

最快进的是将数组呈现到 Excel 2007,只需在桌面上安装 Google Drive 应用程序即可访问数据。电子表格 API 无法创建文档,需要使用文档 API 执行此操作;目前,PHP 的 API 包装器不支持这两个端点 - 像这样我也可以修改文件。及时努力:1小时。

更新:当我使用 Excel2007 渲染 XLSX 时,转换失败。当我使用 MS-Excel 和"另存为"打开同一个文件时 - 我甚至可以通过驱动器 API 转换它。

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

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

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

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

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

e) 关系 ID 似乎被移动了...代码中有一些+3计算??

问题是,生成的文件格式与驱动器 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文件从修补,其他一些文件会破坏。

您可以使用该应用程序或Google云端硬盘的SDK将Excel文档上传到Google云端硬盘,但我认为Google尚未提供任何转换文件的方法。

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

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

例如。

  • https://developers.google.com/google-apps/spreadsheets/#creating_a_spreadsheet
  • https://developers.google.com/google-apps/spreadsheets/#adding_a_worksheet
  • https://developers.google.com/google-apps/spreadsheets/#adding_a_list_row