【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文件保存到服务器上,没有直接导出到本地。网络查了些直接导出到本地的方法,但是都不能用,要么直接到不出来,要么导出来了但是打开错误。

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

相关推荐
铭....2 小时前
word批量导出visio图
开发语言·c#·word
CodeCraft Studio1 天前
国产化Word处理控件Spire.Doc教程:通过Java简单快速的将 HTML 转换为 PDF
java·html·word
碧海蓝天go星辰大海1 天前
word为跨页表格新加表头和表名
word
进阶的小木桩1 天前
C# 导出word 插入公式问题
开发语言·c#·word
碧海蓝天go星辰大海1 天前
word添加页眉
word
Dontla1 天前
word文档格式规范(论文格式规范、word格式、论文格式、文章格式、格式prompt)
prompt·word
八饱粥1 天前
word中表格拉不动以及插入图片有间距
word
我有一棵树1 天前
【AI工具应用】使用 trae 实现 word 转成 html
word
开开心心就好2 天前
能按需拆分 PDF 为多个文档的工具
javascript·python·智能手机·django·pdf·word·excel
VBAMatrix2 天前
审计报告附注救星!实现Word表格纵向求和+横向计算及其对应的智能校验
word·核对数据·审计报告·审计·附注