CKEditor: 实现word嵌入浏览器并导出为word实现方案

2,008 阅读2分钟

俗话说的好 羊毛出在羊身上,在这个国产软件贫弱的时代,如何从国外软件身上薅羊毛成了中小型企业开发者的必备技能。

  1. 没有技术实力去自己造好的工具
  2. 国外好的工具收费贵的要死

最近公司的需求是: 将用户的word文档内容展现在web应用上,在线编辑并导出为word。

看了一下火遍全网的老牌富文本编辑器CKEditor (原FCKEditor) 里面导出word功能居然每月要80刀!? 这一年大几千的,给公司省点钱,让老板更早开上法拉利他不香吗?

image.png

这里给大家提供一个思路: 充分利用CKEditor的功能,还能剩下导出word的钱。

  1. 进入CKEditor5官网,按照官网的教程将编辑器导入到自己的项目中

  2. 由于CKEditor5本身自带从office粘贴进编辑器的功能,所以我们可以放心大胆的将word/excel等C内容V到富文本编辑器中(注意只支持微软家的)

  3. 由于编辑器中的内容使用CKEditor自带的.getData()方法,可以将编辑器内容读取为html文档,所以我们直接将html文档转化为word再导出即可

  4. 使用htmlDocx和saveAs两个库,读取html并导出为word

npm install html-docx-js  file-saver

上完整代码(React框架)


import * as React from 'react';
// 引入CKEditor并使用
import Editor from 'ckeditor5-custom-build/build/ckeditor';
import { CKEditor } from '@ckeditor/ckeditor5-react'
// 引入htmlDocx和saveAs
import htmlDocx from 'html-docx-js/dist/html-docx';
import saveAs from 'file-saver';


export default function TemplateEditer(props) {
    const [savedEditData, setSavedEditData] = React.useState(null)
    const [editor, setEditor] = React.useState(null)  // 保存editor实例

    const saveEditorData = () => {// 保存当前模板为html
        const data = editor.getData();
        setSavedEditData(data)
    }

    const exportToWord = () => {// 导出为word
        var content = savedEditData
        var page = '<!DOCTYPE html><html><head><meta charset="UTF-8"></head><body>' + content + '</body></html>'
        var converted = htmlDocx.asBlob(page);
        // 用 FielSaver.js里的保存方法 进行输出
        saveAs(converted, 'document.docx');
    }

    return (
        <>
            <button onClick={saveEditorData}>保存当前模板内容</button>
            <button onClick={exportToWord}>导出为word</button>
            <CKEditor
                editor={Editor}
                data='<p>默认模板</p>'
                onReady={editor => { // 初始化时保存editor实例为state
                    setEditor(editor)
                }}
            />
        </>
    );
}

下面是官方word导出和自实现导出效果对比

原内容

image.png

CKEditor官方导出内容

image.png

自实现的导出内容

image.png

会发现自己实现的既没有水印 排版也比官方的好看一丢丢,
至此 从word到Editor 和从Editor到word都实现了 , 薅的一手好羊毛