1

PHP を介して、MySQL データベースから Word テンプレート (RTF) にコンテンツをエクスポートしています。

「付録 B」というセクションがあり、レコードで見つかったすべての頭字語を表示する必要があります。このセクションに表示される最小レコード数は 90 です (つまり、これらは各レコードに含まれる標準の頭字語 (tblAcronyms) です)。ただし、ユーザーがこのリストに追加できるため、最大レコード数は不明です (tblAppendixB)。

Word (つまり RTF) ドキュメントには、見つかったすべてのレコードが表示されるはずですが、最初のレコードしか表示されていません。

これは私がこれまでに持っているものです:

<?php
....

#Retrieve Appendix B records
$qry_get_AppB = "SELECT vAcronym, vAcronymDesc FROM tblAcronyms
                   UNION SELECT vAcronym, vAcronymDesc FROM tblAppendixB
                     WHERE fkID = ". $i_fk_id . " ORDER BY vAcronym ASC";
$qry_appb_result = mysql_query($qry_get_AppB);
$qryAppBno_rows = mysql_num_rows($qry_appb_result);    

//Generate the headers to help a browser choose the correct location
header('Content-Type: application/msword');
header('Content-Disposition: inline; filename="'.$vProgramName.'_rec.rtf");

//Open the template file
$tfilename = 'Appb_Template.rtf';
$fp = fopen($tfilename, 'r');

//Read the template into a variable
$toutput = fread($fp, filesize($tfilename));

fclose($fp);

//Replace the place holders in the template with data
if($qryAppBno_rows > 0)
{
  while($rowAppB = mysql_fetch_array($qry_appb_result)) 
  {
     $vAppB = $rowAppB['vAcronym'] . '-' . $rowAppB['vAcronymDesc'] . "\r\n";
     $toutput = str_replace('<<vAppB>>', $vAppB, $toutput);
  }
}

//Send the generated document to the browser
echo $toutput;

?>

このフォーラムや他のフォーラムを検索しましたが、まだ解決策が見つかりません。

どんな援助も大歓迎です。

4

2 に答える 2

0

私は問題を解決しました。MS Word(RTF)を段落記号として認識するために、「\ r\n」の代わりに「\par」を使用する必要がありました。現在機能している変更されたコードは次のとおりです。

<?php
....

$t_newline = "\par";

#Retrieve Appendix B records
$qry_get_AppB = "SELECT vAcronym, vAcronymDesc FROM tblAcronyms
               UNION SELECT vAcronym, vAcronymDesc FROM tblAppendixB
                 WHERE fkID = ". $i_fk_id . " ORDER BY vAcronym ASC";
$qry_appb_result = mysql_query($qry_get_AppB);
$qryAppBno_rows = mysql_num_rows($qry_appb_result);    

//Generate the headers to help a browser choose the correct location
header('Content-Type: application/msword');
header('Content-Disposition: inline; filename="'.$vProgramName.'_rec.rtf");

//Open the template file
$tfilename = 'Appb_Template.rtf';
$fp = fopen($tfilename, 'r');

//Read the template into a variable
$toutput = fread($fp, filesize($tfilename));

fclose($fp);

//Replace the place holders in the template with data
if($qryAppBno_rows > 0)
{
   while($rowAppB = mysql_fetch_array($qry_appb_result)) 
   {
       $vAppendixB[] = $rowAppB['vAcronym'] . '-' . $rowAppB['vAcronymDesc'] . $t_newline;
       $vAppB = implode(" ", $vAppendixB);
   }
}

$toutput = str_replace('<<vAppB>>', $vAppB, $toutput);

//Send the generated document to the browser
echo $toutput;

?>

うまくいけば、これは他の誰かを助けるでしょう。:-)

于 2012-04-17T11:56:32.467 に答える
0

あなたのテンプレートがどのようなものかよくわかりませんが、名前の付いたプレースホルダーは 1 つだけだと思います<<vAppB>>。最初の反復で (利用可能なデータがある場合)、そのプレースホルダーを最初のデータ入力に置き換えます。この事実では、1 つのプレースホルダーのみが表示されます。

あなたのコードをこれに似たものに書き直すかもしれません

... //do your stuff
$newLine = "\r\n";
$appendix = "";
while($rowAppB = mysql_fetch_array($qry_appb_result)) {
    $appendix .= $rowAppB['vAcronym'] . '-' . $rowAppB['vAcronymDesc'] . $newLine;
}
$toutput = str_replace('<<vAppB>>', $appendix, $toutput);
...//do some other stuff

単純なプロトタイピングであるため、追加の作業が必要になる場合があります。

秘訣は、collect取得したすべてのエントリをプレースホルダーに置き換えることです:)

于 2012-04-09T17:56:53.343 に答える