Skip to content

Instantly share code, notes, and snippets.

@antiproblemist
Created March 14, 2016 11:54
Show Gist options
  • Save antiproblemist/0c2694cc17d7e39e9d12 to your computer and use it in GitHub Desktop.
Save antiproblemist/0c2694cc17d7e39e9d12 to your computer and use it in GitHub Desktop.

Revisions

  1. antiproblemist created this gist Mar 14, 2016.
    62 changes: 62 additions & 0 deletions excel2sql.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,62 @@
    '''
    This code uses the openpyxl package for playing around with excel using Python code
    to convert complete excel workbook (all sheets) to an SQLite database
    The code assumes that the first row of every sheet is the column name
    Every sheet is stored in a separate table
    The sheet name is assigned as the table name for every sheet
    '''

    import sqlite3
    import openpyxl
    from openpyxl import load_workbook
    import re

    def slugify(text, lower=1):
    if lower == 1:
    text = text.strip().lower()
    text = re.sub(r'[^\w _-]+', '', text)
    text = re.sub(r'[- ]+', '_', text)
    return text

    #Replace with a database name
    con = sqlite3.connect('test.db')
    #replace with the complete path to youe excel workbook
    wb = load_workbook(filename=r'abc.xlsx')

    sheets = wb.get_sheet_names()

    for sheet in sheets:
    ws = wb[sheet]

    columns= []
    query = 'CREATE TABLE ' + str(slugify(sheet)) + '(ID INTEGER PRIMARY KEY AUTOINCREMENT'
    for row in ws.rows[0]:
    query += ', ' + slugify(row.value) + ' TEXT'
    columns.append(slugify(row.value))
    query += ');'

    con.execute(query)

    tup = []
    for i, rows in enumerate(ws):
    tuprow = []
    if i == 0:
    continue
    for row in rows:
    tuprow.append(unicode(row.value).strip()) if unicode(row.value).strip() != 'None' else tuprow.append('')
    tup.append(tuple(tuprow))


    insQuery1 = 'INSERT INTO ' + str(slugify(sheet)) + '('
    insQuery2 = ''
    for col in columns:
    insQuery1 += col + ', '
    insQuery2 += '?, '
    insQuery1 = insQuery1[:-2] + ') VALUES('
    insQuery2 = insQuery2[:-2] + ')'
    insQuery = insQuery1 + insQuery2

    con.executemany(insQuery, tup)
    con.commit()

    con.close()