2012-04-09 123 views
1

我正在通过PHP将内容从MySQL数据库导出到Word模板(RTF)。未导出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; 

?> 

我已搜查这个论坛和其他人,但还没有找到一个解决方案。

任何帮助,非常感谢。

回答

0

好吧,我不太确定你的模板是什么样的,但我想,你只有一个名称为<<vAppB>>的占位符。在第一次迭代中(如果有任何可用的数据),将第一个数据条目替换为该占位符。在这个事实中,只显示一个占位符。

可能重写代码类似于此

... //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你得到的条目,并且比你的占位符:)

+0

谢谢你给我一个关于如何解决我的问题的想法。当我回应变量时,我收到所有记录(即收集所有条目;一件好事);所以我试着创建另一个变量,然后存储这些值(即$ appendix_result = $ appendix),然后执行$ toutput = str_replace('>',$ appendix_result,$ toutput);但那也没用。我几乎在正确的轨道上,你的建议? – Nicole 2012-04-10 11:23:19

+0

Ooops ...应该阅读@Zip ...谢谢你给我....(对不起) – Nicole 2012-04-10 11:36:22

+0

我做了一些修改......它现在收集所有条目并将它们导出到Word模板,但是,它不会中断(即插入新的换行符);内容一起运行。这是我有.... while($ rowAppB = mysql_fetch_array($ qry_appb_result)){ $ vAppendixB [] = $ rowAppB ['vAcronym']。 ' - '。 $ rowAppB ['vAcronymDesc']。 $ t_newline; $ vAppB = implode($ t_newline,$ vAppendixB); } $ toutput = str_replace('<>',$ vAppB,$ toutput);我知道我很接近,但无法弄清楚我缺少的东西。再次,任何援助非常感谢。 – Nicole 2012-04-16 12:07:48

0

我解决了这个问题更换;我必须使用“\ par”而不是“\ r \ n”才能将MS Word(RTF)识别为段落标记。这里是修改的代码,现在可以运行:

<?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; 

?> 

希望这会帮助别人。 :-)