使用 SheetJS 将包含合并单元格的 .xlsx 文件转换为 JSON

2023-12-26

我正在尝试使用 SheetJS 读取 .xlsx 文件并将其转换为 JSON。我能够读取简单的(没有合并单元格).xlsx 文件并将其转换为 JSON,但我无法正确处理合并单元格。

问题是我有一个 .xlsx 文件,其中包含不同语言的产品。

我尝试在不同的网站和 SheetJS 的 github 存储库上寻找解决方案https://github.com/sheetjs/js-xlsx/#json https://github.com/sheetjs/js-xlsx/#json取得了平庸的成功。主要解决如何编写合并单元格。

function handleFile(e) {
   var files = e.target.files, f = files[0];
   var reader = new FileReader();
   reader.onload = function(e) {
      var data = new Uint8Array(e.target.result);
      var workbook = XLSX.read(data, {type: 'array'});
      let result = '';
      let sheet_name_list = workbook.SheetNames;
      // iterate through sheets
      sheet_name_list.forEach(function (y) {

         workbook.Sheets[y]['!merges'].map(r => {
             let startChar = XLSX.utils.encode_range(r).split(':')[0].replace(/[^a-zA-Z]+/g, '');
             let endChar = XLSX.utils.encode_range(r).split(':')[1].replace(/[^a-zA-Z]+/g, '');
             let number = XLSX.utils.encode_range(r).split(':')[0].match(/[+-]?\d+(?:\.\d+)?/g)[0];
             for (let i = numbersFromLetters(startChar); i < numbersFromLetters(endChar); i++) {
                workbook.Sheets[y][numbersToLetters(i + 1) + number] = {t:'s'};
                workbook.Sheets[y][numbersToLetters(i + 1) + number].v = workbook.Sheets[y][XLSX.utils.encode_range(r).split(':')[0]].v;
                workbook.Sheets[y][numbersToLetters(i + 1) + number].h = workbook.Sheets[y][XLSX.utils.encode_range(r).split(':')[0]].v;
                workbook.Sheets[y][numbersToLetters(i + 1) + number].w = workbook.Sheets[y][XLSX.utils.encode_range(r).split(':')[0]].v;
                workbook.Sheets[y][numbersToLetters(i + 1) + number].r = '<t>' + workbook.Sheets[y][XLSX.utils.encode_range(r).split(':')[0]].v + '</t>';
             }

         });   
         // Convert the cell value to JSON
         //let roa = XLSX.utils.sheet_to_json(workbook.Sheets[y]);
         //let roa = XLSX.utils.sheet_to_json(workbook.Sheets[y], {range: 1});
         let roa = XLSX.utils.sheet_to_json(workbook.Sheets[y], {header: 1});
         //let roa = XLSX.utils.sheet_to_json(workbook.Sheets[y], {skipHeader: true});
         //let roa = XLSX.utils.sheet_to_json(workbook.Sheets[y], {header: 1, range: 1});
         if (roa.length > 0) result = roa;

      });
      console.log(result);
   };
   reader.readAsArrayBuffer(f);
}

For better perception this is an example excel file with merged language cell: enter image description here

我想要这个结果:

[
   { "languages": 
      [
         {
            "language": "US", 
            "name": "blue pants"
         },
         {
            "language": "DE", 
            "name": "blaue Hose"
         },             
         {
            "language": "ES", 
            "name": "pantalones azules"
         }
      ],
      "price": 29.9,
      "category": "pants"
   },
   ...
]

根据我执行的注释代码的哪一部分,我会得到不同的结果,这些结果看起来与我想要实现的代码类似,或者至少可以进一步使用。但对于每一个结果,我都需要进一步摆弄,在我看来,可能会有更好的解决方案。


