Merhaba Arkadaşlar ;
bir exceldeki veriyi okuyup farklı bir excel dosyasına yazdırmam gerek fakat işin içinden çıkamadım.
örnek vermek gerekirse =
aa.xlsx dosyasındaki A6 hücresindeki veriyi
bb.xlsx dosyasındaki A11 hücresine yazdıracağım
fakat satır numaraları sürekli değişmekte.
Bu konuda yardım edebilirseniz memnun olurum.
Şimdiden Teşekkürler…
Merhaba, şu şekilde yapabilirsin;
aa.xlsx verisini txt dosyasına çek, daha sonra bb.xlsx dosyasına txtden yazdır.
Bir veri çekme programında benimde direkt excele yazdırmam gereken bilgiler vardı, bu şekilde çözmüştüm.
Olabilir ama hücre numaraları değişecek mesela a6 hücresindeki k2580’e gelecek
Bu şekilde kaç tane değişim olacak?
Python’da Exel dosyaları ile çalışmak için pek çok kütüphane var. Mesela:
- openpyxl
- XlsxWriter
- xlwings
Hergün 10 satır ile 50 satır arasında veri geliyor hergün defalarca uğramaktansa tek tıklama ile yapılabilirmi diye düşündüm
openpyxl kullanıyorum ama hücreyi seçtiremedim bilgin varsa yardım edebilirsin
Daha önce hiç Excel dosyaları ile Python’da çalışmadım. Bu yüzden yardımcı olamayacağım ne yazık ki. Ama kendi dökümantasyonuna bakabilirsiniz.
Eğer sayıları kullanmak isterseniz xleditor kütüphanesini kullanabilirsiniz. Harfler sürekli artıyorsa bunu kullanın. Ama harfler gerekiyorsa şu siteye bakın:
openpyxl dökümanı gayet güzel yazılmış. Kendi dökümanında, bir excel sayfasında veri okuma şöyle anlatılmış:
>>> from openpyxl import load_workbook
>>> wb = load_workbook(filename = 'empty_book.xlsx')
>>> sheet_ranges = wb['range names'] #range names : çalışma sayfası
>>> print(sheet_ranges['D18'].value) #çalışma sayfasaında D18 hücresinin değerini .value ile alıyoruz.
Yani senin bir dosyadan okuyum diğer dosyaya yazman için yapman gereken şöyle birşey:
#excel1.xlsx den excel2.xlsx dosyasına veri kaydedecez.
from openpyxl import load_workbook
#kullanacağımız excel dosyalarını tanımlıyoruz.
excel1 = load_workbook(filename = 'excel1.xlsx')
excel2 = load_workbook(filename = 'excel2.xlsx')
#excel dosyalarında hangi sayfadan veri alacaksak o sayfayı tanımlıyoruz.
sayfa1 = excel1['Çalışma Sayfası']
sayfa2 = excel2['Çalışma Sayfası']
#seçtiğimiz sayfada lazım kopyalayacağımız hücre verisini değişkene atıyoruz.
hucre=sayfa1['D18'].value
#diğer sayfada istediğimiz hücreye atıyoruz.
sayfa2["A12"] = hucre
#excel bilgin varsa şöyle belli aralıktaki değerleri de alıp kopyalayabilirsin.
sayfa2["A1:C5"] = sayfa1["A1:C5"]
Veri okuyup yazma böyle. Gerisi uygun algoritma ile istenen veriyi alıp işleyip istenen yere yazma. Onda da takılırsan elimden gelirse yardımcı olurum.
Teşekkürler verdiğin yol üzerinden gidince %90 oranında çözüldü
from openpyxl import load_workbook
excel1=load_workbook(filename='bb.xlsx')
excel2=load_workbook(filename='aa.xlsx')
sayfa1=excel1['Page1']
sayfa2=excel2['Sayfa1']
hucreNo=5
hucreNo1=2886
hucreSay=1
while True:
hucreSay+=1
if hucreSay==31:
sayfa2["H2887"]=hucreNo1
hucreNo1=hucreNo1
print"Girisler Yapildi"
break
else:
hucreNo=hucreNo+1
hucreNo1=hucreNo1+1
TakipNo=sayfa1['A{}'.format(hucreNo)].value
isim=sayfa1['J{}'.format(hucreNo)].value
Adres=sayfa1['K{}'.format(hucreNo)].value
Tel=sayfa1['AC{}'.format(hucreNo)].value
Tarih=sayfa1['E{}'.format(hucreNo)].value
Tutar=sayfa1['AM{}'.format(hucreNo)].value
if TakipNo==None:
break
else:
sayfa2['K{}'.format(hucreNo1)]=TakipNo
sayfa2['M{}'.format(hucreNo1)]=isim
sayfa2['C{}'.format(hucreNo1)]=Adres
sayfa2['D{}'.format(hucreNo1)]=Tel
sayfa2['A{}'.format(hucreNo1)]=Tarih
sayfa2['E{}'.format(hucreNo1)]=Tutar
excel1.save('bb.xlsx')
excel2.save('aa.xlsx')
excel1.close()
excel2.close()
Tek sıkıntım programı yeniden başlatınca son hücre sayısından devam etmiyor…
Şimdilik bir .txt dosyasına yazın. İlerlediğinizde config modülünü kullanarak düzenlersiniz.
Onu da şöyle halledebilirsin:
#boş satırı bulma!
hucreSay = 1
while True:
if sayfa2['A{}'.format(i)].value:
hucreSay+=1
# yani hücre sayısını sırayla arttıracak. Eğer hücre boş ise zaten aradığını bulmuş olacaksın.
İşin içinden çıkamadım bi el atabilirseniz
# -*- coding: UTF-8 -*-
from openpyxl import load_workbook ,Workbook
excel1=load_workbook(filename="bb.xlsx")#okunacak dosya
excel2=load_workbook(filename="aa.xlsx")#yazılacak dosya
sayfa1=excel1['Page 1']
sayfa2=excel2.active# aktif sayfayı ["Sayfa1"] olarak eklediğin zaman excell formülünde sorun çıkartıyor
hucreNo=5#okunacak dosyanın artan satır nosu
hucreNo1=1#yazılacak dosyanın artan satır nosu
veri=0
"""for cell in sayfa2["F"]:#ilk boş hucreyi bulma döngüsü
if cell== "Yolda":
print cell.row
hucreNo1 = hucreNo1 + cell.row
print "if içi hucreNo1" , hucreNo1
break
else:
cell.row + 1
"""
print "for çıkışı hucre no " , hucreNo1#for çıkış kontrolü
while True:
TakipNo1 = sayfa1['A{}'.format(hucreNo)].value#okunacak dosya boş hucreye geldiği zaman döngüyü kırma
if TakipNo1==None:
print"Giris Sınıra ulaşıldı"
break
else:
hucreNo = hucreNo + 1
TakipNo = sayfa1['A{}'.format(hucreNo)].value#link değişkenine kadar okunacak dosyadaki hücreleri değişkene atama
isim=sayfa1['J{}'.format(hucreNo)].value
Adres=sayfa1['K{}'.format(hucreNo)].value
Tel=sayfa1['AC{}'.format(hucreNo)].value
Tarih=sayfa1['E{}'.format(hucreNo)].value
Tutar=sayfa1['AM{}'.format(hucreNo)].value
durum="Yolda"
bos=""
link="http://selfservis.yurticikargo.com/reports/SSWDocumentDetail.aspx?DocId="
kopru1 = sayfa2["b{}".format(hucreNo1)] = "=HYPERLINK(k{},L{})".format(hucreNo1, hucreNo1)#excelldeki köprü fonksyonu
birles1 = sayfa2["K{}".format(hucreNo1)] = "=CONCATENATE(I{},J{})".format(hucreNo1, hucreNo1)#excelldeki hücre birleştirme onksyonu
hucreNo1 = hucreNo1 + 1
satir=[Tarih,kopru1,Adres,Tel,Tutar,durum,bos,bos,link,TakipNo,birles1,isim]#yazılacak dosyaya eklenecek satırlar
sayfa2.append(satir)
print hucreNo1#satır no artıyormu diye kontrol
veri= veri+1
satir=list()#eklenecek listeyi temizleme
print "Ekleme sonu Hucre no :",hucreNo1#kontrol
if TakipNo==None:
#sayfa2.delete_rows(hucreNo1,amount=1)#eklemelerde son satırda fazladan ekleme yapıyordu son satırı silmek için
break
excel1.save('bb.xlsx')
excel2.save('aa.xlsx')
excel1.close()
excel2.close()
okumak istediğim excel burda : https://drive.google.com/open?id=1s7TUk0_6NbTu6Jv7PtT42GSDV7AN332X
iki 3 kere çalıştırırsanız hataları görürsünüz
ilk satıra boş ekleme yapıyor
ikinci çalıştırılmasında kayma yapıyor
köprüdeki ve birleştirdeki formuller hucre sayısına göre artmıyor
yardım edebilirseniz memnun olurum
Merhabaç Linuxda yapmaya çalıştım modül ile ilgili bir hata verdi. Vakit bulduğumda windows da deneyecem. bb.xlsx dosyasına baktım. Yapmak istediğin tam olarak nedir? Yazılı olarak ifade edebilir misin? Kodların biraz karışık geldi ve açıklama eklememişsin hiç. Tarif edersen yapmaya çalışayım ben.
kod içerisine açıklamaları ekledim
elimde müşteri takip listesi var “bb” dosyası hergün mail olarak bana ulaşmakta içeriği 50 satıra kadar çıkıyor
her sabah tek tek hucreleri kopyala yapıştır yapmamak için böyle bir şey düşünmütşüm
kopru1 ve birles1 de ne yapmak istediğini anlamadığım için onları yorum satırı haline getirdim.
Bu kod senin işine yarar ama girilen takip no excel dosyasında varsa kaydetmesin şeklinde bir kontorol yaptırtırsan çok daha güzel olur. Kazara aynı kayt iki defa olmaz. Aslında sqlite ile veritabanına kaydedip sonra istediğin filtreye (isim, tarih, telefon no vb.) göre çekip excel dosyasına yazdırsan daha rahat olur bence.
from openpyxl import load_workbook
#çalışma dosyalarını aktarıyoruz.
# Bu kodun hata vermemesi için 'aa.xlsx' dosyası dizinde olmalıdır.
excel_oku = load_workbook(filename= "bb.xlsx")
excel_yaz = load_workbook(filename= "aa.xlsx")
# Geçerli çalışma sayfalarını seçiyoruz.
# sheetnames: dosya içindeki çalışma sayfaların liste olarak verir.
# Biz burda elle yazmadan direk ilk sıradaki çalışma sayfalarını seçmiş olacaz.
sayfa_oku = excel_oku[excel_oku.sheetnames[0]]
sayfa_yaz = excel_yaz[excel_yaz.sheetnames[0]]
# Alacağımız verinin satır sayısını belirtiyoruz.
# Bu değer heralde her seferinde 6. satırdan başlayacak.
hucreNo_oku = 6
# Yazacağımız dosyanın boş satırının satır numarasını buluyoruz.
# while döngüsünden sonra hucreNo_yaz değeri boş satır numarasına eşit olacak.
# eğer bu sayfada binlerce kayıt olacaksa boş satırı daha kısa sürede bulmak için
# başka bir yöntem de bulunabilir.
# İlk satıra açıklama gelir diye de 2. satırdan itibaren yazmaya başladım.
hucreNo_yaz = 2
while sayfa_yaz["A"+str(hucreNo_yaz)].value != None: #hücre boş olmadığı sürece diğer satıra geç!
hucreNo_yaz+=1
# Şimdi 'bb.xlsx' dosyasndan 'aa.xlsx' dosyasına veri aktaracağız.
# Kodlar daha sade gözüksün diye şu iki fonksiyonu tanımlayalım
#harf ve rakamını belirtiğimiz hücrenin direk değerini döndürür.
def oku(harf,rakam):
return sayfa_oku[harf+str(rakam)].value
#harf ve rakamını belirtiğimiz hücreye, belirtiğimiz değeri atar
def yaz(harf,rakam,deger):
sayfa_yaz[harf+str(rakam)] = deger
# 'bb.xlsx' dosyasında boş satıra denk gelene dek veri alıp aktaracağız.
while oku("A",hucreNo_oku) == None: #yani seçilen hücre boş olana kadar aşağıdaki işlemleri yap!
yaz("A",hucreNo_yaz, deger = oku("A",hucreNo_oku)) #TakipNo
yaz("B",hucreNo_yaz, deger = oku("J",hucreNo_oku)) #isim
yaz("C",hucreNo_yaz, deger = oku("K",hucreNo_oku)) #adres
yaz("D",hucreNo_yaz, deger = oku("AC",hucreNo_oku)) #tel
yaz("E",hucreNo_yaz, deger = oku("E",hucreNo_oku)) #tarih
yaz("F",hucreNo_yaz, deger = oku("AM",hucreNo_oku)) #tutar
yaz("G",hucreNo_yaz, deger = "Yolda") #durum
yaz("H",hucreNo_yaz, deger = "") #bos
yaz("I",hucreNo_yaz, deger = "http://selfservis.yurticikargo.com/reports/SSWDocumentDetail.aspx?DocId=") #link
# yaz("J",hucreNo_yaz, deger = "=HYPERLINK(K{},L{})".format(hucreNo_oku, hucreNo_oku)) #kopru
# yaz("K",hucreNo_yaz, deger = "=CONCATENATE(I{},J{})".format(hucreNo_oku, hucreNo_oku)) #birles
hucreNo_oku+=1 #okunan sayfada bir sonraki satıra geç!
hucreNo_yaz+=1 #yazılan sayfada bir sonraki satıra geç!
# okunacak başka satır kalmadıktan sonra:
excel_yaz.save("aa.xlsx")
excel_yaz.close()
print("Yazma işlemi tamamlandı!")