首页 > 其他分享 >react框架对Excel文件进行上传和导出

react框架对Excel文件进行上传和导出

时间:2024-05-25 23:31:36浏览次数:31  
标签:function sheet Excel react json html var csv 上传

1.首先需要安装xlsx第三方的库库
引入插件

npm install xlsx

react引入

import * as XLSX from 'xlsx';

1,首先设置jsx部分的  以下代码包含有导入excel文件和导出excel文件,读着可以根据需要,自己选择想要实现的功能 

代码如下(示例):

// import React from 'react';
import React, { useState } from 'react';
import * as XLSX from 'xlsx';
import './App.css';
function App() {
  // 导入本机的Excel文件到网页HTML文件当中
  // 读取文件
  function readWorkbookFromLocalFile() {
    var file = document.getElementById('inputfilename').files[0];
    if (file) {
      var reader = new FileReader();
 
      reader.onload = function (e) {
        var data = e.target.result;
        var workbook = XLSX.read(data, { //XLSX.read()方法会返回一个workbook 对象
          type: 'binary'
        });
        readWorkbook(workbook);
      };
      reader.readAsBinaryString(file);
 
    } else {
      alert('请先选择文件');
    }
  }
  // 分别创建json和csv的空列表
  var json = null;
  // var csv = '';
  const [csv, setCsv] = useState("")
  // 读取Excel并且显示在桌面上
  function readWorkbook(workbook) {
    // 工作表名称集合
    var sheetNames = workbook.SheetNames;
    // 这里我们只读取第一张sheet的内容
    var worksheet = workbook.Sheets[sheetNames[0]];
    //这里便可以得到csv格式
    setCsv(XLSX.utils.sheet_to_csv(worksheet))
    // csv = XLSX.utils.sheet_to_csv(worksheet);
    //使用csv2table()函数将其转换为简单的HTML表格,csv2table()函数定义在下一个代码块中
    document.getElementById('result').innerHTML = csv2table(csv);
    json = XLSX.utils.sheet_to_json(worksheet);
    // 成功转换为json格式后,可能表格中的中文属性名并不是后台所需要的字段名
    // 那么,就可以使用如下方法,遍历这个json对象,然后对其中的字段名进行修改
    for (var i in json) {
      for (var key in json[i]) {
        if (key === '年龄') {
          json[i]['age'] = json[i][key] //修改属性名为“age”
          delete json[i]['年龄'] //删除“年龄”
        } else if (key === '性别') {
          if (json[i][key] === '男') {
            json[i][key] = '1';
          } else {
            json[i][key] = '0';
          }
          json[i]['sex'] = json[i][key] //修改属性名为“sex”
          delete json[i]['性别'] //删除“性别”
        } else if (key === '姓名') {
          json[i]['username'] = json[i][key] //修改属性名为“username”
          delete json[i]['姓名'] //删除“姓名”
        } else if (key === '工号') {
          json[i]['workId'] = json[i][key] + ''; //修改属性名为“workId”
          delete json[i]['工号'] //删除“工号”
        }
      }
    }
  }
  // 将Excel文件转为html页面中可以显示出来的格式
  function csv2table(csv) {
    var html = '<table class="test1">';
    var rows = csv.split('\n');
    rows.pop(); // 最后一行没用的
    rows.forEach(function (row, idx) {
      var columns = row.split(',');
      columns.unshift(idx + 1); // 添加行索引
      if (idx === 0) { // 添加列索引
        html += '<tr>';
        for (var i = 0; i < columns.length; i++) {
          html += '<th>' + (i === 0 ? '' : String.fromCharCode(65 + i - 1)) + '</th>';
        }
        html += '</tr>';
      }
      html += '<tr>';
      columns.forEach(function (column) {
        html += '<td>' + column + '</td>';
      });
      html += '</tr>';
    });
    html += '</table>';
    return html;
  }
 
 
  // 导出Excel文件到本机中
  // csv转sheet对象
  function csv2sheet(csv) {
    var sheet = {}; // 将要生成的sheet
    csv = csv.split('\n');
    csv.forEach(function (row, i) {
      row = row.split(',');
      if (i === 0) sheet['!ref'] = 'A1:' + String.fromCharCode(65 + row.length - 1) + (csv.length - 1);
      row.forEach(function (col, j) {
        sheet[String.fromCharCode(65 + j) + (i + 1)] = { v: col };
      });
    });
    return sheet;
  }
  // 将一个sheet转成最终的excel文件的blob对象,然后利用URL.createObjectURL下载
  function sheet2blob(sheet, sheetName) {
    sheetName = sheetName || 'sheet1';
    var workbook = {
      SheetNames: [sheetName],
      Sheets: {}
    };
    workbook.Sheets[sheetName] = sheet;
    // 生成excel的配置项
    var wopts = {
      bookType: 'xlsx', // 要生成的文件类型
      bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
      type: 'binary'
    };
    var wbout = XLSX.write(workbook, wopts);
    var blob = new Blob([s2ab(wbout)], { type: "application/octet-stream" });
    // 字符串转ArrayBuffer
    function s2ab(s) {
      var buf = new ArrayBuffer(s.length);
      var view = new Uint8Array(buf);
      for (var i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
      return buf;
    }
    return blob;
  }
  /**
* 通用的打开下载对话框方法,没有测试过具体兼容性
* @param url 下载地址,也可以是一个blob对象,必选
* @param saveName 保存文件名,可选
*/
  function openDownloadDialog(url, saveName) {
    if (typeof url == 'object' && url instanceof Blob) {
      url = URL.createObjectURL(url); // 创建blob地址
    }
    var aLink = document.createElement('a');
    aLink.href = url;
    aLink.download = saveName || ''; // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
    var event;
    if (window.MouseEvent) event = new MouseEvent('click');
    else {
      event = document.createEvent('MouseEvents');
      event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
    }
    aLink.dispatchEvent(event);
  }
  // 传入csv,执行后就会弹出下载框
  function exportExcel() {
    var sheet = csv2sheet(csv);
    var blob = sheet2blob(sheet);
    openDownloadDialog(blob, '导出.xlsx');
  }
  function sum() {
    // var para=document.getElementById("").value
    alert("求和结果568")
  }
  return (
    <div className="App" style={{ backgroundColor: "white" }}>
      {/*<选择文件的input*/}
      <div className="choose" style={{ display: "inline", width: "100px", height: "50px", fontSize: "40px" }} >
        <input type="file" id="inputfilename" />
      </div>
      {/*读取文件的按钮*/}
      <div style={{ display: "inline", width: "100px", height: "50px", fontSize: "40px" }}  >
        <button onClick={readWorkbookFromLocalFile}>读取Excel表格</button>
      </div>
      {/* 导出Excel文件 */}
      <div style={{ display: "inline", width: "100px", height: "50px", fontSize: "40px" }}  >
        <button onClick={exportExcel}>导出Excel表格</button>
      </div>
      <button onClick={sum}>求和功能</button>
      {/* 显示所读取excel的区域*/}
      <div id="result"
        style={{ width: "1080px", height: "600px", fontSize: "40px", overflow: "scroll", backgroundColor: "lightblue" }}>
      </div>
    </div>
  );
}
export default App;

第二步,在第一步中导入文件到电脑上面时,在这部分的代码中,添加了

设置样式。
 

function csv2table(csv) {
    var html = '<table class="test1">';
    var rows = csv.split('\n');
    rows.pop(); // 最后一行没用的
    rows.forEach(function (row, idx) {
      var columns = row.split(',');
      columns.unshift(idx + 1); // 添加行索引
      if (idx === 0) { // 添加列索引
        html += '<tr>';
        for (var i = 0; i < columns.length; i++) {
          html += '<th>' + (i === 0 ? '' : String.fromCharCode(65 + i - 1)) + '</th>';
        }
        html += '</tr>';
      }
      html += '<tr>';
      columns.forEach(function (column) {
        html += '<td>' + column + '</td>';
      });
      html += '</tr>';
    });
    html += '</table>';
    return html;
  }

标签:function,sheet,Excel,react,json,html,var,csv,上传
From: https://blog.csdn.net/woliuhuaqiangla/article/details/139205534

相关文章

  • React后台管理(九)-- 页面开发前准备---Outlet布局组件封装
    文章目录前言一、组件源码+解析如下二、页面使用方式三、效果展示总结前言本文主要讲Outlet子路由渲染区域—>结构布局的封装。其中涉及的全局搜索hook函数,后面会单独拎出来讲,这期可先忽略,关注布局即可。一、组件源码+解析如下//@/layout/list/index.jsximport......
  • react19.0.0 调试工具
    react19.0.0调试工具网友的力量百度网盘:链接:https://pan.baidu.com/s/1eeoUNfHpn20gtnuo-mlgkg提取码:7hhf手动构建React采用monorepo管理方式,仓库下面有多个独立包,进入react-devtools-extensions包中cdpackages/react-devtools-extensions查看package.json,......
  • .NET Core中给上传图片的添加水印
    一.安装System.Drawing.Common库工具->NuGet包管理->程序包管理控制台输入命令Install-PackageSystem.Drawing.Common二.代码案例实现usingMicrosoft.AspNetCore.Http;usingMicrosoft.AspNetCore.Mvc;usingSystem.Drawing;usingSystem.Drawing.Imaging;usingSy......
  • Python 潮流周刊#52:Python 处理 Excel 的资源
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。本期周刊分享了12篇文章,12个开源项目,赠书5本《网络是怎样连接的》,全文1......
  • AI百度文库项目,上传内容实现被动收入,每天收入300-500
    就这个话题而言,我们谈的是百度文库这个平台的潜力。原理非常简单:你上传文件到百度文库,当其他用户下载了你的文件,你便可以获得相应的收益。当然,最高的收益往往来源于那些不易获取的资源。如果你手中有稀缺的资料,哪怕定价几百元,也总会有人愿意为之付费。值得强调的一点是,......
  • 用 Python 编写网络爬虫:从网页获取数据并存储到 Excel 文件
    在本篇博客中,我们将介绍如何使用Python编写一个简单的网络爬虫,用于从网页中提取数据,并将这些数据存储到Excel文件中。我们将使用Python中的一些库来实现这个功能,包括urllib.request、BeautifulSoup和openpyxl。1.网络爬虫的基本原理网络爬虫是一种程序,可以自动访问......
  • react19.0.0 仓库构建
    react19.0.0仓库构建运行指令npmrunbuild报以下错误panminxiang@Macreact%npmrunbuild>build>node./scripts/rollup/build-all-release-channels.jsBUILDINGreact.development.js(node_dev)COMPLETEreact.development.js(node_dev)BUILDINGreac......
  • react19.0.0 仓库安装
    react19.0.0仓库安装克隆仓库到本地:gitclonehttps://github.com/facebook/react.gitReactVersions中可以看到当前版本为19.0.0在项目下有个.nvmrc文件,指定了node版本为18.20.0(react18.3.1配套的node版本为14.17.6这跨度有点大啊)安装node18.20.0nvmins......
  • react 19.0.0 仓库安装
    react19.0.0仓库安装克隆仓库到本地:gitclonehttps://github.com/facebook/react.git在项目下有个.nvmrc文件,指定了node版本为18.20.0安装node18.20.0nvminstall18.20.0安装完成后切换node版本nvmuse,该命令会根据.nvmrc的配置切换到node18.20.0packa......
  • 在excel中使用python 快速作图示例
    前言Excel中可以使用python算是一个旧闻了,是python之父GuidovanRossum加入微软的重要产品。刚出来的第一时间我也尝鲜了,最近作图的时候,再次使用了这个功能,感觉非常方便,推荐大家也用一下。优点:Python在云端运行,无需部署环境。可以编写脚本来自动化日常的Excel任务......