Ruby Ruby 对 Excel 文件的处理能力是不是弱了点

2604249649 · 2023年08月10日 · 最后由 2604249649 回复于 2023年08月23日 · 981 次阅读

目前使用的 Excel 读取库是 Roo,目前在处理读入时遇到了问题

目前读入 excel 的时候是一行一行读入的,读取行信息时,使用的是 Roo 库的row方法或者each_row_streaming方法来进行处理。

问题

  1. row 方法读取行数据时,返回的列数是固定的,如果当前的 sheet 页存在多个列数不同的表格,这样一行行读取时返回的行数据就不对
  2. each_row_streaming 方法去读行数据时,列数是根据当前行实际有列数来的,但是还是有一个问题:表格之间存在的空行识别效果不好,会有空行丢失的情况
  3. row 和 each_row_streaming 在遍历行数据时,貌似没有提供能够判断当前行的单元格是否存在合并的方法或者解决方案

Ruby 有 excel 处理库能够做到像 Java 的POI那样的处理么?

读取合并单元格roo 这里有方法,一次读取所有合并的单元格,然后要判断每个单元格是否在这个范围内

lehf 回复

这个就是按官方文档开启 expand_merged_ranges 选项为 true 么

但是我用row一行行去读数据,发现只是合并单元格的数据重复显示罢了,并没有一个合并范围(只是不和之前那样空单元格和合并单元格都显示为 nil)。 用each_row_streaming去一行行读数据也是一样,并没有实际上的效果

不知道是不是我用的不对

2604249649 回复

可能是我上边没说明白,我上边链接了提到的方法里的实现方式,这里有一块代码

doc.xpath('/worksheet/mergeCells/mergeCell')

你可以用同样的方式获取到所有合并单元格
caxlsx 里有merged_cells 方法

lehf 回复

明白了谢谢大佬,不过项目没有用caxlsx而是用的axlsx,我被这个合并单元格弄的头痛

合并单元格 merge_cells "A1:B1"

可调整思路。也许你认为的那些用 ruby 控制、操作 Excel 的功能的极致完善并没有想象的那么重要,或许有个 HTML 格式,CSV 格式就可以了,用户复制粘贴一下也不是对整个功能有致命性的影响。

“好”和“重要性”是相关的,刚好够用,有些地方特别好用,就足够产生吸引力了。

补充一下,我花了好几周,开发一个自动生成 Excel 并作为邮件附件发出的功能,为了实现 Excel 的某些细节(譬如格式、数据等)花了很多时间,但是后来发现使用的频率并不高,使用 html 格式也能很好满足需求。

y9info 回复

关键是只支持 excel 导入,导入的数据之后还会需要导出 excel 显示,以及 pdf 内容生成

后端如果不好处理,有些 JavaScript 前端框架和库,可实现导入 Excel 和显示 Excel、pdf 内容生成的方法

y9info 回复

数据都是在后端组装的😂 。比如使用pdfkit gem生成 pdf 文件,需要拼接 html 内容的字符串。 这样做的话调式样式有点麻烦,就是如果生成的 pdf 样式出现了问题,本地调试时我需要将拼接 html 字符输出到一个 html 文件中,然后再对照着 html 文件在浏览器中显示样式和生成 pdf 文件在浏览器中的样式进行调整。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号