Sqlite3 verilerini excele aktarmak

arkadaşlar merhaba;
sqlite3 veritabanındaki bir tablonun verilerini excel’e aktarmak istiyorum.
tümünü veya entry()'e girilen veriye sahip olanları.
Örn: Doğum yılı 1980 olanları

küçük bir örnek yazabilecek varsa çok memnun olurum.
teşekkür ederim.

Ben olsam veriyi önce csv olarak kaydederdim; Excel, csv biçimindeki verileri içe aktarabiliyor. İlgili modül: https://docs.python.org/3/library/csv.html

evet,bu yöntemle csv olarak da xls olarak da kaydettim. ancak daha sonra excel’de manuel olarak sütunlara aktarmak gerekiyor. benim istediğim csv olarak kaydettiğim gibi butona bastığımda doğrudan sütunlara ayrılmış excel dosyası yapması.

Yukarıda bahsettiğim csv modülünün yanısıra şurada bahsedilen paketleri kullanabilirsiniz: http://www.python-excel.org/
Doğrudan csv dosyasından Excel’e dönüştürme işlemi yapan bir paket var mıdır bilmiyorum ama olsa bile bence daha esnek olması adına bu iki işlem için ayrı paket/modüller kullanın.

Bir örnek kod paylaşabilirim. xlsxwriter kütüphanesi kullanılmıştır.

    def excele_genelgider():
        # ---------- EXCEL e VERİ GÖNDERME GRUBU ---------
        workbook = xlsxwriter.Workbook("genelgider.xlsx")
        worksheet = workbook.add_worksheet()
        saga = workbook.add_format({'align': 'right'})
        bold = workbook.add_format({'bold': True, 'align': 'center', 'border': 1})
        para = workbook.add_format({'num_format': '#,##0.00', 'border': 1})
        basliktip = workbook.add_format({'bold': True, 'size': '16'})
        renkmk = workbook.add_format({'border': 1})
        altenter = workbook.add_format({'border': 1, 'bold': True, 'align': 'center'})
        altenter.set_text_wrap()

        tplsatiri = workbook.add_format({'num_format': '#,##0.00', 'border': 1, 'bold': True,
                                         'align': 'center', 'align': 'vcenter', 'bg_color': '#cecece'})
        renkmk.set_num_format('[Blue]#,##0.00;[Red]-#,##0.00;#,##0.00')

        worksheet.set_column('A:I', 10) # Sütun genişlikleri
        worksheet.set_column('F:F', 8)
        worksheet.set_column('J:S', 9)
        worksheet.set_column('M:M', 8)
        worksheet.set_margins(left=0.4, right=0.3, top=0.7, bottom=0.4) # kenar boşlukları

       # -------- Buraya kadar çeşitli biçimlendirme işlemleri yapılmış -------------------

        for x, v in zip(range(len(genel_giderler_xls2)), genel_giderler_xls2):
            xsutun = 0
            for xveri in v:
                worksheet.write(x + 2, xsutun, xveri, para)
                xsutun += 1
            xsutun = 0
        worksheet.write(0, 0, "GENEL GİDER RAPORU", basliktip)
        try:
            worksheet.write(0, (len(v) - 1), tt, saga)
        except UnboundLocalError:
            messagebox.showwarning("UYARI", "Belirtilen tarih aralığıda rapor bulunmuyor.")
            return
        for bas in baslik_gg:
            worksheet.write(1, baslik_gg.index(bas), bas, altenter)

        for tops in toplamlar:
            worksheet.write(len(genel_giderler_xls2)+3, toplamlar.index(tops)+1, tops, tplsatiri)

        try:
            workbook.close()
        except PermissionError:
            messagebox.showwarning("UYARI!", "Açık 'Excel' dosyasını kapatıp tekrar deneyin.")
        os.startfile("genelgider.xlsx")

    excele_gg['command'] = excele_genelgider # Butona sonradan command veriyoruz
    genel_giderler_xls2 = genel_giderler_xls.copy()  # listeyi boşaltmadan önce kopyalıyoruz
    genel_giderler_xls.clear()  # Liste içeriğini siler

