前端实现识别并下载markdown文本中格式为Table的数据

需求

在一串markdown文本字符串中,若存在table格式的数据,显示下载按钮,点击可将数据下载成excel格式

md格式Table数据样例
`
需求名称 | 用例名称 | 前置条件 | 用例步骤 | 预期结果 | 用例等级
---|---|---|---|---|---
列表倒序排列 | 验证列表倒序排列功能 | 用户已登录且有多个条目 | 1.打开列表页面 2.观察列表内容的排序 | 所有列表内容按照首次创建的时间倒序排列 | P1
...
`;   

一开始打算用正则去命中,但是用正则匹配容易漏掉某些特殊情况

解决方案

npm install markdown-it xlsx

MarkdownIt.render方法能将 markdown 字符串转换为 HTML,很牛逼,然后再通过html去截取table

  const matchTable = (mdContent) => {
    const mdParser = markdownIt();
    // 将Markdown内容转换为HTML
    const html = mdParser.render(mdContent);
    // 使用HTML表格正则表达式匹配表格部分
    const tableRegex = /<table[\s\S]*?<\/table>/g;
    return html.match(tableRegex);
  };
  function markdownTableToExcel(mdContent) {
    // 解析Markdown内容
    const matchedTables = matchTable(mdContent);
    if (matchedTables) {
      for (const table of matchedTables) {
        // 将HTML表格转换为DOM结构(这里假设在浏览器环境下)
        const tempDiv = document.createElement("div");
        tempDiv.innerHTML = table;

        const tableElement = tempDiv.querySelector("table");
        if (!tableElement) continue;

        // 将DOM表格转换为二维数组
        const tableData = Array.from(tableElement.rows).map((row) =>
          Array.from(row.cells).map((cell) => cell.innerText.trim())
        );

        // 创建工作簿对象
        const workbook = XLSX.utils.book_new();

        // 将表格数据转换为 worksheet 对象
        const worksheet = XLSX.utils.aoa_to_sheet(tableData);

        // 添加worksheet到workbook
        XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1");

        // 导出 Excel 文件
        const wbout = XLSX.write(workbook, { bookType: "xlsx", type: "array" });

        // 创建 Blob 并下载
        const blob = new Blob([wbout], { type: "application/octet-stream" });
        const url = URL.createObjectURL(blob);
        const link = document.createElement("a");
        link.href = url;
        link.download = "table.xlsx";
        document.body.appendChild(link);

        // 触发点击以下载
        link.click();

        // 清理
        setTimeout(() => {
          document.body.removeChild(link);
          URL.revokeObjectURL(url);
        }, 0);
      }
    }
  }

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将HTML格式文本转换为带有样式的Markdown文本可能会比较困难,因为Markdown不支持所有HTML标记和样式。但是,您可以尝试使用turndown插件和一些自定义规则来实现这一目标。 首先,您需要使用turndown插件来保留HTML标记和属性,例如turndown-plugin-keep插件。然后,您可以编写自定义规则来将HTML标记转换为Markdown标记,并将样式应用于Markdown标记。 例如,以下代码演示了如何将HTML文本转换为带有样式的Markdown文本: ```javascript const TurndownService = require('turndown'); const turndownPluginGfm = require('turndown-plugin-gfm'); const turndownPluginKeep = require('turndown-plugin-keep'); const turndownService = new TurndownService(); const gfm = turndownPluginGfm.gfm; const keep = turndownPluginKeep.plugin; // 自定义规则:将h1标记转换为加粗的Markdown文本 turndownService.addRule('h1', { filter: 'h1', replacement: function (content) { return '**' + content + '**'; } }); // 自定义规则:将p标记转换为斜体Markdown文本 turndownService.addRule('p', { filter: 'p', replacement: function (content) { return '*' + content + '*'; } }); turndownService.use(gfm).use(keep); const html = '<h1>Hello World</h1><p>This is italic and <strong>bold</strong>.</p>'; const markdown = turndownService.turndown(html); console.log(markdown); ``` 在上面的示例,我们使用turndown-plugin-keep插件来保留HTML标记和属性,然后添加了两个自定义规则,将h1标记转换为加粗的Markdown文本,将p标记转换为斜体Markdown文本。最后,我们使用turndownService将HTML文本转换为Markdown文本,并应用了自定义规则。 请注意,这只是一个简单的示例,您可能需要编写更复杂的自定义规则来处理更多的HTML标记和样式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值