3

根据以下示例:值仅存储在 A1 中,其他单元格返回 nil。如何从其他合并的单元格中获取 A1'a 值,或者简单地检查 A1 单元格的范围?

例子

4

2 回答 2

0

这是我的看法,如果所有合并的字段都与 prev 相同 - 那么非合并字段应该变成数组

  xlsx = Roo::Excelx.new(__dir__ + "/output.xlsx", { expand_merged_ranges: true })

  parsed = xlsx.sheet(0).parse(headers: true).drop(1)

  parsed_merged = []
    .tap do |parsed_merged|
      parsed.each do |x|
        if parsed_merged.empty?
          parsed_merged << {
            "field_non_merged1" => x["field_non_merged1"],
            "field_merged1"     => [x["field_merged1"]],
            "field_merged2"     => [x["field_merged2"]],
            "field_merged3"     => [x["field_merged3"]],
            "field_merged4"     => [x["field_merged4"]],
            "field_non_merged2" => x["field_non_merged2"],
            "field_non_merged3" => x["field_non_merged3"],
          }
        else
          field_merged1_is_same_as_prev = x["field_non_merged1"] == parsed_merged.last["field_non_merged1"]
          field_merged2_is_same_as_prev = x["field_non_merged2"] == parsed_merged.last["field_non_merged2"]
          field_merged3_is_same_as_prev = x["field_non_merged3"] == parsed_merged.last["field_non_merged3"]

          merged_rows_are_all_same_as_prev = field_non_merged1_is_same_as_prev && field_merged2_is_same_as_prev && field_merged3_is_same_as_prev

          if merged_rows_are_all_same_as_prev
            parsed_merged.last["field_merged1"].push x["field_merged1"]
            parsed_merged.last["field_merged2"].push x["field_merged2"]
            parsed_merged.last["field_merged3"].push x["field_merged3"]
            parsed_merged.last["field_merged4"].push x["field_merged4"]
          else
            parsed_merged << {
              "field_non_merged1" => x["field_non_merged1"],
              "field_merged1"     => [x["field_merged1"]],
              "field_merged2"     => [x["field_merged2"]],
              "field_merged3"     => [x["field_merged3"]],
              "field_merged4"     => [x["field_merged4"]],
              "field_non_merged2" => x["field_non_merged2"],
              "field_non_merged3" => x["field_non_merged3"],
            }
          end
        end
      end
    end
    .map do |x|
      {
        "field_non_merged1" => x["field_non_merged1"],
        "field_merged1"     => x["field_merged1"].compact.uniq,
        "field_merged2"     => x["field_merged2"].compact.uniq,
        "field_merged3"     => x["field_merged3"].compact.uniq,
        "field_merged4"     => x["field_merged4"].compact.uniq,
        "field_non_merged2" => x["field_non_merged2"],
        "field_non_merged3" => x["field_non_merged3"],
      }
    end
于 2020-02-14T13:24:06.297 回答
-1

如果不首先将值分配给范围内的所有单元格,这是不可能的,即使在 Excel VBA 中也是如此。

请参阅此示例

require 'axlsx'

p = Axlsx::Package.new
wb = p.workbook

wb.add_worksheet(:name => "Basic Worksheet") do |sheet|
  sheet.add_row ["Val", nil]
  sheet.add_row [nil, nil]
  merged = sheet.merge_cells('A1:B2')
  p sheet.rows[0].cells[0].value # "Val"
  p sheet.rows[0].cells[1].value # nil
  sheet[*merged].each{|cell|cell.value = sheet[*merged].first.value}
  p sheet.rows[0].cells[0].value # "Val"
  p sheet.rows[0].cells[1].value # "Val"
end

p.serialize('./simple.xlsx')

下次请您自己添加示例,以便我们查看您使用了哪个 gem、哪个代码、错误等。

于 2016-02-15T11:11:15.543 回答