最も早送りしたのは、アレイをExcel 2007にレンダリングし、データにアクセスするためにデスクトップにGoogleドライブアプリをインストールすることでした。SpreadsheetsAPIはドキュメントを作成できません。DocsAPIを使用して作成する必要があります。現在、PHPのAPIラッパーは、これらのエンドポイントの両方をサポートしていません。このように、ファイルをリビジョンすることもできます。タイムリーな努力:1時間。
更新:Excel2007でXLSXをレンダリングすると、変換が失敗します。MS-Excelと「名前を付けて保存」でまったく同じファイルを開くと、DriveAPIを介しても変換できます。
ファイルを解凍して比較すると、いくつかのことに気づきました。
a)MS-Excelは「false/true」の代わりに「0/1」の値を使用します
b)ディレクトリ'xl / worksheets / _rels'が削除されました(おそらく役に立たないですか?)。
c)XMLの行末がUNIXからDOSに変換されました。
d)MS-Excelは、すべての空のセルをXMLに追加しました。これはPHPExcelでは書き出されませんでした。
e)リレーションIDがシフトしているように見える...コードに+3の計算がありますか?
問題は、生成されたファイル形式がDriveAPIのXMLパーサーと一致しないことです。
生成されたファイル形式の何が問題になっているのかはまだ正確にはわかりませんが、レンダリングされたXLSXファイルにMS-Excelによってネイティブに作成されたXMLファイルをパッチすると機能します。
/* 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ファイルのパッチ適用をスキップすることもできますが、他の一部のXMLファイルはパッチを適用しません。