【PHPWrod】使用PHPWord导出word文档

目的:PHP通过PHPWord类库导出文件为word。

开发语言及类库:ThinkPHP、PHPWord

一、安装PHPWord类库

项目根目录使用composer安装PHPWord,安装完成后会在vendor目录下生成phpoffice文件夹,就是PHPWord类库

复制代码
composer require phpoffice/phpword

二、使用PHPWord导出word文件

php 复制代码
<?php
use PhpOffice\PhpWord\IOFactory; 
use PhpOffice\PhpWord\PhpWord;

public function exportreport2()
{
	$shijuan_id = trim(input('post.shijuan_id'));
	$grade_id = trim(input('post.grade_id'));

	try {
		// 班级、试卷信息
		$info = model('Shijuan')->getShijuanGradeInfo($shijuan_id,$grade_id);

		// 标题
        $title = $info['filename'].'_考试分析报告';
		// 文件名
        $docxname = $info['grade'].'_'.$info['year'].$info['season'].'_'.$info['filename'].'_考试分析报告'.date('YmdHis',time());

		// 分析报告 二维数组
		$list = model('Shijuan')->getStudyReport($shijuan_id,$grade_id);

		// 实例化
		$phpWord = new PhpWord();
		header("Content-Type: text/html; charset=UTF-8");

		$phpWord->addFontStyle('cStyle', array('size' => 12,'name' => 'msyh'));//内容样式
		$phpWord->addFontStyle('bStyle', array('size' => 12, 'bold' => true, 'name' => 'msyh'));//加粗样式
        $phpWord->addFontStyle('titlestyle', array('bold' => true,'size' => 16,'name' => 'msyh'));//标题的样式

        // 创建新页面
		$section = $phpWord->addSection();

	  	$section->addText($title,'titlestyle', ['alignment' => 'center']);
        $section->addTextBreak(1);
        $section->addText('班级:'.$info['grade'].'_'.$info['year'].$info['season'], 'cStyle', ['alignment' => 'right']);
        $section->addText('总人数:'.$info['student'].'; 已交卷:'.$info['cmit'], 'cStyle', ['alignment' => 'right']);
        $section->addText('导出时间: '.date('Y-m-d H:i:s',time()), 'cStyle', ['alignment' => 'right']);

        // 表格样式
        $styleTable = array( 'borderSize'=>6, 'alignment' => 'center','cellMargin'=>80);
        // 第一行样式
		$styleFirstRow = array('bgColor'=>'f2f2f2' );
    	$phpWord ->addTableStyle('myOwnTableStyle',$styleTable,$styleFirstRow);

        foreach($list as $k=>$v) {

            $section->addText('【'.$v['type'].'】 第'.($k+1).'题: '.$v['title'],'cStyle');
            $section->addText('【正确答案】: '.$v['answer'],['alignment' => 'center'],'cStyle');
            $section->addText('【正确率】'.$v['percent'].'%; 【作答人数】: '.$v['cmit_num'].'人次',['color' => '009688'],'cStyle');

            // 添加表格
        	$table = $section->addTable('myOwnTableStyle');

			//添加一行(addRow执行后才能使用addCell给本行添加列,括号内数字代表高度)
			$table->addRow(100); 
			//表头添加(数字代表宽度,valign代表对齐方式)
			$table->addCell(3000)->addText('选项', 'bStyle', ['alignment' => 'center']);
			$table->addCell(3000)->addText('选择次数/人次','bStyle', ['alignment' => 'center']);
			$table->addCell(3000)->addText('比例', 'bStyle', ['alignment' => 'center']);
            // 选择题

			$table->addRow(100);
			$table->addCell(3000)->addText('A:'.$v['option_A'], 'cStyle');
			$table->addCell(3000)->addText($v['sel_A'], 'cStyle', ['alignment' => 'center']);
			$table->addCell(3000)->addText($v['percent_A'].'%', 'cStyle', ['alignment' => 'center']);
        		
			$table->addRow(100);
			$table->addCell(3000)->addText('B:'.$v['option_B'], 'cStyle');
			$table->addCell(3000)->addText($v['sel_B'], 'cStyle', ['alignment' => 'center']);
			$table->addCell(3000)->addText($v['percent_B'].'%', 'cStyle', ['alignment' => 'center']);
    		
			$table->addRow(100);
			$table->addCell(3000)->addText('C:'.$v['option_C'], 'cStyle');
			$table->addCell(3000)->addText($v['sel_C'], 'cStyle', ['alignment' => 'center']);
			$table->addCell(3000)->addText($v['percent_C'].'%', 'cStyle', ['alignment' => 'center']);
    		
			$table->addRow(100);
			$table->addCell(3000)->addText('D:'.$v['option_D'], 'cStyle');
			$table->addCell(3000)->addText($v['sel_D'], 'cStyle', ['alignment' => 'center']);
			$table->addCell(3000)->addText($v['percent_D'].'%', 'cStyle', ['alignment' => 'center']);
    		
			$table->addRow(100);
			$table->addCell(3000)->addText('E:'.$v['option_E'], 'cStyle');
			$table->addCell(3000)->addText($v['sel_E'], 'cStyle', ['alignment' => 'center']);
			$table->addCell(3000)->addText($v['percent_E'].'%', 'cStyle', ['alignment' => 'center']);
    		
			$table->addRow(100);
			$table->addCell(3000)->addText('F:'.$v['option_F'], 'cStyle');
			$table->addCell(3000)->addText($v['sel_F'], 'cStyle', ['alignment' => 'center']);
			$table->addCell(3000)->addText($v['percent_F'].'%', 'cStyle', ['alignment' => 'center']);
    		
			$table->addRow(100);
			$table->addCell(3000)->addText('G:'.$v['option_G'], 'cStyle');
			$table->addCell(3000)->addText($v['sel_G'], 'cStyle', ['alignment' => 'center']);
			$table->addCell(3000)->addText($v['percent_G'].'%', 'cStyle', ['alignment' => 'center']);
          
			$section->add($table);

			// 换行 
            $section->addTextBreak(1);
        }
			
		// 保存到服务器
		$objWriter = IOFactory::createWriter($phpWord,'Word2007' );
		// 保存 Word 文档到指定路径
		$savePath = $_SERVER['DOCUMENT_ROOT'].'/uploads/docs/'.$docxname.'.docx';
		$objWriter->save($savePath);

		return apiResponse('200','success',$pdfPath);
	} catch (Exception $e) {
		
		return apiResponse('110','error');
	}
}

