wangeditor 粘贴word内容带样式

本文介绍了在使用wangeditor时遇到的粘贴word内容带有额外样式的问题,包括错误页面的呈现、代码表现以及两种解决方案。一是通过编辑器内置的粘贴文本样式过滤功能,二是针对已有数据在接口返回时进行处理。文中提供了相关代码示例,并提到了递归处理的注意事项,鼓励读者交流更多解决方案。

bug:最近遇到页面渲染数据多了<!--[if gte mso 9]<![endif]-->/

<!--[if gte mso 10]>↵<![endif]-->

 

 

分析原因,原来是富文本编辑器粘贴word内容是的样式问题,不同富文本编辑器处理方式略有不同,不过都大同小异,解决此问题考虑二处,一处是富文本编辑是就把多余的标签去掉,一处是针对已经上线的项目,数据库已经有此类数据,再从接口取到数据时稍做处理即可。下面详细展示错误页面和bug以及解决代码,如有不足,欢迎交流!

一:富文本编辑器编辑内容情况

1、页面呈现:

<!--[if gte mso 10]>↵<![endif]-->:

2、代码呈现:<!--[if gte mso 9]</xml><![endif]-->/

<!--[if gte mso 10]>↵<![endif]-->

 

<!--[if gte mso 9]><xml><w:LatentStyles DefLockedState="false"  DefUnhideWhenUsed="true"  DefSemiHidden="true"  DefQFormat="false"  DefPriority="99"  LatentStyleCount="260" >
省略中间几百行
<w:LsdException Locked="false"  Priority="99"  SemiHidden="false"  Name="Colorful Grid Accent 6" ></w:LsdException>
</w:LatentStyles></xml><![endif]-->

3、处理方式:wangeditor自带粘贴文本样式过滤:

3.1粘贴文本

注意,以下配置暂时对 IE 无效。IE 暂时使用系统自带的粘贴功能,没有样式过滤!

3.1.1关闭粘贴样式的过滤

当从其他网页复制文本内容粘贴到编辑器中,编辑器会默认过滤掉复制文本中自带的样式,目的是让粘贴后的文本变得更加简洁和轻量。用户可通过editor.customConfig.pasteFilterStyle = false手动关闭掉粘贴样式的过滤。

但不知为何,我的不生效,所以我使用了,自定义处理粘贴的文本内容:

3.1.2自定义处理粘贴的文本内容

使用者可通过editor.customConfig.pasteTextHandle对粘贴的文本内容进行自定义的过滤、处理等操作,然后返回处理之后的文本内容。编辑器最终会粘贴用户处理之后并且返回的的内容。

 

代码:

// 自定义处理粘贴的文本内容
    this.editor.customConfig.pasteTextHandle = function (content) {
    // content 即粘贴过来的内容(html 或 纯文本),可进行自定义处理然后返回
    if (content == '' && !content) return ''
    let str = content;
    //处理的标签里的多余代码
    str = str.replace(/<xml>[\s\S]*?<\/xml>/ig, '');
    str=str.replace('/(\\n|\\r| class=(")?Mso[a-zA-Z]+(")?)/g','');
    let reg=new RegExp('<!--(.*?)-->','g')
    str=str.replace(reg,'');
    //str = str.replace(/<style>[\s\S]*?<\/style>/ig, '')
    //str = str.replace(/<\/?[^>]*>/g, '')
   // str = str.replace(/[ | ]*\n/g, '\n')
   // str = str.replace(/&nbsp;/ig, '')
    console.log('富文本的content',JSON.parse(JSON.stringify(content)))
    console.log('****str修改后的content str', str)
    return str
}

 

二:此外,对于以前编辑成功入库的数据,后台传回来的文本(标签内容如上)也带有<!--[if gte mso 9]</xml><![endif]-->的情况进行处理

接口数据呈现标签和文本里都有:

 

接口数据:

 

接上条截图:

 

代码:

//在渲染页面前处理后台传过来的<!--[if gte mso 9]><xml></xml><![endif]-->代码
/*
* params:str1 富文本编辑器的样式
* params:str2 富文本编辑器内容
* */
handleContent:function(str1,str2){
            if ((str1== ''||str2=='') && (!str1||!str2)) return ;
            if (str2.includes('<![endif]-->')){
                //去除msg_content样式里的多余代码
                str1 = str1.replace(/<xml>[\s\S]*?<\/xml>/ig, '');
                str1=str1.replace('/(\\n|\\r| class=(")?Mso[a-zA-Z]+(")?)/g','');
                let reg=new RegExp('<!--(.*?)-->','g')
                str1=str1.replace(reg,'');
                //去除original_content文本里的多余代码
                let word1='<!--[if gte mso 9]>';
                let word2='<!--[if gte mso 10]>';
                let word3='<![endif]-->';
                if (str2.includes(word1)) {
                    str2=this.actions.cancelWordStyle(str2,word1,word3);
                }
                else if (str2.includes(word2)) {
                    str2=this.actions.cancelWordStyle(str2,word2,word3);
                }
                return {str1,str2}
            }
            else {
                return {str1,str2}
            }
        },
        //递归去除<!--[if gte mso 10]>
        cancelWordStyle:function(str2,word1,word2){
             if (str2.includes(word1)) {
                str2=str2.replace(word1,'');
                str2=str2.replace(word2,'');

                if (str2.includes(word1)) {
                    str2=this.actions.cancelWordStyle(str2,word1,word2)
                    return str2;
                }
                else return str2;
            }
            else return str2;
        },