Korkarım kodları doğrudan çalıştırmanız mümkün olmayacaktır. Programımın içinden bir parça aldım sadece. Verileri sqlite’den çektiğim verileri tkinter arayüz ekranına yansıtırken aynı zamanda bir de liste oluşturuyor. Son kısımda gördüğünüz gibi. (Listeyi neden kopyalayıp sonra temizlediğimi hatırlayamıyorum şuan daha iyi açıklama notları almalıydım :slight_smile: ) Sonra aktifleşen excele_genelgider butonuna basınca da bu def excele_genelgider(): fonksiyonu devreye girip listeden verileri okuyup exel de tabloyu oluşturuyor.

Örnek liste:
genel_giderler_xls2 = [['11.2018', 750, 0, 0, 100, 0, 75, 0, 0, 0, 650, 0, 0, 0, 0, 0, 0, 320, 1895], ['12.2018', 0, 0, 0, 68, 0, 0, 0, 0, 0, 650, 130, 0, 0, 0, 0, 0, 175, 1023]]

genel_giderler_xls2 satırını silip doğrudan bu listeyi ekleyin.
messagebox kısmı da tkinter kodudur, onu da çıkarabilir yada sadece print() e dönüştürebilirsiniz.
Sanırım biraz düzenleme ile bu örnek kodu çalıştırabilirsiniz. Umarım işinize yarar.

Kodları tekrar düzenledim. Listeler dediğim gibi benim DB den oluşturuluyor. Bunu doğrudan çalıştırabilirsiniz.

import xlsxwriter
import os
import datetime

genel_giderler_xls2 = [['11.2018', 750, 0, 0, 100, 0, 75, 0, 0, 0, 650, 0, 0, 0, 0, 0, 0, 320, 1895],
                       ['12.2018', 0, 0, 0, 68, 0, 0, 0, 0, 0, 650, 130, 0, 0, 0, 0, 0, 175, 1023]]

baslik_gg = (" DÖNEM ", "  KİRA  ", "  STOPAJ  ", " MAAŞ ", "ELEKTRİK", "   SU   ", " ISINMA ", " TELEFON ", " MUHASEBE ", " VERGİ ",
                     " SGK ", "KIRTASİYE ", "  YOL  ", " YAKIT ", "KARGO\nNAKLİYE ", " MARKET ", " YEMEK ", "MUHTELİF\nGİDERLER ", " DÖNEM\n TUTARI ")
toplamlar = [750, 0, 0, 168, 0, 75, 0, 0, 0, 1300, 130, 0, 0, 0, 0, 0, 495, 2918]

an = datetime.datetime.now()
tt = datetime.datetime.strftime(an, '%d %B %Y')

def excele_genelgider():
    # ---------- EXCEL e VERİ GÖNDERME GRUBU ---------
    workbook = xlsxwriter.Workbook("geng.xlsx")
    worksheet = workbook.add_worksheet()
    saga = workbook.add_format({'align': 'right'})
    bold = workbook.add_format({'bold': True, 'align': 'center', 'border': 1})
    para = workbook.add_format({'num_format': '#,##0.00', 'border': 1})
    basliktip = workbook.add_format({'bold': True, 'size': '16'})
    renkmk = workbook.add_format({'border': 1})
    altenter = workbook.add_format({'border': 1, 'bold': True, 'align': 'center'})
    altenter.set_text_wrap()

    tplsatiri = workbook.add_format({'num_format': '#,##0.00', 'border': 1, 'bold': True,
                                     'align': 'center', 'align': 'vcenter', 'bg_color': '#cecece'})
    renkmk.set_num_format('[Blue]#,##0.00;[Red]-#,##0.00;#,##0.00')

    worksheet.set_column('A:I', 10)  # Sütun genişlikleri
    worksheet.set_column('F:F', 8)
    worksheet.set_column('J:S', 9)
    worksheet.set_column('M:M', 8)
    worksheet.set_margins(left=0.4, right=0.3, top=0.7, bottom=0.4)  # kenar boşlukları
    # ---------  Buraya kadar biçimlendiirme araçları -----------

    for x, v in zip(range(len(genel_giderler_xls2)), genel_giderler_xls2):
        xsutun = 0
        for xveri in v:
            worksheet.write(x + 2, xsutun, xveri, para)
            xsutun += 1
        xsutun = 0
    worksheet.write(0, 0, "GENEL GİDER RAPORU", basliktip)
    try:
        worksheet.write(0, (len(v) - 1), tt, saga)
    except UnboundLocalError:
        print("UYARI", "Belirtilen tarih aralığıda rapor bulunmuyor.")
        return
    for bas in baslik_gg:
        worksheet.write(1, baslik_gg.index(bas), bas, altenter)

    for tops in toplamlar:
        worksheet.write(len(genel_giderler_xls2) + 3, toplamlar.index(tops) + 1, tops, tplsatiri)

    try:
        workbook.close()
    except PermissionError:
        print("UYARI!", "Açık 'Excel' dosyasını kapatıp tekrar deneyin.")
    os.startfile("geng.xlsx") 