上面info、list是从数据库查出来的数据,其中list是要导出的数据,这里是二维数组。

这里的代码是把word文件保存到服务器上,没有直接导出到本地。网络查了些直接导出到本地的方法,但是都不能用,要么直接到不出来,要么导出来了但是打开错误。

如果有实现方法欢迎大家在下面留言交流。

相关推荐
苦逼的猿宝19 小时前
仓储管理系统设计与实现
python·word·markdown
ew4521820 小时前
【Java】Apache POI 终极封装:支持多表格循环、图片插入、日期格式化的Word导出工具类(兼容POI3.17+)
java·word·apache
微软Nav/BC专家2 天前
Microsoft Dynamics 365 Business Central Word Add-in如何安装
word·微软erp
大C聊AI2 天前
标书高效制作:Word 排版快捷键 + AI 工具组合工作流
word·办公技巧·效率提升·招投标·智标领航
jianwuhuang822 天前
豆包输出word
人工智能·ai·chatgpt·word·deepseek·ai导出鸭
chatexcel3 天前
ChatExcel AI文档上线:AI自动生成Word报告的完整工作流
人工智能·word
俊哥工具3 天前
不用安装不收费!多功能U盘修复工具,解决大部分U盘故障
学习·pdf·word·excel·音视频
草丛中的蝈蝈4 天前
word目录中的一级标题编号和标题之间距离很大,但是内容里是正常的
word
Metaphor6924 天前
使用 Python 设置 Word 文档文本的颜色
python·word
usdoc文档预览4 天前
国产化踩坑:Vue3 / React / 小程序如何免插件实现 OFD 及复杂 Office 文档同屏预览
前端·javascript·react.js·小程序·pdf·word·office文件在线预览