使用PhpOffice的PhpWord生成Word文件损坏,提示:很抱歉,无法开test.docx,因为内容有问题The file is corrupt and cannot be opened

2 篇文章 0 订阅

先说一下我的环境:
客户端:
操作系统:Windows 10 专业版20H2(64 位)内部版本:19042.870
浏览器:Microsoft Edge版本 89.0.774.75 (官方内部版本) (64 位)
服务器:
操作系统:CentOS 8.3.2011
Nginx版本:1.14.1
PHP版本:7.2.24
Yii2版本:2.0.14
phpoffice/phpword版本:0.18.1

今天,在Yii2下面用PhpWord生成了Word文件。
打开文件后提示:很抱歉,无法开test.docx,因为内容有问题。
点击详细信息后显示:The file is corrupt and cannot be opened
点击确定后显示:Word在"test.docx"中发现无法读取的内容。是否恢复此文档的内容?如果您信任此文档的来源,请点击"是"。
点击是以后显示:使用Microsoft Word无法打开此文件。是否搜索Office.com来查找可打开文件的转换器?
选择打开:即可正常打开文件。
本来这样也能正常使用,但是不解决这个问题,总感觉心里不舒服。
上次用phpexcel生成的excel文件能正常打开使用,看看那段代码咋弄的,直接拿过来试试。
这里直接给出答案:

ob_end_clean();
ob_start();
header('Content-Type : application/vnd.openxmlformats-officedocument.wordprocessingml.document');
header('Content-Disposition:attachment;filename="test.docx"');
$xmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($PHPWord, 'Word2007');
$xmlWriter->save("php://output");
//直接生成文件用这个
//$xmlWriter->save('test.docx');

完整的利用phpoffice/phpword生成word文档的代码示例(这是在生产环境下用的代码,确保可以正常使用,但是要注意phpword版本一定要一致):


        $PHPWord = new \PhpOffice\PhpWord\PhpWord();
        $PHPWord->setDefaultFontName('SimSun'); // 全局字体
        $PHPWord->setDefaultFontSize(11);     // 全局字号为:11pt

        // 设置文档的属性,这些在对文档右击属性可以看到,也可以省去这些步骤
        $properties = $PHPWord->getDocInfo();
        $properties->setCreator('张三');   // 创建者
        $properties->setCompany('公司'); // 公司
        $properties->setTitle('文档'); // 标题
        $properties->setDescription('描述'); // 描述
        $properties->setLastModifiedBy('张三'); // 最后修改
        $properties->setCreated( time() );      // 创建时间
        $properties->setModified( time() );     // 修改时间

        //添加字体样式字体留着下面使用
        $PHPWord->addFontStyle('titleStyle', ['size' => 16, 'bold' => true]);
        $PHPWord->addFontStyle('fStyle15', ['size' => 15]);
        $PHPWord->addFontStyle('fStyle14', ['size' => 14]);
        $PHPWord->addFontStyle('fStyle12', ['size' => 12]);
        $PHPWord->addFontStyle('fStyle11', ['size' => 11]);

        // 添加段落样式到以备下面使用
        // Normal会被默认调用
        $PHPWord->addParagraphStyle('Center', ['align' => 'center']);
        $PHPWord->addParagraphStyle(
            'Normal', [
                'align' => 'both',
                'spaceBefore' => 0,
                'spaceAfter' => 0,
                'spacing' => 56,
                'lineHeight' => 1.19,  // 行间距
                'indentation' => [ // 首行缩进
                    'firstLine' => 0
                ]
            ]
        );
        $PHPWord->addParagraphStyle(
            'firstLine', [
                'indentation' => [ // 首行缩进
                    'firstLine' => 500
                ]
            ]
        );
        // Section样式:
        $sectionStyle = [
            'orientation' => null,
            'marginLeft' => 1799,   //3.17cm  左边距
            'marginRight' => 1799,   //3.17cm 右边距
            'marginTop' => 1442,   //2.54cm   上边距
            'marginBottom' => 1442,   //2.54cm 下边距
            'pageNumberingStart' => 1, // 页码从1开始
            'headerHeight' => 851,   //1.5cm  页眉高度
            'footerHeight' => 993,   //1.75cm 页脚高度
       ];
        // 添加一页
        $section = $PHPWord->addSection($sectionStyle);

        // 下面这句是输入文档内容,注意这里用到了刚才我们添加的
        // 字体样式FangSong16pt和段落样式Normal
        $section->addText('服务合作协议', 'titleStyle', 'Center');
        $section->addTextBreak(1, 'fStyle15'); // 新起一个空白段落
        $section->addText('甲方:*****有限公司', 'fStyle15');
        $section->addText('乙方:张三', 'fStyle15');
        $section->addTextBreak(1);
        $section->addText('上述各方经平等自愿协商,签订本合同以共同遵守。');
        $section->addTextBreak(1);
        $section->addText('合作范围', 'fStyle14');
        $section->addText('甲方委托乙方进行****服务');
        $section->addText('合作期限', 'fStyle14');
        $section->addText('委托期2021年4月14日至2022年4月13日。本协议所拟合作期届为壹年,经双方协商同意,双方可续签协议。', 'fStyle11', 'firstLine');
        $section->addText('双方责任与权力', 'fStyle14');
        $section->addText('甲方应积极配合乙方,提供合法的、真实的、准确的、完整的资料,如因甲方提供的资料而引起的法律纠纷,由甲方负责。', 'fStyle11', 'firstLine');
        $section->addText('甲方应按照本协议的规定及时付款。', 'fStyle11', 'firstLine');
        $section->addText('乙方应积极配合甲方的工作,按时、保质、保量完成甲方委托的各项工作,并为甲方资料保密。', 'fStyle11', 'firstLine');

        $section->addText('收款条例', 'fStyle14');
        $section->addText('结算方式与时间:自双方合同结束之7日期内甲方将服务费用100.00元汇至乙方指定的账户。乙方收款后将开具普通发票给甲方,费用自付。', 'fStyle11', 'firstLine');
        $section->addText('如在协议执行过程中产生的争议,双方协商解决,若协商不成,任何一方可向签约地的法院提起申诉。', 'fStyle11', 'firstLine');
        $section->addText('本协议一式两份,甲、乙双方各一份,自签约日期起生效。', 'fStyle11', 'firstLine');
        $section->addTextBreak(5);

        $section->addText('甲方:********有限公司', 'fStyle12');
        $section->addText('乙方:', 'fStyle12');
        $section->addText('日期:2021年4月14日                     日期: 2021年4月14日', 'fStyle12');


        $filename = 'test.docx"';
        ob_end_clean();
        ob_start();
        header('Content-Type : application/vnd.openxmlformats-officedocument.wordprocessingml.document');
        header('Content-Disposition:attachment;filename=' . $filename);
        $xmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($PHPWord, 'Word2007');
        $xmlWriter->save("php://output");
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值