0

phpdocxproを使用してテンプレートから.docxファイルを生成するプロジェクトがあります。テンプレートにデータを簡単に取り込むことができますが、ファイルをダウンロードしてMS Word 2010で開くと、内容に問題があるためファイルを開くことができないとプログラムが報告します。詳細は「ファイルが破損しています。開くことはできません」。Wordはドキュメントを修復できますが、そもそも破損してはならないという問題があります。

これが私がドキュメントを生成する方法です:

function generateUnitDesign(){
  if($this->populateRecords()){
      require_once dirname(__FILE__).'/phpdocx/classes/CreateDocx.inc';
      $filename = 'UnitDesignTemplate-'.str_replace(' ', '', $this->rec->title);
      //Create Document
      $document = new CreateDocx();
      $document->addTemplate(dirname(__FILE__).'/templates/unitdesigntemplate.docx');

      // Fill in text fields
      $document->addTemplateVariable('TITLE', $this->rec->title);
      $document->addTemplateVariable('CHALLENGE', $this->rec->challenge, 'html');
      $document->addTemplateVariable('HOOK', $this->rec->hook, 'html');
      $document->addTemplateVariable('RESEARCH', $this->rec->research, 'html');
      $document->addTemplateVariable('AUDIENCE', $this->rec->audience, 'html');
      $document->addTemplateVariable('SUMMARY', $this->rec->project_brief, 'html');
      $document->addTemplateVariable('RESOURCES', $this->rec->resources, 'html');
      $document->addTemplateVariable('REQUIREMENTS', $this->rec->requirements, 'html');
      $document->addTemplateVariable('SCAFFOLDING', $this->rec->scaffolding, 'html');

      $document->createDocx($filename);
      unset($document);
      header("Content-Type: application/vnd.ms-word");
      header("Content-Length: ".filesize($filename.'.docx'));
      header('Content-Disposition: attachment; filename='.$filename.'.docx');
      header('Content-Transfer-Encoding: binary');
      ob_clean();
      flush();
      readfile($filename.'.docx');
      unlink($filename.'.docx');
  }
}

もともと、私はそれらのcreateDocxAndDownload()関数を使用してファイルを取得しようとしましたが、サーバーに.docxファイルのコピーが残るため、理想的ではありませんでした。私は何かが足りないのですか?phpdocxの経験が豊富な人がいますか?

編集: まあ、私はばかのように感じます。ファイルを出力するコードの部分に問題を絞り込んだ後、最終的にHEXエディターでファイルを開いたところ、ファイルが正常に出力された後、WebフロントエンドがHTMLの先頭を末尾に追加することが問題であることがわかりました。 「破損した」ファイルを作成するdocxファイル。unlink()全体を修正した直後のこの1行:

exit;

ペッカ:新しい情報でこれに答えたいのなら、私はあなたの答えを受け入れます。

4

2 に答える 2

2

ファイルを出力するコードの部分に問題を絞り込んだ後、最終的にHEXエディターでファイルを開いたところ、ファイルが正常に出力された後、WebフロントエンドがHTMLの先頭を末尾に追加することが問題であることがわかりました。 '破損した'ファイルを作成するdocxファイルの。unlink()全体を修正した直後のこの1行:

exit;
于 2012-06-01T14:37:18.197 に答える
1

テンプレートファイルに直接アクセスせずにこれを特定することは困難ですが、テンプレートエンジンが失敗することが多いいくつかの指針を次に示します。

  • すべてのPHP変数をコンソールに記録してみてください。print print_r($this->rec->variable_name, true);次に、すべての変数が文字列であり、NULLでない変数がないことを確認してください。
  • テンプレートファイルを調べて、スタイル(つまり、フォントタイプ、フォントサイズなど)が各テンプレート変数で一貫していることを確認します。つまり、変数の半分が残りの変数とは異なるスタイルである変数がないことを確認してください。この特定の微妙な点は、テンプレートファイルに導入するのが非常に簡単であり、一般に、それを修正する最も簡単な方法は、各テンプレート変数を単純に削除して書き直すことです。

最後に、メソッドを呼び出すときに「html」パラメーターを削除してみて、addTemplateVariableそれが違いを生むかどうかを確認してください。実際にHTMLを使用していない場合は、「html」パラメーターを渡しても意味がありません。逆に、HTMLを使用している場合、破損したファイルはHTMLの構造が正しくない場合であり、MicrosoftWordがドキュメントに破損のフラグを立てます。

于 2012-05-21T23:32:24.310 に答える