PHP创建多个Word文档并允许下载


PHP to create Multiple Word Documents and allow download

在我们的办公室里,我们为所做的工作创建了表格,其目的是简化并加快创建这些表格的过程。我有多达4个不同的Word文档要创建(.docx格式)和一个表单来创建它们。根据用户的输入(复选框、文本字段),从MySQL数据库中查询其他数据,我必须填充文档的书签。文档的许多信息都是重复的,所以我试图将数据库查询保持在最低限度,并在可能的情况下重用相同的代码/变量。我让文档创建脚本单独工作,如果只选中其中一个复选框,我可以让这些文档提示用户下载它们。但是我很难创建代码来提示用户一次下载多个文档。

我试过在表单上用复选框做一个提交按钮,但无论是选中了一个还是所有复选框,它都只提示下载一次。我曾尝试在新窗口中打开javascript,但由于.docx扩展名的开放xml格式,数据无法正确导入到文档中。

我读到,由于安全原因,从一个请求中多次下载文件是不可能的。但是,按照我使用这些表单创建脚本的方式,不应该只有一个请求。我是HTTPRequests的新手,所以我可能没有正确理解它。

这是我创建文档的结构:

index.php(包括用于选择要创建的文档和作业的工单编号的表单)->results.php(它从表单中获取输入,并在数据库中查询所有文档通用的附加信息,然后将信息路由到文档创建脚本)->toform1.php和/或toform2.php和/或者toform3.php和/or toform4.php(取决于单击了哪些复选框)。表单脚本根据需要对数据库进行额外的查询,以完成文档的填充。每个文档都有不同的布局和一些不同的书签。

以下是index.php:的代码

<form action="results.php" id='forms' method='post'>
    <table id='formTable'>
        <tr>
            <td><label for="workOrderNum">Work Order Num:</label></td>
            <td><input type="text" id='workOrderNum' name='workOrderNum'> </input></td>
        </tr>
        <tr>
            <td><label for="formSelection">Forms to Generate: </label></td>
            <td>
                <input type="checkbox" name='form1' id='form1'/>
                <label for="form1"><span></span>Form 1</label><br />
                <input type="checkbox" name='form2' id='form2'/>
                <label for="form2"><span></span>Form 2</label><br />
                <input type="checkbox" name='form3' id='form3'/>
                <label for="form3"><span></span>Form 3</label><br />
                <input type="checkbox" name='form4' id='form4'/>
                <label for="form4"><span></span>Form 4</label><br />
            </td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td><input type="submit" id='generateForm' value='Generate Form(s)' class='button'></input></td>
        </tr>
    </table>
</form>

以下是results.hp:的部分代码

$workOrderNum =  htmlentities($_POST['workOrderNum']);
...
if(isset($_POST['form1']) && $_POST['form1']){
include 'toform1.php';
}
if(isset($_POST['form2']) && $_POST['form2']){
include 'toform2.php';
}
if(isset($_POST['form3']) && $_POST['form3']){
include 'toform3.php';
}
if(isset($_POST['form4']) && $_POST['form4']){
include 'toform4.php';
}

以下是表单脚本的常见部分(toform1.php、toform2.php等):

$word = new COM("word.application");
// Hide MS Word application window
$word->Visible = 0;

$template_file = 'C:/xampp/htdocs/portal/includes/templates/form1.docx'; 
//file name is different based on initiating form.
//Create new document
$word->Documents->Open($template_file);
//WO Number
$woNumBookMark = 'WONum';
$objBookmark = $word->ActiveDocument->Bookmarks($woNumBookMark);
$range = $objBookmark->Range;
$range->Text = htmlentities($workOrderNum) . '/' . htmlentities($lotID);
$filename = tempnam(sys_get_temp_dir(), "word");
$word->Documents[1]->SaveAs($filename);
// Close and quit
$word->Quit();
unset($word);
header("Content-Length: ".filesize($filename));
//header("Content-Type: application/force-download");
header("Content-type: application/vnd.openxmlformats-officedocument.wordprocessingml.document");
header("Content-Disposition: attachment;Filename=document_name.docx");
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
// Send file to browser
readfile($filename);
unlink($filename);

同样,toform1.php(etc.)脚本在单独调用时工作良好,但当我试图实现一次调用多个脚本的东西时,只会创建一个文档,并且只提示下载一个。

我知道我可能完全偏离了我的期望,但我的想法是为用户保持简单。将文件放入ZIP文件中,让用户保存,然后解压缩,然后打开并不比我们目前的做法更容易。我甚至不知道如何将所有这些组合到一个ZIP文件中进行下载,因为它们是在不同的时间使用不同的脚本创建的。

我正在寻求帮助,因为这是在我们办公室实现这一目标的最后一个障碍,这将节省大量时间,所以我真的在寻求帮助来完成这个项目。所以,对当前代码进行更正或为我指明正确的方向来实现这一点将是非常棒的!提前感谢您的帮助!

帮助其他可能为此而挣扎的人。花了一段时间才找到这个编码核心,但它满足了我的需求。为了用上面的代码同时创建几个下载,我所要做的就是在打开的<form>标签中放上这个:target='_blank'。所以现在它写着:

<form action="results.php" id='forms' method='post' target='_blank'>

我所要说的就是,"哇"。我花了几个小时寻找这个问题的解决方案,结果就是这个属性。感谢所有把它放在代码中的人,这样我最终就能找到它。