共计 5097 个字符,预计需要花费 13 分钟才能阅读完成。
生成 Word 文档是通过使用 PHP 中的库或扩展来操作。在 PHP 中,有许多第三方库和扩展可用于生成 Word 文档,下面将介绍使用 php 生成 word 文档的多种方法总有一种适合你。
1、使用 PHPWord 库生成 word 文档
最常用的是PHPWord 库。
PHPWord – 用于读写文字处理文档(OOXML、ODF、RTF、HTML、PDF)的纯 PHP 库
下面是使用 PHPWord 库生成 Word 文档的基本步骤:
1、使用 composer 安装 PHPWord 库,也可以这几上去 github 下载,这里就不多说了。
composer require phpoffice/phpword
2、在你的 PHP 脚本中,引入 PHPWord 库的自动加载器:
require_once 'vendor/autoload.php';
3、创建一个新的 Word 文档对象:
$phpWord = new PhpOfficePhpWordPhpWord();
4、添加文本到文档:
$section = $phpWord->addSection();
$section->addText('你的文本内容');
5、保存文档为 Word 文件:
$phpWord->save('path/to/save.docx');
以上是一个简单的示例,你可以根据自己的需求进一步探索 PHPWord 库的其他功能和选项,例如添加样式、表格、图片等。
总结一下,通过使用 PHPWord 库,你可以轻松地在 PHP 中生成 Word 文档。记得在开始之前安装 PHPWord 库,并按照上述步骤编写你的 PHP 代码。这样,你就可以根据自己的需求生成自定义的 Word 文档了。
完整的 PHPWord 库的基本使用示例
require_once 'bootstrap.php';
// 创建新文档...
$phpWord = new PhpOfficePhpWordPhpWord();
/* 注意:附加到文档的任何元素都必须位于节内. */
// 添加一个空的 Section 到文档...
$section = $phpWord->addSection();
// 将 Text 元素添加到默认字体样式的部分...
$section->addText(
'"从昨天学习,为今天生活,为明天祈祷。'
. '重要的是不要停止质疑。" '.'(文章内容)'
);
/*
* 注意:可以通过三种方式自定义添加的文本元素的字体样式:* - 内联;* - 使用命名字体样式(将隐式创建新的字体样式对象);* - 使用显式创建的字体样式对象。*/
// 添加带有自定义字体的内联文本元素...
$section->addText(
'"伟大的成就通常源于巨大的牺牲,'
. '并且绝不是自私的结果。" '.'(文章内容)',
array('name' => 'Tahoma', 'size' => 10)
);
// 添加使用命名字体样式自定义字体的文本元素...
$fontStyleName = 'oneUserDefinedStyle';
$phpWord->addFontStyle(
$fontStyleName,
array('name' => 'Tahoma', 'size' => 10, 'color' => '1B2232', 'bold' => true)
);
$section->addText(
'"最大的成就不是永不跌倒,'
. '而是在跌倒后再次站起来。" '.'(文章内容)',
$fontStyleName
);
// 添加使用显式创建的字体样式对象自定义字体的文本元素...
$fontStyle = new PhpOfficePhpWordStyleFont();
$fontStyle->setBold(true);
$fontStyle->setName('Tahoma');
$fontStyle->setSize(13);
$myTextElement = $section->addText('"相信你可以,你就已经成功了一半。" (文章内容)');
$myTextElement->setFontStyle($fontStyle);
// 将文档保存为 OOXML 文件...
$objWriter = PhpOfficePhpWordIOFactory::createWriter($phpWord, 'Word2007');
$objWriter->save('helloWorld.docx');
// 将文档保存为 ODF 文件...
$objWriter = PhpOfficePhpWordIOFactory::createWriter($phpWord, 'ODText');
$objWriter->save('helloWorld.odt');
// 将文档保存为 HTML 文件...
$objWriter = PhpOfficePhpWordIOFactory::createWriter($phpWord, 'HTML');
$objWriter->save('helloWorld.html');
/* 注意:我们跳过 RTF,因为它不是基于 XML 的并且需要不同的示例。*/
/* 注意:我们跳过 PDF,因为使用“HTML-to-PDF”方法来创建 PDF 文档。*/
// 更多示例,可以查看 PHPWORD 官方文档
2、利用 windows 下面的 com 组件
使用 windows 下的 com 组件,com 作为 PHP 的一个扩展类,安装过 office 的服务器会自动调用 word.application 的 com,可以自动生成文档,PHP 官方文档手册查看具体说明(https://www.php.net/manual/en/class.com.php)
示例代码如下
Version}n";
//bring it to front
$word->Visible = 1;
//open an empty document
$word->Documents->Add();
//do some weird stuff
$word->Selection->TypeText("This is a test...");
$word->Documents[1]->SaveAs("Useless test.doc");
//closing word
$word->Quit();
//free the object
$word = null;
?>
个人建议:com 实例后的方法都需要查找官方文档才知道什么意思,个人觉得不是太方便,另外这个效率也不是很高,不推荐使用。
3、使用 php html 网页导出 Word 文档
说明原理
一般情况下,有两种方法可以导出 doc 文档。
一种方法是使用 com,并将其作为 PHP 的一个扩展库安装到服务器上。然后,创建一个 com 对象并调用其方法。安装了 Office 套件的服务器可以调用一个名为 ”word.application” 的 com 对象,利用它可以生成 Word 文档。但是,我不推荐这种方法,因为执行效率比较低(我进行了一些测试,发现在执行代码时,服务器会真实地打开一个 Word 客户端)。理想情况下,com 对象应该是无界面的,在后台进行数据转换,这样效果会更好。但是,这些扩展一般都需要付费。
第二种方法则是直接用 PHP 将我们的文档内容写入一个后缀为.doc 的文件中。这种方法不依赖于第三方扩展,并且执行效率较高。
Word 本身具备很强大的功能,它可以打开 HTML 格式的文件,并且能够保留格式,即使后缀名为.doc,它也能正常识别。这为我们提供了方便。然而,在 HTML 格式的文件中,图片只是链接,而真正的图片文件是保存在其他地方的。也就是说,如果将 HTML 格式直接写入.doc 文件中,其中就不会包含图片。那么,我们如何创建带有图片的 Word 文档呢?我们可以使用与 HTML 相似的 MHT 格式。
MHT 格式与 HTML 非常相似,唯一的区别在于 MHT 格式中,外部链接引入的文件(如图片、JavaScript、CSS)会被 Base64 编码存储。因此,单个 MHT 文件就能保存网页中的所有资源。当然,相比 HTML,MHT 文件的尺寸会更大。
Word 能否识别 MHT 格式呢?我将一个网页保存为 MHT 格式,然后将后缀名修改为.doc,并用 Word 打开,结果是 OK,Word 也能正常识别 MHT 文件并显示其中的图片。
好了,既然 Word 可以识别 MHT 格式,接下来我们就考虑如何将图片插入到 MHT 中。由于 HTML 代码中的图片路径保存在 img 标签的 src 属性中,只需要提取 HTML 代码中的 src 属性值,就能获取到图片的地址。即使是相对路径,也可以加上 URL 的前缀,转换为绝对路径。一旦有了图片地址,我们就可以使用 file_get_content 函数获取到图片文件的实际内容,然后调用 base64_encode 函数将文件内容编码为 Base64 编码,最后将其插入到 MHT 文件的适当位置即可。
最后,我们有两种方法将文件发送给客户端。一种方法是先在服务器端生成一个.doc 文档,并记录下这个文档的地址;最后,通过 header(“location:xx.doc”)将文档地址发送给客户端,让客户端下载该文档。另一种方法是直接发送 HTML 请求,修改 HTML 协议头部,将 content-type 设置为 application/doc,并将 content-disposition 设置为 attachment,后面跟上文件名。在发送完 HTML 协议以后,直接将文件内容发送给客户端,也可以让客户端下载该.doc 文件。
完整示例封装函数代码
/**
* 根据 HTML 代码获取 word 文档内容
* 创建一个本质为 mht 的文档,该函数会分析文件内容并从远程下载页面中的图片资源
* 该函数依赖于类 MhtFileMaker
* 该函数会分析 img 标签,提取 src 的属性值。但是,src 的属性值必须被引号包围,否则不能提取
*
* @param string $content HTML 内容
* @param string $absolutePath 网页的绝对路径。如果 HTML 内容里的图片路径为相对路径,那么就需要填写这个参数,来让该函数自动填补成绝对路径。这个参数最后需要以 / 结束
* @param bool $isEraseLink 是否去掉 HTML 内容中的链接
*/
function getWordDocument($content , $absolutePath = "" , $isEraseLink = true)
{$mht = new MhtFileMaker();
if ($isEraseLink)
$content = preg_replace('/(s*.*?s*)/i' , '$1' , $content); // 去掉链接
$images = array();
$files = array();
$matches = array();
// 这个算法要求 src 后的属性值必须使用引号括起来
if (preg_match_all('//i',$content ,$matches ) )
{$arrPath = $matches[1];
for ($i=0;$iAddContents("tmp.html",$mht->GetMimeType("tmp.html"),$content);
for ($i=0;$iAddContents($files[$i],$mht->GetMimeType($image),$imgcontent);
}
else
{echo "file:".$image."not exist!
";
}
}
return $mht->GetFile();}
使用方法:
$fileContent = getWordDocument($content,"http://www.yoursite.com/Music/etc/");
$fp = fopen("test.doc", 'w');
fwrite($fp, $fileContent);
fclose($fp);
其中,$content 变量应该是 HTML 源代码,后面的链接应该是能填补 HTML 代码中图片相对路径的 URL 地址
注意,在使用这个函数之前,您需要先包含类 MhtFileMaker,这个类可以帮助我们生成 Mht 文档。
MhtFileMaker 类
headers[] = $header;
$key = strtolower(substr($header, 0, strpos($header, ':')));
$this->headers_exists[$key] = TRUE;
}
function SetFrom($from){$this->SetHeader("From: $from");
}
function SetSubject($subject){$this->SetHeader("Subject: $subject");
}
function SetDate($date = NULL, $istimestamp = FALSE){if ($date == NULL) {$date = time();
}
if ($istimestamp == TRUE) {$date = date('D, d M Y H:i:s O', $date);
}
$this->SetHeader("Date: $date");
}
function SetBoundary($boundary = NULL){if ($boundary == NULL) {$this->boundary = '--' . strtoupper(md5(mt_rand())) . '_MULTIPART_MIXED';
} else {$this->boundary = $boundary;
}
}
function SetBaseDir($dir){$this->dir_base = str_replace("\", "/", realpath($dir));
}
function SetFirstPage($filename){$this->page_first = str_replace("\", "/", realpath("{$this->dir_base}/$filename"));
}
function AutoAddFiles(){if (!isset($this->page_first)) {exit ('Not set the first page.');
}
$filepath = str_replace($this->dir_base, '', $this->page_first);
$filepath = 'http://mhtfile' . $filepath;
$this->AddFile($this->page_first, $filepath, NULL);
$this->AddDir($this->dir_base);
}
function AddDir($dir){$handle_dir = opendir($dir);
while ($filename = readdir($handle_dir)) {if (($filename!='.') && ($filename!='..') && ("$dir/$filename"!=$this->page_first)) {if (is_dir("$dir/$filename")) {$this->AddDir("$dir/$filename");
} elseif (is_file("$dir/$filename")) {$filepath = str_replace($this->dir_base, '',"$dir/$filename");
$filepath = 'http://mhtfile' . $filepath;
$this->AddFile("$dir/$filename", $filepath, NULL);
}
}
}
closedir($handle_dir);
}
function AddFile($filename, $filepath = NULL, $encoding = NULL){if ($filepath == NULL) {$filepath = $filename;}
$mimetype = $this->GetMimeType($filename);
$filecont = file_get_contents($filename);
$this->AddContents($filepath, $mimetype, $filecont, $encoding);
}
function AddContents($filepath, $mimetype, $filecont, $encoding = NULL){if ($encoding == NULL) {$filecont = chunk_split(base64_encode($filecont), 76);
$encoding = 'base64';
}
$this->files[] = array('filepath' => $filepath,
'mimetype' => $mimetype,
'filecont' => $filecont,
'encoding' => $encoding);
}
function CheckHeaders(){if (!array_key_exists('date', $this->headers_exists)) {$this->SetDate(NULL, TRUE);
}
if ($this->boundary == NULL) {$this->SetBoundary();}
}
function CheckFiles(){if (count($this->files) == 0) {return FALSE;} else {return TRUE;}
}
function GetFile(){$this->CheckHeaders();
if (!$this->CheckFiles()) {exit ('No file was added.');
}
$contents = implode("rn", $this->headers);
$contents .= "rn";
$contents .= "MIME-Version: 1.0rn";
$contents .= "Content-Type: multipart/related;rn";
$contents .= "tboundary="{$this->boundary}";rn";
$contents .= "ttype="" . $this->files[0]['mimetype'] . ""rn";
$contents .= "X-MimeOLE: Produced By Mht File Maker v1.0 betarn";
$contents .= "rn";
$contents .= "This is a multi-part message in MIME format.rn";
$contents .= "rn";
foreach ($this->files as $file) {$contents .= "--{$this->boundary}rn";
$contents .= "Content-Type: $file[mimetype]rn";
$contents .= "Content-Transfer-Encoding: $file[encoding]rn";
$contents .= "Content-Location: $file[filepath]rn";
$contents .= "rn";
$contents .= $file['filecont'];
$contents .= "rn";
}
$contents .= "--{$this->boundary}--rn";
return $contents;
}
function MakeFile($filename){$contents = $this->GetFile();
$fp = fopen($filename, 'w');
fwrite($fp, $contents);
fclose($fp);
}
function GetMimeType($filename){$pathinfo = pathinfo($filename);
switch ($pathinfo['extension']) {
case 'htm': $mimetype = 'text/html'; break;
case 'html': $mimetype = 'text/html'; break;
case 'txt': $mimetype = 'text/plain'; break;
case 'cgi': $mimetype = 'text/plain'; break;
case 'php': $mimetype = 'text/plain'; break;
case 'css': $mimetype = 'text/css'; break;
case 'jpg': $mimetype = 'image/jpeg'; break;
case 'jpeg': $mimetype = 'image/jpeg'; break;
case 'jpe': $mimetype = 'image/jpeg'; break;
case 'gif': $mimetype = 'image/gif'; break;
case 'png': $mimetype = 'image/png'; break;
default: $mimetype = 'application/octet-stream'; break;
}
return $mimetype;
}
}
?>
4、使用纯 html 格式导出 WORD
利用 ob_start 把 html 页面先存储起来(解决一下页面多个 header 问题,可以批量生成),然后在写入 doc 文档内容利用 文章来源:https://www.toymoban.com/diary/php/432.html
示例代码
';
}
function save($path)
{echo "