Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何通过驱动API上传将Excel文件格式转换为G-Sheet?_Php_Phpexcel_Xlsx_Google Drive Api - Fatal编程技术网

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

Php 如何通过驱动API上传将Excel文件格式转换为G-Sheet?,php,phpexcel,xlsx,google-drive-api,Php,Phpexcel,Xlsx,Google Drive Api,我可以通过驱动API上传和转换CSV文件,没有任何问题, 但在发送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

我可以通过驱动API上传和转换CSV文件,没有任何问题, 但在发送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”工作得更好

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

使用MS Excel创建文件并手动上载时,效果良好

我可以插入/更新、下载/打开文件(都可以),但我想转换它们

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

任何转换可能失败的提示

“是否有人成功转换渲染的XLS/XLSX?”

问题基本上是:转换为gSheet所需的文件格式+MIME类型是什么

我愿意接受任何关于赏金的回答,赏金提供了一种将多维数组转换为具有多个页面的gSheet的方法,以防(目前)无法通过驱动API实现(当然这是首选方法)


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

您可以使用应用程序或Google Drive的SDK将Excel文档上载到Google Drive,但我认为Google尚未提供任何转换文件的方法


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

在最后一部分,关于替代方法,您可以简单地使用电子表格API直接写入电子表格。这可能会给您带来增量更新的有益副作用

例如


最快的方法是将数组渲染到Excel 2007,然后在桌面上安装Google Drive应用程序以访问数据。电子表格API不能创建文档,需要使用Docs 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文件,另一些则使其中断。

我的目的是在web浏览器中获得多页预览。。。CSV只支持一个维度。他们的web应用程序支持它,但确实不确定API,因为HTTP500响应可能是任何东西。桌面应用程序或SDK不是一个选项-在web环境中只有驱动器API可用。您不能将CSV转换为XLS/XLSX并将其上载到Google Drive以获得多页预览吗?或者(作为一种完全不同的方法)如果您正在进行多页预览,您可以尝试使用PHP将CSV转换为PDF…我不想要PDF,事实证明,CSV是不够的。一些澄清:-1。你是说完全相同的文件可以通过web界面上传/转换,但是通过API失败了?如果是,请检查Base64编码是否正确。2.你可以上传而不需要转换。如果您尝试在web界面中“转换为google文档”,会发生什么情况?如果我通过web浏览器上传并进行转换,则转换通过API保存的文件不会转换(进度条卡住);我正在使用PHP的谷歌api包装器。我还可以在驱动api上创建多个版本。。。但这可能是插入多维数组(每个循环嵌套的每个超链接:)所需的最小努力,一旦我有了一个可以导出到Excel的gSheet。如果我能在GoogleAPI包装上插入表格/行,我将接受这个答案。我想也安装了cURL。如果我能用文档列表API插入和转换,这将比逐行写出更合适。今天我将测试什么是可访问的,什么是可行的。最近我参加了一项调查,并借此机会指出了我面临的一些问题;希望他们会添加更多的文件验证错误,而不仅仅是HTTP500。更新:PHPExcel的实际版本与驱动器API结合,转换为gSheet,而不需要修复Excel包(至少对我来说)。很高兴他们(不知道是谁)修好了。