10

Drive APIでCSVファイルを問題なくアップロードおよび変換できますが、XLS(PEAR XLS-Writerでレンダリング)またはXLSX(PHPExcelでレンダリング)を送信すると、DriveAPIで次のようなエラーが発生します。

"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タイプは何ですか?

Drive APIを介して(まだ)不可能な場合に備えて、多次元配列を複数のページを持つgSheetに変換する方法を提供する賞金に対する回答を受け入れます(確かにそれが好ましい方法です)。

これはGoogleドライブAPIの質問です。これに使用できる個別のタグはありません。

4

3 に答える 3

2

最も早送りしたのは、アレイを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ファイルはパッチを適用しません。

于 2012-09-09T03:14:34.527 に答える
0

代替アプローチの最後の部分では、Spreadsheet API を使用してスプレッドシートhttps://developers.google.com/google-apps/spreadsheets/に直接書き込むことができます。これにより、増分更新の有益な副作用が得られる場合があります。

例えば。

于 2012-09-05T02:18:48.590 に答える
0

アプリまたは Google ドライブの SDK を使用して Excel ドキュメントを Google ドライブにアップロードできますが、Google はまだファイルを変換する方法を提供していないと思います。

Google のチームにファイル変換を提案する価値はありますか? Excelは問題なく動作するため、個人的には必要性を感じたことはありません。

于 2012-09-04T12:33:00.850 に答える