react项目导出数据doc格式及其他格式方法

简介: react项目导出数据doc格式及其他格式方法

1.场景


如下图所示,项目要求对页面中的数据下载到本地,并以某种类型展示,如Word、doc、html等。在这个项目中要求下载为doc文件和HTML文件,其实下载功能还是很简单的,关键的地方就是下载后的格式问题,比如doc其实就是表格或者文档的格式。

6e59d385cd5d455fa81962910e525491.png

image.png

2.思路


我的思路是这样的,我会根据需求将需要导出的数据,在项目中找个地方以table、th表格标签的形式写,然后设置display:none,目的是不让多出来的结构影响到原本的页面,然后绑定ref,然后再通过模板字符串的形式,渲染出来。下面我是代码实例。

3.实现


第一步,准备数据,隐藏标签,绑定ref


             // 1.准备数据,要下载的数据,以表格的形式书写。
               <div ref={wrapperRef}>
                     <table style={{display: "none"}} className='table11_7 resultTable'>
                          <tr>
                              <th>序号</th>
                              <th>名称</th>
                              <th>是否存在漏洞</th>
                              {/* <th>开放情况</th> */}
                          </tr>
                          {list.map((ele, idx) => (
                              <tr className='tr'>
                                  <td className='td td1'>{idx + 1}</td>
                                  <td className='td td2'>{ele.data.Id}</td>
                                  <td className='td td3'>{ele.data.status} </td>
                                  {/* <td className='td td4'> </td> */}
                              </tr>
                          ))}
                     </table>
               </div>

第二步,通过模板字符串生成数据


需要注意的是,如果不以table标签书写,下载后的doc文件很乱,html则没事,所以还是尽量用table标签去写。

代码中的最后几行是下载功能,个人感觉是挺万金油的,可以根据需要下载为任意类型的文件

image.png

以下代码实例为,点击按钮下载。

 <Button
                        onClick={(e) => {
                            let resHtml = `
                             <!DOCTYPE html>
                             <html lang="en">
                             <head>
                                 <meta charset="UTF-8">
                                 <meta http-equiv="X-UA-Compatible" content="IE=edge">
                                 <meta name="viewport" content="width=device-width, initial-scale=1.0">
                                 <title>Document</title>
                                 <style>
                                    .table11_7 table {
                                        width:500px;
                                        margin:15px 0;
                                        border:0;
                                    }
                                    .table11_7 th {
                                        background-color:#00A5FF;
                                        color:#FFFFFF
                                    }
                                    .table11_7,.table11_7 th,.table11_7 td {
                                        font-size:0.95em;
                                        width:800px;
                                        text-align:center;
                                        padding:10px;
                                        border-collapse:collapse;
                                    }
                                    .table11_7 th,.table11_7 td {
                                        border: 1px solid #2087fe;
                                        border-width:1px 0 1px 0;
                                        border:2px inset #ffffff;
                                    }
                                    .table11_7 tr {
                                        border: 1px solid #ffffff;
                                    }
                                    .table11_7 tr:nth-child(odd){
                                        background-color:#aae1fe;
                                    }
                                    .table11_7 tr:nth-child(even){
                                        background-color:#ffffff;
                                    }
                                 </style>
                             </head>
                             <body>
                                <div style="display:flex;">  
                                    <div> ${listRef.current.innerHTML}</div>
                                </div>
                                <div style="display:flex;"> 
                                    <div style=" ">
                                         ${listRef3.current.innerHTML}</div>
                                    </div>
                                </div>
                             </body>
                             </html>
                            `
                            var datastr = "data:text/html;charset=utf-8," + encodeURIComponent(resHtml)
                            var downloadAnchorNode = document.createElement("a")
                            downloadAnchorNode.setAttribute("href", datastr)
                            downloadAnchorNode.setAttribute(
                                "download",
                                `${localStorage.getItem("verboseNameRaw")}-${localStorage.getItem("isStart")}.html`
                            )
                            downloadAnchorNode.click()
                            downloadAnchorNode.remove()
                        }}
                    >
                        .HTML
                    </Button>
相关文章
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
163 2
|
9天前
|
前端开发 UED 开发者
React 数据表格分页实现
本文详细介绍了如何在React中实现数据表格的分页功能,包括基础实现、常见问题及解决方案。通过状态管理和事件处理,我们可以有效地减少页面加载时间,提升用户体验。文章提供了完整的代码示例,帮助开发者解决分页按钮样式、按钮过多和初始加载慢等问题,并给出了相应的优化方案。
84 53
|
10天前
|
前端开发 搜索推荐 测试技术
React 数据表格排序与过滤
本文介绍了如何在 React 中实现数据表格的排序和过滤功能,从基础概念到实际代码实现,涵盖排序和过滤的基本原理、实现步骤、常见问题及解决方法。通过合理管理状态、优化性能和避免常见错误,帮助开发者提高用户体验和开发效率。
26 4
|
1月前
|
前端开发
|
2月前
|
前端开发 JavaScript UED
react或者vue更改用户所属组,将页面所有数据进行替换(解决问题思路)____一个按钮使得页面所有接口重新请求
在React或Vue中,若需在更改用户所属组后更新页面所有数据但不刷新整个页面,可以通过改变路由出口的key值来实现。在用户切换组成功后,更新key值,这会触发React或Vue重新渲染路由出口下的所有组件,从而请求新的数据。这种方法避免了使用`window.location.reload()`导致的页面闪烁,提供了更流畅的用户体验。
56 1
react或者vue更改用户所属组,将页面所有数据进行替换(解决问题思路)____一个按钮使得页面所有接口重新请求
|
1月前
|
Android开发
jmessage-react-plugin的正确引入方法
jmessage-react-plugin的正确引入方法
12 1
|
2月前
|
前端开发 JavaScript 开发者
请详细介绍React挂载阶段的方法。
请详细介绍React挂载阶段的方法。
53 9
|
2月前
|
前端开发
react中使用Modal.confirm数据不更新的问题解决
文章讨论了在React中使用Ant Design的`Modal.confirm`时更新数据不生效的问题,并提供了解决方案。原因是React状态更新可能是异步的,导致Modal的内容更新后不会立即反映在UI上。解决办法是在状态更新后使用`useEffect`钩子来调用Modal实例的`update`方法,从而更新Modal的内容。
83 0
react中使用Modal.confirm数据不更新的问题解决
|
2月前
封装react-antd-table组件参数以及方法如rowSelection、pageNum、pageSize、分页方法等等
文章介绍了如何封装React-Antd的Table组件,包括参数和方法,如行选择(rowSelection)、页码(pageNum)、页面大小(pageSize)、分页方法等,以简化在不同表格组件中的重复代码。
61 0
|
2月前
|
前端开发
React使用hooks遇到的坑_state中的某几个属性数据变成了空字符
本文讨论了在React使用hooks时遇到的一个问题:state中的某些属性数据变成了空字符。作者通过在修改函数中重新解构赋值来获取最新的state值,解决了因数据更新不及时导致的问题。
69 0