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

标签 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';
}

下面是表单脚本的公共(public)部分(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 文件以供下载,因为它们是在不同时间使用不同脚本创建的。

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

最佳答案

帮助那些可能正在为此苦苦挣扎的其他人。找到这个编码 block 花了一段时间,但它满足了我的需求。使用上面的代码同时创建多个下载所需要做的就是:target='_blank'在开幕<form>标签。所以现在它是这样写的:

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

我只想说,“哇”。我花了几个小时寻找这个问题的解决方案,最终得到的只是那个属性。非常感谢将它放入代码中的人,所以我最终会找到它。

关于PHP创建多个Word文档并允许下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20406023/

相关文章:

php - 在网页中显示 PDF 并以编程方式滚动它

php - 安卓通知火力基地

javascript - 将 td 背景颜色更改为成功或危险

php - 扩展 AJAX 数据库查询的功能

php - 当该帖子的标签等于一个主题时,不显示重复的帖子

mysql - 在 INSERT 语句中使用 rand() 也很慢吗?

c++ - COM 服务器可以重新分配 ([in, out] CACLSID * arg) 吗?

javascript - Google Maps API Infowindow 在提交前将 lat 和 lng 值输入到表单隐藏字段中

vb.net - 将 Office 从 2003 升级到 2007 是否会破坏通过 COM 互操作使用 Excel 的 VB 程序?

python - 如何以编程方式从 Python 提升到 Visual Studio 的顶部