如何使用 Ruby 和 win32ole 查询 MS Access 数据库表并将信息导出到 Excel?

发布于 2024-08-07 09:41:05 字数 77 浏览 7 评论 0原文

我是 Ruby 新手,我正在尝试查询现有的 MS Access 数据库以获取报告信息。我希望将此信息存储在 Excel 文件中。我该怎么做?

I'm new to Ruby, and I'm trying to query an existing MS Access database for information for a report. I want this information stored in an Excel file. How would I do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

烦人精 2024-08-14 09:41:05

尝试以下其中一项:

OLE:

require 'win32ole'

class AccessDbExample
  @ado_db = nil

  # Setup the DB connections
  def initialize filename
    @ado_db             = WIN32OLE.new('ADODB.Connection')
    @ado_db['Provider'] = "Microsoft.Jet.OLEDB.4.0"
    @ado_db.Open(filename)
  rescue Exception => e
    puts "ADO failed to connect"
    puts e
  end

  def table_to_csv table
    sql = "SELECT * FROM #{table};"

    results = WIN32OLE.new('ADODB.Recordset')
    results.Open(sql, @ado_db)

    File.open("#{table}.csv", 'w') do |file|
      fields = []
      results.Fields.each{|f| fields << f.Name}
      file.puts fields.join(',')

      results.GetRows.transpose.each do |row|
        file.puts row.join(',')
      end
    end unless results.EOF

    self
  end

  def cleanup
    @ado_db.Close unless @ado_db.nil?
  end
end

AccessDbExample.new('test.mdb').table_to_csv('colors').cleanup

ODBC:

  require 'odbc'

    include ODBC

    class AccessDbExample
      @obdc_db = nil

      # Setup the DB connections
      def initialize filename
        drv                 = Driver.new
        drv.name            = 'AccessOdbcDriver'
        drv.attrs['driver'] = 'Microsoft Access Driver (*.mdb)'
        drv.attrs['dbq']    = filename
        @odbc_db            = Database.new.drvconnect(drv) 
      rescue 
          puts "ODBC failed to connect"
      end

      def table_to_csv table
        sql = "SELECT * FROM #{table};"

        result = @odbc_db.run(sql)
        return nil if result == -1

        File.open("#{table}.csv", 'w') do |file|
          header_row = result.columns(true).map{|c| c.name}.join(',')
          file.puts header_row

          result.fetch_all.each do |row|
            file.puts row.join(',')
          end
        end

        self
      end

      def cleanup
        @odbc_db.disconnect unless @odbc_db.nil?
      end
    end

    AccessDbExample.new('test.mdb').table_to_csv('colors').cleanup

Try one of these:

OLE:

require 'win32ole'

class AccessDbExample
  @ado_db = nil

  # Setup the DB connections
  def initialize filename
    @ado_db             = WIN32OLE.new('ADODB.Connection')
    @ado_db['Provider'] = "Microsoft.Jet.OLEDB.4.0"
    @ado_db.Open(filename)
  rescue Exception => e
    puts "ADO failed to connect"
    puts e
  end

  def table_to_csv table
    sql = "SELECT * FROM #{table};"

    results = WIN32OLE.new('ADODB.Recordset')
    results.Open(sql, @ado_db)

    File.open("#{table}.csv", 'w') do |file|
      fields = []
      results.Fields.each{|f| fields << f.Name}
      file.puts fields.join(',')

      results.GetRows.transpose.each do |row|
        file.puts row.join(',')
      end
    end unless results.EOF

    self
  end

  def cleanup
    @ado_db.Close unless @ado_db.nil?
  end
end

AccessDbExample.new('test.mdb').table_to_csv('colors').cleanup

ODBC:

  require 'odbc'

    include ODBC

    class AccessDbExample
      @obdc_db = nil

      # Setup the DB connections
      def initialize filename
        drv                 = Driver.new
        drv.name            = 'AccessOdbcDriver'
        drv.attrs['driver'] = 'Microsoft Access Driver (*.mdb)'
        drv.attrs['dbq']    = filename
        @odbc_db            = Database.new.drvconnect(drv) 
      rescue 
          puts "ODBC failed to connect"
      end

      def table_to_csv table
        sql = "SELECT * FROM #{table};"

        result = @odbc_db.run(sql)
        return nil if result == -1

        File.open("#{table}.csv", 'w') do |file|
          header_row = result.columns(true).map{|c| c.name}.join(',')
          file.puts header_row

          result.fetch_all.each do |row|
            file.puts row.join(',')
          end
        end

        self
      end

      def cleanup
        @odbc_db.disconnect unless @odbc_db.nil?
      end
    end

    AccessDbExample.new('test.mdb').table_to_csv('colors').cleanup
暖心男生 2024-08-14 09:41:05

你为什么要这样做?您可以直接从 Excel 查询数据库。查看此教程

Why do you want to do this? You can simply query your db from Excel directly. Check out this tutorial.

疧_╮線 2024-08-14 09:41:05

正如 Johannes 所说,您可以从 Excel 查询数据库。

但是,如果您更喜欢使用 Ruby...

您可以找到有关使用 Ruby 查询 Access/Jet 数据库的信息 此处

有关使用 Ruby 自动化 Excel 的大量信息可以在此处找到。

大卫

As Johannes said, you can query the database from Excel.

If, however, you would prefer to work with Ruby...

You can find info on querying Access/Jet databases with Ruby here.

Lots of info on automating Excel with Ruby can be found here.

David

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文