xlsx2mysql 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/xlsx2mysql/column.rb +45 -0
- data/lib/xlsx2mysql/configurable.rb +28 -0
- data/lib/xlsx2mysql/mysql_controller.rb +49 -0
- data/lib/xlsx2mysql/relative.rb +73 -0
- data/lib/xlsx2mysql/relative_helper.rb +3 -0
- data/lib/xlsx2mysql/version.rb +3 -0
- data/lib/xlsx2mysql/xlsx_controller.rb +27 -0
- data/lib/xlsx2mysql.rb +12 -0
- metadata +92 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e64cc8461d6dd9c48d25445edf5dc37eb7a9185b990f8e666740ce03d444fe67
|
4
|
+
data.tar.gz: afc7589fb6aaad02fe03479b6969a3048d91ca944b353f79fb89cefe100fc2a5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 47ebcd1b5dfc1d5005ec2f666e43c078552894570c716c0b7111bca008695f51ab187ede53177ec00911d3bb64bc4312dd49f0260c9019e8d1274d07a65fbafc
|
7
|
+
data.tar.gz: 78214fa8e8e8816ca9b61ceefe979fde1fb915f7facafc33c98ad7e43ae67a0ed0bae07d3d974330f3a2a2eebbf071d3d5194d4e086747a36af1cd42d1f03ef6
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Xlsx2Mysql
|
2
|
+
class Column
|
3
|
+
attr_accessor :name, :regexp
|
4
|
+
|
5
|
+
def initialize(name, regexp = /(.*)/)
|
6
|
+
@name = name
|
7
|
+
@regexp = regexp
|
8
|
+
end
|
9
|
+
|
10
|
+
def + other_column
|
11
|
+
Columns.new(self, other_column)
|
12
|
+
end
|
13
|
+
|
14
|
+
def retrieve_value row_index, ws
|
15
|
+
index = name.to_s + row_index.to_s
|
16
|
+
regexp.match(ws[index])
|
17
|
+
$1
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Columns
|
22
|
+
attr_accessor :columns
|
23
|
+
|
24
|
+
def initialize *args
|
25
|
+
@columns = args
|
26
|
+
end
|
27
|
+
|
28
|
+
def + x
|
29
|
+
columns << x
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def retrieve_value row_index, ws
|
34
|
+
res_array = []
|
35
|
+
columns.each do |x|
|
36
|
+
if x.is_a?(Column)
|
37
|
+
res_array << x.retrieve_value(row_index, ws)
|
38
|
+
elsif x.is_a?(String)
|
39
|
+
res_array << x
|
40
|
+
else
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Configurable
|
2
|
+
def self.with(*attrs)
|
3
|
+
not_provided = Object.new
|
4
|
+
|
5
|
+
instance_methods = Module.new do
|
6
|
+
attrs.each do |attr|
|
7
|
+
define_method attr do |value = not_provided, &block|
|
8
|
+
if value === not_provided && block.nil?
|
9
|
+
result = instance_variable_get("@#{attr}")
|
10
|
+
result.is_a?(Proc) ? instance_eval(&result) : result
|
11
|
+
else
|
12
|
+
instance_variable_set("@#{attr}", block || value)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
attr_writer *attrs
|
17
|
+
def configure(&block)
|
18
|
+
instance_eval(&block)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
Module.new do
|
23
|
+
singleton_class.send :define_method, :included do |host_class|
|
24
|
+
host_class.include instance_methods
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Xlsx2Mysql
|
2
|
+
class MysqlController
|
3
|
+
include Configurable.with(
|
4
|
+
:host, :port, :user, :password, :database, :charset, :table
|
5
|
+
)
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@charset = 'utf8mb4'
|
9
|
+
@port = '3306'
|
10
|
+
end
|
11
|
+
|
12
|
+
def acquire_table_fields
|
13
|
+
describe_table.map {|x| x[0]}
|
14
|
+
end
|
15
|
+
|
16
|
+
def insert_one_record(key_values)
|
17
|
+
connect unless @my
|
18
|
+
raise "MySQL is not connected!" unless @my
|
19
|
+
keys = []
|
20
|
+
values = []
|
21
|
+
question_marks = []
|
22
|
+
key_values.each do |key, value|
|
23
|
+
keys << key
|
24
|
+
question_marks << '?'
|
25
|
+
values << value
|
26
|
+
end
|
27
|
+
sql =<<SQL
|
28
|
+
INSERT INTO #{table}
|
29
|
+
(#{keys.join(',')})
|
30
|
+
VALUES
|
31
|
+
(#{question_marks.join(',')});
|
32
|
+
SQL
|
33
|
+
@my.prepare(sql).execute(*values)
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def describe_table
|
39
|
+
connect unless @my
|
40
|
+
raise "MySQL is not connected!" unless @my
|
41
|
+
@my.query("DESCRIBE #{table}").entries
|
42
|
+
end
|
43
|
+
|
44
|
+
def connect
|
45
|
+
mysql_url = "mysql://#{user}:#{password}@#{host}:#{port}/#{database}?charset=#{charset}"
|
46
|
+
@my = Mysql.connect(mysql_url)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module Xlsx2Mysql
|
2
|
+
class Relative
|
3
|
+
attr_accessor :fields_hash
|
4
|
+
|
5
|
+
def initialize(name = nil, &block)
|
6
|
+
@fields_hash = {}
|
7
|
+
instance_eval(&block)
|
8
|
+
run
|
9
|
+
end
|
10
|
+
|
11
|
+
def mysql_ref
|
12
|
+
@mysql_ref ||= MysqlController.new
|
13
|
+
end
|
14
|
+
|
15
|
+
def mysql(&block)
|
16
|
+
mysql_ref.configure(&block)
|
17
|
+
define_methods_with_field_name
|
18
|
+
end
|
19
|
+
|
20
|
+
def xlsx_ref
|
21
|
+
@xlsx_ref ||= XlsxController.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def xlsx(&block)
|
25
|
+
xlsx_ref.configure(&block)
|
26
|
+
end
|
27
|
+
|
28
|
+
alias excel xlsx
|
29
|
+
|
30
|
+
def associate(&block)
|
31
|
+
instance_eval(&block)
|
32
|
+
end
|
33
|
+
|
34
|
+
def method_missing(name, *args)
|
35
|
+
if name =~ /[A-Z]+/
|
36
|
+
Column.new(name, args[0])
|
37
|
+
else
|
38
|
+
super
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def Object.const_missing(name)
|
43
|
+
if name =~ /[A-Z]+/
|
44
|
+
Column.new(name)
|
45
|
+
else
|
46
|
+
super
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
def define_methods_with_field_name
|
53
|
+
mysql_ref.acquire_table_fields.each do |field|
|
54
|
+
define_singleton_method field do |column|
|
55
|
+
fields_hash[field] = column
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def run
|
61
|
+
row_begin = xlsx_ref.row_begin || 1
|
62
|
+
row_end = xlsx_ref.row_end || xlsx_ref.max_row
|
63
|
+
|
64
|
+
(row_begin..row_end).each do |row|
|
65
|
+
key_values = {}
|
66
|
+
fields_hash.each do |field, column|
|
67
|
+
key_values[field] = column.retrieve_value row, xlsx_ref.ws
|
68
|
+
end
|
69
|
+
mysql_ref.insert_one_record key_values
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Xlsx2Mysql
|
2
|
+
class XlsxController
|
3
|
+
include Configurable.with(:path, :worksheet, :row_begin, :row_end)
|
4
|
+
|
5
|
+
def at_cell index
|
6
|
+
load unless @ws
|
7
|
+
@ws[index]
|
8
|
+
end
|
9
|
+
|
10
|
+
def max_row
|
11
|
+
load unless @ws
|
12
|
+
@ws.max_row.to_i
|
13
|
+
end
|
14
|
+
|
15
|
+
def ws
|
16
|
+
load unless @ws
|
17
|
+
@ws
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def load
|
23
|
+
wb = OpenXML::SpreadsheetML::open path
|
24
|
+
@ws = wb[worksheet]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/xlsx2mysql.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# dependencies
|
2
|
+
require 'mysql'
|
3
|
+
require 'yaml'
|
4
|
+
require 'xlsx/DSL'
|
5
|
+
|
6
|
+
# library
|
7
|
+
require "xlsx2mysql/column"
|
8
|
+
require "xlsx2mysql/configurable"
|
9
|
+
require "xlsx2mysql/relative"
|
10
|
+
require "xlsx2mysql/relative_helper"
|
11
|
+
require "xlsx2mysql/mysql_controller"
|
12
|
+
require "xlsx2mysql/xlsx_controller"
|
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: xlsx2mysql
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Cyan Yan
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-02-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: mysql
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 4.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 4.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: xlsx-DSL
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.2.3
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.2.3
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.12.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.12.0
|
55
|
+
description: A gem for inserting data to mysql from Excel(xlsx)
|
56
|
+
email: cyan_cg@outlook.com
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- lib/xlsx2mysql.rb
|
62
|
+
- lib/xlsx2mysql/column.rb
|
63
|
+
- lib/xlsx2mysql/configurable.rb
|
64
|
+
- lib/xlsx2mysql/mysql_controller.rb
|
65
|
+
- lib/xlsx2mysql/relative.rb
|
66
|
+
- lib/xlsx2mysql/relative_helper.rb
|
67
|
+
- lib/xlsx2mysql/version.rb
|
68
|
+
- lib/xlsx2mysql/xlsx_controller.rb
|
69
|
+
homepage: https://github.com/coalooball/xlsx2mysql
|
70
|
+
licenses:
|
71
|
+
- MIT
|
72
|
+
metadata: {}
|
73
|
+
post_install_message:
|
74
|
+
rdoc_options: []
|
75
|
+
require_paths:
|
76
|
+
- lib
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
requirements: []
|
88
|
+
rubygems_version: 3.3.7
|
89
|
+
signing_key:
|
90
|
+
specification_version: 4
|
91
|
+
summary: A simple data migration gem
|
92
|
+
test_files: []
|