递归一般情况下少用为妙,应该有其他简单方法,可以去掉全文多处多余<!--[if gte mso 10]>,有小伙伴处理到这个问题的,多多交流呀

 

 

本文参考 http://www.manongjc.com/article/39953.html

 

summernote编辑器可参考:https://blog.youkuaiyun.com/hncsl/article/details/52804618

 

<think>好的,我现在需要帮助用户了解如何使用wangEditor导出Word文档。首先,我得回顾一下用户提供的引用内容,看看有哪些相关信息可用。引用3提到WangEditor5可以将内容转为Word并下载,里面分步骤讲解了如何创建工具栏类、实现方法、页面代码和效果图。引用4和5也涉及到导出或转换Word内容,可能有关联。 用户的问题是如何导出Word文档,所以重点应该在引用3,因为那里直接提到了转为Word并下载的方法。我需要先理解引用3的具体步骤。引用3提到需要创建工具栏类,添加自定义按钮,然后实现转换逻辑。转换的核心可能是将编辑器中的HTML内容转换为Word支持的格式,比如使用Blob对象和FileSaver.js来触发下载。 接下来,用户可能想知道具体的代码实现,所以需要提供一个清晰的示例。根据引用3,可能需要引入依赖库如FileSaver.js,然后在工具栏配置中添加自定义按钮,并绑定点击事件处理函数。处理函数中,获取编辑器的HTML内容,转换成Blob,然后使用saveAs方法下载。 同时,要确保用户注意到可能的注意事项,比如HTML到Word的格式兼容性问题,可能需要手动调整CSS样式或使用特定的MIME类型。此外,引用5提到从Word粘贴内容时的样式问题,可能在导出时也会遇到类似问题,需要提醒用户检查内容格式。 还需要考虑用户是否可能遇到其他问题,比如如何集成工具栏按钮,是否需要额外的配置,或者是否需要处理图片等媒体资源。引用2和5提到了导入Word时的处理,但导出时可能图片需要Base64编码或其他处理方式,不过引用3的示例中没有提到这点,可能需要进一步说明。 最后,生成相关问题时要围绕导出功能,可能涉及优化导出格式、处理复杂内容样式调整等。确保问题覆盖用户可能感兴趣的扩展领域,比如导入和导出的结合使用,或者与其他编辑器的对比。</think>### wangEditor导出Word文档实现方法 在wangEditor中实现导出Word功能,主要通过将富文本内容转换为Word兼容的HTML格式文件实现。以下是具体步骤和代码实现: 一、核心实现步骤 1. 获取编辑器HTML内容: ```javascript const editor = new E('#editor') const htmlContent = editor.getHtml() ``` 2. 创建Word文件模板: ```javascript const wordTemplate = ` <html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> ${htmlContent} </body> </html> ``` (引用3)[^3] 3. 生成下载链接: ```javascript import { saveAs } from 'file-saver' function exportToWord() { const blob = new Blob([wordTemplate], { type: "application/msword" }) saveAs(blob, "document.doc") } ``` 二、完整实现示例 ```javascript // 创建自定义工具栏按钮 class WordMenu { constructor() { this.title = '导出Word' this.icon = '⌬' this.tip = '导出为Word文档' } getValue(editor) { return '' } isActive(editor) { return false } exec(editor, value) { const html = editor.getHtml() const template = this.createWordTemplate(html) this.downloadFile(template) } createWordTemplate(content) { return `<!DOCTYPE html><html><head><meta charset="UTF-8"></head><body>${content}</body></html>` } downloadFile(content) { const blob = new Blob([content], { type: 'application/msword' }) saveAs(blob, `document_${new Date().getTime()}.doc`) } } // 注册菜单 const editor = new E('#editor') editor.config.registerMenu('wordExport', WordMenu) editor.create() ``` (引用3) 三、注意事项 1. 文件格式兼容性需添加Word专用命名空间声明: ```html <html xmlns:w="urn:schemas-microsoft-com:office:word"> ``` 2. CSS样式建议使用内联样式: ```html <p style="font-size:14px; color:#333">示例文本</p> ``` 3. 图片处理建议转换为Base64格式: ```javascript // 在导出前处理图片 document.querySelectorAll('img').forEach(img => { if (!img.src.startsWith('data:')) { // 转换为Base64 } }) ``` (引用5)[^5]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值