excele_genelgider()

bu nedense dışarda kaldı :))

aşağıda belirttiğim gibi önce db’den aldığım verileri csv olarak kaydetim, sonra xlsx’e çevirdim ve csv dosyasını sildim.
bu şekilde hallettim.
ilgilenen ve cevap yazan arkadaşlarıma teşekkür ederim.

from openpyxl import Workbook
import csv
import sqlite3
import os
baglan=sqlite3.connect(“isler.db”)
c=baglan.cursor()

data = c.execute(“SELECT * FROM isler”)
with open(‘output.csv’, ‘w’) as f:
writer = csv.writer(f)
writer.writerow([‘Başlık-1’, ‘Başlık-2’,‘Başlık-3’,‘Başlık-4’,‘Başlık-5’,‘Başlık-6’])
writer.writerows(data)
wb = Workbook()
ws = wb.active
with open(‘output.csv’, ‘r’) as f:
for row in csv.reader(f): ws.append(row)
wb.save(‘liste.xlsx’)
os.remove(‘output.csv’)

Csv nedir bilmiyorum ama bukadar az kodla halloluyorsa daha fonkaiyonel görünüyor. İlk fırsatta deneyeceğim.

“CSV”, “Comma Separated Value” demektir. Çok basittir; JSON’dan, XML’den bile basittir. İlk satırda sütun adları virgüllerle ayrılarak yazılır, altına da değerleri virgüllerle ayrılarak yazılır. CSV programlama dillerinden bağımsız, her dille kullanılabilen bir yapıdır. Her ofis programı da CSV’den içe aktarmayı ve CSV’ye dışa aktarmayı destekler. Bir CSV örneği:

Ad,      Soyad,       Yaş    
Ali,     Alioğlu,     10
Veli,    Velioğlu,    20

Burada boşlukları okuma kolaylığı için koydum ancak boşluklar gerekli değil.

from openpyxl import Workbook
import csv
import sqlite3
import os
baglan=sqlite3.connect("shop_data.db")
c=baglan.cursor()

data = c.execute("SELECT * FROM envanter")

with open('output.csv','w') as f:
    writer = csv.writer(f)
    writer.writerow(['Id', 'AlanKisi', 'AlindigiYer', 'Adet', 'Malzeme', 'Maliyet', 'Kime', 'Nereye', 'Tarih']), \
    writer.writerows(data)
    wb = Workbook()
    ws = wb.active
with open('output.csv','r') as f:
    for row in csv.reader(f): ws.append(row)
wb.save('liste.xlsx')
os.remove('output.csv')

Merhaba buradaki kodunuzu kullandığımda excel dosyasında iki veri arasında boş satır oluyor bunu nasıl önleyebiliriz? veya bu neden kaynaklanıyor olabilir. Yardımcı olabilir misiniz ?

excel çıktısı aşağıdaki resimde görüldüğü gibi oluyor ?