gpt4 book ai didi

ruby - 通过 ADO 连接将十进制值添加到 excel

转载 作者:行者123 更新时间:2023-12-04 20:52:01 24 4
gpt4 key购买 nike

我无法通过 sequel/ado 将小数添加到现有的 excel 文件中。

我复制了一个包含两列的现有 excel 文件 (template = 'minimal_template.xlsx) col1col2 ,然后我插入两位小数。

结果包含数据,但作为字符串:
Excel Screenshot (German): The values are strings

所以我的问题是:当我使用 ADO 连接时,如何将小数作为小数添加到 Excel 中?

最小的例子:

require 'sequel'
require 'fileutils'


template = 'minimal_template.xlsx'
targetfile = File.expand_path('result.xlsx')
FileUtils.copy(template, targetfile)
puts 'create %s' % targetfile

db = Sequel.ado(:conn_string=>"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=#{targetfile};Extended Properties=Excel 8.0;")
target = db[db.tables.first]
target.insert([0.1, 0.2]) #add decimals.

我已经尝试过的事情:
  • 模板中的列已经格式化为数字,但插入后它们变成了字符串。
  • 在我的用例中,无法使用另一种方式创建 xlsx(axls、roo...)。我必须使用现有的模板。
  • 无法使用 OLE 进行操作(未安装 excel)
  • 我可以在 Excel 中转换格式,但这是一个手动过程,我担心如果使用其他语言环境的人尝试转换该值,它会出错。

  • 我用的是Sequel 5.22,但我觉得Sequel 没问题。
    sequel/adapters/ado/access.rb:111调用以下带小数的 SQL 命令:
    "INSERT INTO [Tabelle1$] VALUES (0.1, 0.2)"

    所以我猜这是ADO的问题。

    更新:
    puts db.schema(target).to_yaml我得到:
    - - :col1
    - :allow_null: true
    :db_type: TEXT(255)
    :default:
    :primary_key: false
    :type: :string
    :ado_type: 130
    :ruby_default:
    :max_length: 255
    - - :col2
    - :allow_null: true
    :db_type: TEXT(255)
    :default:
    :primary_key: false
    :type: :string
    :ado_type: 130
    :ruby_default:
    :max_length: 255

    所以问题确实在 ADO 内部。我试过 use a schema.ini ,但没有成功

    最佳答案

    根据评论,我找到了一个解决方案(但有一个不需要的副作用)。
    Excel 尝试猜测列具有哪种数据类型。如果没有数据,则默认为 text255。
    当我修改模板文件并添加具有正确值(此处为浮点)条目的附加数据行时,附加数据就可以了:

    require 'sequel'
    require 'fileutils'

    template = 'minimal_template.xlsx'
    targetfile = File.expand_path('result.xlsx')
    FileUtils.copy(template, targetfile)
    puts 'create %s' % targetfile

    db = Sequel.ado(:conn_string=>"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=#{targetfile};Extended Properties=Excel 8.0;")
    target = db[db.tables.first]
    #~ target.filter(col1: 0.1).delete #delete dummy line -> Deleting data in a linked table is not supported by this ISAM.
    target.insert([0.8, 0.9]) #add decimals.
    问题:到目前为止,我发现无法删除虚拟行。
    顺便说一句:我曾经在加载带有长文本的 csv 时遇到问题。所有大于 255 个字符的文本都被截断。我能够通过在第二行添加带有长文本的测试数据来解决这个问题。根据第 2 行,Excel 将数据类型设置为正确的类型,并且我在以下行中的文本没有被截断。

    关于ruby - 通过 ADO 连接将十进制值添加到 excel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56989262/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com