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

时间:2013-12-05 16:57:11

标签: php mysql com ms-word download

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

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

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

这是我创建文档的结构:

index.php(包括用于选择要创建的文档和工作单号的表单) - > results.php(从表单和查询数据库获取所有文档通用的附加信息,然后将信息路由到文档创建脚本) - > toform1.php和/或toform2.php和/或toform3.php和/或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.php代码的一部分:

$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(等)脚本在单独调用时工作正常,但是当我尝试实现一次调用多个这样的东西时,只创建一个文档,并且只提示一个文档下载。

据我所知,在我的期望中,我可能完全脱离摇滚乐,但我的想法是让用户保持简单。将文件放入ZIP文件并让用户保存,然后解压缩然后打开并不比我们当前的处理方法更容易。那个,我甚至没有第一个线索,如何将所有这些组合成一个ZIP文件供下载,因为它们是在不同的时间用不同的脚本创建的。

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

1 个答案:

答案 0 :(得分:1)

帮助那些可能正在努力解决这个问题的人。找到这个编码块需要一段时间,但它满足了我的需求。我需要做的就是使用上面的代码同时创建多个下载内容:target='_blank'在开始<form>标记中。现在它的内容如下:

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

我只能说,“哇”。我花了几个小时寻找这个问题的解决方案,结果就是这个属性。谢天谢地,无论是谁把它放在他们的代码中,所以我最终会找到它。