const workbook = XLSX.readFile(fileName, readOptions);
    const sheetNames = workbook.SheetNames;
    for (let worksheet of sheetNames) {
      if (workbook.Sheets[worksheet]['!merges'])
        workbook.Sheets[worksheet]['!merges'].map((merge) => {
          const value = XLSX.utils.encode_range(merge).split(':')[0];
          for (let col = merge.s.c; col <= merge.e.c; col++)
            for (let row = merge.s.r; row <= merge.e.r; row++)
              workbook.Sheets[worksheet][String.fromCharCode(65 + col) + (row + 1)] = workbook.Sheets[worksheet][value];
        });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 SheetJS 将包含合并单元格的 .xlsx 文件转换为 JSON 的相关文章

  • Excel VSTO 加载项可以与 Excel 2007 和 2010 兼容吗?

    是否可以使用 VSTO 开发一个可部署到 Excel 2007 和 2010 的 Excel 加载项 任何有关此主题的详细资源的链接也将不胜感激 我似乎无法在谷歌上找到任何专门解决此问题的内容 我正在使用 Visual Studio 201
  • Redux 状态在窗口重新加载时重置(客户端)

    我有非常大且复杂的对象 例如 userInfo chatInfo 等 就像具有非常大且嵌套信息的对象和数组一样 每次刷新页面时 我的 React 应用程序都会重置 redux 状态 我必须再次调用所有这些 API 我对这个主题做了一些研究
  • Excel工作表中的动态减法公式

    我需要在Excel中编写一个动态减法公式 该公式从其上方的单元格中减去 指定列的 单元格 例如 A2 A1 G1 G列固定 and A3 A2 G2 and A4 A3 G3 等等 Excel 足够智能 可以使用动态引用和对当前单元格的相对
  • 使用 Javascript 实现 Tinder 风格的拖放手势?

    我正在尝试找出哪些库可以用于仅使用 Javascript 的 Tinder 风格拖放手势 需要创建一个响应拖动手势的 HTML 元素 触摸并按住时 允许元素跟随用户的手指移动 当用户移开手指时 该元素会 动画回到原来的位置 如果元素在释放时
  • Javascript hasOwnProperty 在事件对象上总是 false?

    我希望有人可以帮助澄清与事件对象相关的 hasOwnProperty 方法 我正在尝试克隆鼠标事件 最终该对象将被传递到 iframe 我已经构建了一个 克隆 函数 但每当我尝试克隆窗口事件 即滚动 单击等 时 hasOwnProperty
  • 将图像缩略图上传到服务器,而不上传整个图像

    据我所知 我在这里问的是不可能的 但我想无论如何我都会问 以防我遗漏了什么 假设您想让用户上传 JPG 图像 并且这些图像被缩放为较小的图标 并且原始图像始终被丢弃并且不再需要 有没有什么方法可以在大多数现代浏览器中普遍使用 让用户选择硬盘
  • 如何在React-Native中选择ListView的一项?

    我是 React Native 的新手 我想使用 ListView 选择一项 当我第一次按下 item 时 ListView renderRow 被调用 但终究不起作用 我该如何修复这个错误 我的问题出在哪里 我写了一个演示here htt
  • 方向改变后的javascript最大视口高度Android和iOS

    目标 查找设备的最大视口高度 包括设备的空间address bar这样我们就可以动态调整 min body 的大小并将内容向上推 问题 移动浏览器处理方向状态的方式不同 方向变化时更新 DOM 属性的方式也不同 使用 JavaScript
  • Javascript 自时间戳以来经过的时间

    我试图通过将其存储在变量中来 缓存 一些信息 如果 2 分钟过去了 我想获取 实时 值 调用 url 如果 2 分钟还没有过去 我想从变量中获取数据 我基本上想要的是 if time passed is less than 2 minute
  • 如何根据另一个动态下拉列表的值创建动态下拉列表?

    我有一个下拉菜单 当我选择一个选项时 它会创建一个动态下拉菜单 到目前为止 一切都很好 但我想创建另一个动态下拉列表 现在基于另一个动态下拉列表的值 我该怎么做 第一个动态下拉列表有效 我猜第二个无效 因为动态变量 div 没有静态 ID
  • 尝试使用 CasperJS 跟踪 iframe 中的链接

    我正在尝试使用CasperJS http casperjs org index html跟踪 iframe 中的链接 但我似乎无法获取 iframe 的文档 这是使用我找到的 iframe 示例页面进行的测试 第三个 iframe 有一个名
  • 无法提取 Typescript 中的对象值

    我一直在尝试将 JavaScript Web 表单转换为 Typescript 但无法弄清楚如何处理以下内容 在 JavaScript 中有效 let fieldValues JSON parse cookieData let keys O
  • Facebook 登录无法在移动浏览器中使用

    我使用 react facebook login 在我的网站中实现了 facebook 登录module https github com keppelen react facebook login 我在 ComponentDidMount
  • Javascript“命名空间”和 jQuery AJAX

    我正在使用此处列出的建议 http www odetocode com articles 473 aspx http www odetocode com articles 473 aspx 使用模拟的JavaScript AJAX网络聊天系
  • 使用 jQuery 更改 SVG 元素的“xlink:href”属性

    我正在尝试使用单击事件更改 xlink href 属性 到目前为止它部分有效 这就是我正在做的 HTML a href class ui btn ui corner all ui shadow editIcon style text ali
  • Webpack:如何将 javascript 注入 HTML 而不是单独的 JS 文件

    有没有办法让 webpack 将输出注入 HTML 而不是单独的文件 我不得不使用html webpack inline source plugin https github com DustinJackson html webpack i
  • 单击时突出显示文本(javascript jquery html)

    当您在所有浏览器中双击某个单词时 它们会自动突出显示单击下的单词 但是否有可能找到一种方法exact单击一下就会发生同样的事情吗 我想这涉及到的事情可能是 TextRange 的东西 对所有段落 或整个正文或 div 的 onclick 做
  • 如何将输入字段值作为 URL 查询字符串传递,单击提交按钮将打开该字符串?

    我必须输入这样的字段
  • 检测图像是否损坏或损坏

    我需要以编程方式检查用户在我的应用程序上选择作为壁纸的图像是否已损坏或损坏 基本上我为用户提供了选择自己的图像作为壁纸的选项 现在 当图像加载时 我只想检查它是否已损坏 如果您正在寻找 PHP 解决方案而不是 javascript 解决方案
  • javascript:获取带有单位的CSS prop值[重复]

    这个问题在这里已经有答案了 我的代码是这样的 image 1 position absolute top 3vw 我的尝试 http jsfiddle net z8k6t3fb 1 http jsfiddle net z8k6t3fb 1

随机推荐

  • 放置 onSharedPreferenceChangeListener 的最佳位置

    我正在尝试向我的应用程序添加设置 我已添加新设置 但不知道该放在哪里OnSharedPreferenceChangeListener 我把它放在活动中并添加了一个Log d 但是Log d 永远不会被触发 有任何想法吗 最佳地点根据Andr
  • 如何获取空值的先前值

    我的表中有以下数据 Id FeeModeId Name Amount 1 NULL NULL 20 2 1 Quarter 1 5000 3 NULL NULL 2000 4 2 Quarter 2 8000 5 NULL NULL 500
  • 如何检测用户是否已经打开了某个网址并在已打开的情况下重定向到相同的网址?

    谁能告诉我如何检测用户是否已打开链接 url 选项卡 如果 url 已打开 是否可以将链接重定向到活动浏览器选项卡 例如 用户单击链接 js 代码将在浏览器中打开一个新选项卡 现在 如果用户再次单击该链接 我希望他重定向到活动会话 而不是打
  • 无法播放某些视频

    我正在尝试通过我们的服务器在 Android 设备上播放电影 它不是一个媒体服务器 只是一个普通的 Apache 服务器 我们使用相同的 API 来访问 iPhone 上的视频 效果很好 在 Android 设备上 某些视频可以播放 而另一
  • Office 插件开发:在 Word 2016 中插入表格

    我尝试使用 Office js 在文档正文中插入表格 但无济于事 我使用了以下代码 function insertSampleTable showNotification Insert Table Inserting table Word
  • 无法看到部署的 Firebase 功能

    我按照以下步骤操作 Firebase CLI 命令行界面 需要 Node js 和 npm 您可以按照以下说明进行安装https nodejs org https nodejs org 安装 Node js 也会安装 npm 安装 Node
  • 将 Fog 与 Ruby 结合使用生成预签名 URL 以将文件放入 Amazon S3 中

    我正在使用 Fog gem 生成预签名的 url 我可以成功地执行此操作以获得对该文件的读取访问权限 这就是我所做的 fog s3 Fog Storage new provider gt AWS aws access key id gt k
  • 从 Exact Online 检索联系人时出现错误

    我想在 Exact Online 中检索一家公司的所有联系人 但收到以下错误 select from AccountContacts Error itgenusg026 不支持请求的 3 308 列数 将请求的列数限制为最多 1 000 列
  • 哪些 MVC 框架可用于 Java 桌面/winform 应用程序?

    我要开发一个winform应用程序 我想将模型 视图和控制器分开 我没有使用过任何Java MVC框架 并且已经脱离Java几年了 谁能根据自己的经验告诉我一些合适的框架及其优缺点 我计划使用 NetBeans IDE Griffon ht
  • 使用不同的数据库进行开发与生产 Flask

    我有一个 Flask 应用程序 它根据生产环境变量和开发环境变量使用不同的数据库 我担心开发人员在运行本地 Flask 应用程序之前忘记设置 FLASK ENV development 然后突然对生产数据库进行更新 我想到的唯一简单的解决方
  • 维基数据的重复结果

    我创建了以下对 Wikidata 的 SPARQL 查询 该查询的结果是与德国各州相关的记录 但正如您所看到的 结果连续出现四次 您可以在此处测试它 https query wikidata org https query wikidata
  • 使用 php 更改 css 背景图像

    我正在为这个网站做一个个人资料 我想做一个像 Facebook 那样的封面照片元素 我遇到的问题是 首先如何保存封面的背景图片 比如 我可以将图像的 url 保存在数据库中 但是我如何才能将其放入 css 中呢 我真的不想只是说 div s
  • 如何覆盖父/扩展元素内部的 Xsd 元素

    我正在我的公司创建一个新的数据交换服务 我们想要扩展 core xsd 定义文件中定义的现有对象 这是我需要做的一个例子
  • 当鼠标悬停在浏览器栏/后退按钮上时,Javascript 弹出窗口

    我想在这个页面上模仿这个确切的功能 将鼠标移向顶部浏览器栏 http my personal growth com personal growth what anthony robbins teaches about emotions an
  • iOS 9 中的 Facebook 登录 SDK

    我正在使用 facebook 登录 SDK 它在 iOS 7 8 和 9 中完美运行 但是 如果手机有 facebook 应用程序登录验证 则可以在 iOS 7 和 8 中打开该应用程序 但 IOS 9 无法打开 facebook 应用程序
  • 如何在 Neo4j 中有效地创建独特的关系?

    跟进我的问题here https stackoverflow com questions 29873015 create on not match command for neo4js cql noredirect 1 comment486
  • keras.argmax中axis=-1的含义是什么?

    我是 Keras 的初学者 需要帮助才能理解keras argmax a axis 1 and keras max a axis 1 是什么意思axis 1 when a shape 19 19 5 80 以及输出是什么keras argm
  • JavaScript 中循环 2 个数组无法正常工作

    我有以下 JavaScript 代码 据我所知 该代码应该仅输出一次日期和相应的计算值 但是由于某种原因 我看到内部的输出不正确parseData日期记录两次并且值被覆盖的函数 我不确定是什么导致了这里的问题 这是可以使用 node js
  • 是否可以在 JavaScript 中实现动态 getter/setter?

    我知道如何为名称已知的属性创建 getter 和 setter 方法如下 A trivial example function MyObject val this count 0 this value val MyObject protot
  • 使用 SheetJS 将包含合并单元格的 .xlsx 文件转换为 JSON

    我正在尝试使用 SheetJS 读取 xlsx 文件并将其转换为 JSON 我能够读取简单的 没有合并单元格 xlsx 文件并将其转换为 JSON 但我无法正确处理合并单元格 问题是我有一个 xlsx 文件 其中包含不同语言的产品 我尝试在