1

Konu: Excel dosya açma save etme

Bir excel klası (=> This ) için aşağıdaki kodları yapmak isterken dağıldım - çarşaf oldum da denebilinir - 
Galiba excel ilk açtığında bir tmp yaratıyor - sonra onu silip esasını kaydediyor (Soykan'ın bir makalesinden öyle anladım)
Yapmak istediğimi kodların yanına yazdım:
DOSYA ADI İLE AÇ
DOSYA ADI GEÇİRİLMEMİŞ İSE DOSYA SOR ::GETFILE()
GETFILE BOŞ DÖNÜYORSA ANONİM DOSYA ADI VER

AÇILAN DOSYANIN SAYFALARINI DENETLE
AYNI İSİMLE SAYFA VAR İSE SONUNA I EKLE
SAYFAYI YENİ ADLA AÇ

DOSYAYI YENİ SAYFA İLE KAYDET ..mek ve bütün bunlar için

Visual Fox Pro
With oExcel As "Excel.Application"

m.defaultdir=SYS(5)+SYS(2003)
IF  ISBLANK(This.Dosyad)  && dosya adı yok getfile ile seçilebilinecek
  WAIT NOWAIT WINDOW "dosya seçerseniz sayfa eklenecek"+CHR(13)+"ve seçili ad ile saklanacak";
              +CHR(13)+CHR(13)+"seçmezseniz "+ADDBS(This.Dizinad)+This.dosyad+".xls dosyası oluşturulacak"
  m.Dosyad=GETFILE("xls","excel dosyasI seçin","seç",1,"SEÇİM YAPMAZSANIZ YENİ DOSYA OLUŞTURULACAK")
 
IF ISBLANK(m.dosyad)   && GETFILE() ile seçmedik
    m.Dosyad=ADDBS(This.Dizinad)+"DosyaAdGirilmedi.xls"
    m.Dosyad=CHRTRAN(m.dosyad,"öÖYüÜşŞğĞçÇ() ","oOIuUSsgGcC")
    m.yenidosya=.t.
    .Workbooks.Add
  ELSE  &&   && GETFILE() ile seçtik
    IF FILE(m.Dosyad)  && burada çarşafa dolanmaya başlıyorum,
                                   && aslında gerek yok gibi görünüyor ama dosyayı birtürlu bulamadım
      .Workbooks.Open(m.dosyad)
      m.yenidosya=.f.
    ELSE
      m.yenidosya=.t.
      .Workbooks.Add
    ENDI 
  ENDIF
  This.Dosyad=m.dosyad
ELSE  && dosya adı geçirilmiş
  m.dosyad=ADDBS(This.Dizinad)+This.dosyad
    IF FILE(m.Dosyad)
      .Workbooks.Open(m.dosyad) 
      m.yenidosya=.f.
    ELSE
      m.yenidosya=.t.
      .Workbooks.Add
    ENDI 
ENDIF
*
.Visible = .T.
 
IF ISBLANK(This.Sayfad)
  m.Sayfad="X"
ELSE  && sayfa adı geçirilmiş
  m.Sayfad=This.Sayfad
ENDIF
m.Sayfad=CHRTRAN(m.Sayfad,"/&%#","*")
 
m.xi=1
m.sayfaek=" "
m.sayfadx=m.sayfad
DO WHIL m.xi < .ActiveWorkbook.Sheets.Count
  IF ALLTRIM(UPPER(.ActiveWorkbook.Sheets[m.xi].Name))=ALLTRIM(UPPER(m.sayfad))
    m.sayfaek=m.sayfaek+"I"
    m.sayfad=LEFT(m.sayfadx,31-LEN(m.sayfaek))+m.sayfaek
    m.xi=1
  ELSE
    m.xi=m.xi+1
  ENDIF
ENDD
 
.ActiveWorkBook.sheets.Add
.ActiveWorkbook.ActiveSheet.Name = m.sayfad


sonrası excel işlemleri ve kaydetme bölümü

Visual Fox Pro
IF m.yenidosya

  .ActiveWorkbook.SaveAs(ADDBS(tHis.Dizin)+This.dosyad, -4143)
ELSE
.ActiveWorkbook.Save(This.dosyad)
ENDIF
.ActiveWorkbook.Saved = .T.
ENDWITH
 
*beceremdiğim Soykan'a ait kodlar
*MyFile = This.dosyad
*MyFileJustName = Justfname(MyFile)
*IF m.yenidosya
*    If File(MyFile)
*       Erase (MyFile)
*   Endif
*   oExcel.ActiveWorkbook.SaveAs(MyFile)
*Else
*   oExcel.ActiveWorkbook.Save()
*Endif
 
SET DIRE TO (m.defaultdir)
VFP9 SP2

2

Re: Excel dosya açma save etme

Ali Abi; şunun sana faydası dokunur mu?

http://social.msdn.microsoft.com/Forums … ce891f1a2f


Visual Fox Pro
************************************************************

* Function CombineExcelFiles
************************************************************
* Created...........: Craig Boyd 3/6/2006 23:55:50
*) Description.......:
* Calling Samples...: DIMENSION aXLSFiles(3)
*!*                    aXLSFiles(1) = "C:\temp1.xls"
*!*                    aXLSFiles(2) = "C:\temp2.xls"
*!*                    aXLSFiles(3) = "C:\temp3.xls"
*!*                    CombineExcelFiles(@aXLSFiles, "C:\XLSCombined.xls")
* Parameter List....:
* Major change list.:
function CombineExcelFiles (taXLSFiles, tcDestination, tlDeleteOriginal)
external array taXLSFiles
local loExcel as Excel.application, ;
    loWorkBook as Excel.Worksbook, ;
    loWorkSheet , ;
    lnCounter, lcWorkSheetCaption, lcError, ;
    lcValidChars
 
lcError = ""
 
try
    lcValidChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 "
    loExcel = newobject("Excel.Application")
    with loExcel
        .ScreenUpdating = .f.
        .DisplayAlerts = .f.
        .WorkBooks.add()
        lnCounter = 0
 
** Delete all existing worksheets except 1
        for each loWorkSheet in .WorkBooks(1).WorkSheets
            lnCounter = m.lnCounter + 1
            if m.lnCounter > 1
                loWorkSheet.delete
            endif
        endfor
 
        for lnCounter = 1 to alen(taXLSFiles,1)
            if file(taXLSFiles[m.lnCounter])
                lcWorkSheetCaption = juststem(taXLSFiles[m.lnCounter])
                loWorkBook = .WorkBooks.open(taXLSFiles[m.lnCounter])
                loWorkBook.WorkSheets(1).copy(null, ;
                    .WorkBooks(1).WorkSheets(.WorkBooks(1).WorkSheets.count))
                .WorkBooks(1).ActiveSheet.name = ;
                    right(alltrim(chrtran(m.lcWorkSheetCaption, ;
                    chrtran(m.lcWorkSheetCaption,m.lcValidChars,"")," ")), 31) &&loWorkBook.Name
                loWorkBook.close(.f.) && Do not save changes
                if m.tlDeleteOriginal
                    erase (taXLSFiles[m.lnCounter])
                endif
            endif
        endfor
** Remove the first original sheet from (Sheet1)
        .WorkBooks(1).WorkSheets(1).delete
 
        .WorkBooks(1).saveas(m.tcDestination)
        .ScreenUpdating = .t.
        .DisplayAlerts = .t.
    endwith
 
catch to loError
    lcError = Log_Error(m.loError)
finally
    if vartype(m.loExcel) = 'O'
        with loExcel
            .ScreenUpdating = .t.
            .DisplayAlerts = .t.
            .quit()
        endwith
    endif
endtry
 
return m.lcError
endfunc
Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

3 Son düzenleyen, ugurlu2001 (25.02.2011 16:34:35)

Re: Excel dosya açma save etme

Ali abi;

Birde Excel dosyasını sanki bir tablo gibi kullanabilirsin ve datayı excel e yerleştirdikten sonra bu şekilde kaydedebilirsin :

Visual Fox Pro
* I did not take the note of Author.

* Public Code from foxpro forums

Visual Fox Pro
oExcel = CREATEOBJECT("Excel.Application")

oBook = oExcel.Workbooks.ADD
oSheet = oBook.Worksheets(1)
 
* 'Create the QueryTable object.
LOCAL oQryTable AS OBJECT, sNorthwind AS STRING
sNorthwind = HOME(2) +;
[NORTHWIND\NORTHWIND.DBC]
oQryTable = oSheet.QueryTables.ADD ;
("OLEDB;Provider=VFPOLEDB.1;Data Source="+sNorthwind+";", ;
oSheet.RANGE("A1"),"Select * from Orders")
oQryTable.RefreshStyle = 2 && xlInsertEntireRows = 2
oQryTable.REFRESH(.F.)
oExcel.VISIBLE=.T.
 
***
Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

4

Re: Excel dosya açma save etme

Visual Fox Pro
If  Isblank(This.Dosyad)  && dosya adi yok getfile ile seçilebilinecek

  Wait Nowait Window "dosya seçerseniz sayfa eklenecek"+Chr(13)+"ve seçili ad ile saklanacak";
    +Chr(13)+Chr(13)+"seçmezseniz "+Addbs(This.Dizinad)+This.Dosyad+".xls dosyasi olusturulacak"
  m.Dosyad=Getfile("xls","excel dosyasI seçin","seç",1,"SEÇIM YAPMAZSANIZ YENI DOSYA OLUSTURULACAK")
  m.yenidosya= Isblank(m.Dosyad) Or !File(m.Dosyad)
  If Isblank(m.Dosyad)   && GETFILE() ile seçmedik
    m.Dosyad=Addbs(This.Dizinad)+"DosyaAdGirilmedi.xls"
    m.Dosyad=Chrtran(m.Dosyad,"öÖYüÜsSgGçÇ() ","oOIuUSsgGcC")
  Endif
Else  && dosya adi geçirilmis
  m.Dosyad=Addbs(This.Dizinad)+This.Dosyad
  m.yenidosya= !File(m.Dosyad)
Endif
This.Dosyad=m.Dosyad
m.Sayfad=Chrtran(Evl(This.Sayfad,"X"),"/&%#","*")
 
With oExcel As "Excel.Application"
  .Visible = .T.
 
  If m.yenidosya
    .Workbooks.Add
  Else
 
    ek = 0
    For ix = 1 To .ActiveWorkbook.Worksheets.Count
      If Alltrim(Upper(.ActiveWorkbook.Sheets[m.xi].Name))=Alltrim(Upper(m.Sayfad))
        ek = m.ek + 1
      Endif
    Endfor
    m.SayfaAd = Trim(m.SayfaAd + ' ' + Replicate('I', m.ek))
 
    .Workbooks.Open(m.Dosyad)
    .ActiveWorkbook.Sheets.Add
  Endif
 
  .ActiveWorkbook.ActiveSheet.Name = m.Sayfad
Endwith

5

Re: Excel dosya açma save etme

son şekli aşağıdaki gibi oldu, çalıştığı için paylaşıyorum.

Visual Fox Pro
IF ISBLANK(This.Dizinad)

   This.Dizinad = m.defaultdir
ENDIF
 
SET DIRE TO (This.Dizinad)
 
With oExcel As "Excel.Application"
 
IF  ISBLANK(This.Dosyad)  &&! VARTYPE(This.Dosyad)="C"
  WAIT NOWAIT WINDOW "dosya seçerseniz sayfa eklenecek"+CHR(13)+"ve seçili ad ile saklanacak";
              +CHR(13)+CHR(13)+"seçmezseniz "+ADDBS(This.Dizinad)+This.dosyad+".xls dosyası oluşturulacak"
  m.Dosyad=GETFILE("xls","excel dosyası seçin","seç",1,"SEÇİM YAPMAZSANIZ YENİ DOSYA OLUŞTURULACAK")
 
  IF ISBLANK(m.dosyad)
    m.Dosyad="DosyaAdGirilmedi.xls"
    m.yenidosya=.t.
  ELSE
    m.yenidosya=.f.
  ENDIF
ELSE
  m.Dosyad=ADDBS(This.Dizinad)+CHRTRAN(This.Dosyad,"öÖİüÜŞşğĞçÇ()/&# ","oOiuUSsgGcC")
  IF FILE(m.Dosyad)
    m.yenidosya=.f.
  ELSE
    m.yenidosya=.t.
  ENDI 
ENDIF
 
IF m.yenidosya
   .Workbooks.Add
ELSE
   .Workbooks.Open(m.Dosyad)
ENDIF
 
.Visible = .T.
 
IF ISBLANK(This.Sayfad)
  m.Sayfad="X"
ELSE
  m.Sayfad=This.Sayfad
ENDIF
m.Sayfad=CHRTRAN(m.Sayfad,"/&%#","*")
 
m.xi=1
m.sayfaek=" "
m.sayfadx=m.sayfad
DO WHIL m.xi < .ActiveWorkbook.Sheets.Count
  IF ALLTRIM(UPPER(.ActiveWorkbook.Sheets[m.xi].Name))=ALLTRIM(UPPER(m.sayfad))
    m.sayfaek=m.sayfaek+"I"
    m.sayfad=LEFT(m.sayfadx,31-LEN(m.sayfaek))+m.sayfaek
    m.xi=1
  ELSE
    m.xi=m.xi+1
  ENDIF
ENDD
 
.ActiveWorkBook.sheets.Add
.ActiveWorkbook.ActiveSheet.Name = m.sayfad
 
RETURN m.yenidosya
 
*--*-*-*-*-**-*---*
 
IF m.yenidosya
  .ActiveWorkbook.SaveAs(ADDBS(This.Dizinad)+CHRTRAN(This.Dosyad,"öÖİüÜŞşğĞçÇ()/&# ","oOiuUSsgGcC"), -4143)
                                                                 *oOiuUSsgGcC
ELSE
  .ActiveWorkbook.Save()
ENDIF
.ActiveWorkbook.Saved = .T.
ENDWITH
 
SET DIRE TO (m.defaultdir)
VFP9 SP2

6

Re: Excel dosya açma save etme

.displayAlerts = .f.
.ActiveWorkbook.SaveAS(m.xdosya,39)
komutları ile excel dosyasını kaydettiğimde, tekrar açınca bazı özellikleri kaybediyor.

.displayAlerts = .t.  şeklinde çıkan dialogboxta "HAYIR" seçip kaydersem özellikler korunuyor. (istediğim sonuç bu yol)

Dialogboxu atlayarak, HAYIR ve dosya kaydı tamamlanmış direk otomasyonu beceremedim. Sitede ve MSDNde de aradım.
Bilenlere peşinen teşekkürler

---aşağıda msdn, ancak uygun parametreyi bulamadım
SaveAs (
    [OptionalAttribute] Object Filename,
    [OptionalAttribute] Object FileFormat,
    [OptionalAttribute] Object Password,
    [OptionalAttribute] Object WriteResPassword,
    [OptionalAttribute] Object ReadOnlyRecommended,
    [OptionalAttribute] Object CreateBackup,
    [OptionalAttribute] XlSaveAsAccessMode AccessMode,
    [OptionalAttribute] Object ConflictResolution,
    [OptionalAttribute] Object AddToMru,
    [OptionalAttribute] Object TextCodepage,
    [OptionalAttribute] Object TextVisualLayout,
    [OptionalAttribute] Object Local  )

VFP9 SP2

7

Re: Excel dosya açma save etme

selam,

.displayAlerts = .f.
.ActiveWorkbook.SaveAS(m.xdosya,39)

.FileFormat=39 yerine 56 deneyebilirmisin 39 ile Excel 95 formatında kayıt ediyorsun

8

Re: Excel dosya açma save etme

msayin yazdı:

.FileFormat=56


Bingo - teşekkürler

VFP9 SP2

9

Re: Excel dosya açma save etme

Nacizane fikrim 56 kullanma. Ofis olan her bilgisayarda bulamayabilirsin (bende yok galiba mesela). Onun yerine Excel'in hangi versiyonu kullaniliyor ise onu kullan:

Visual Fox Pro
#Define xlWorkbookNormal                                  -4143

 
oXL.ActiveWorkBook.SaveAs(m.lcXLSFileName,xlWorkbookNormal)

Ancak, soyle ikinci bir problem daha var. 2007'den beri (daha mi once yoksa) yeni zip formati olan .xlsx kullaniliyor. Uzantiyi .xls veya .xlsx vermek ayni gibi gorunse de degil. O nedenle versiyon kontrolu yapip, .xlsx ise .xlsx olarak saklamakta fayda var (ne yazik ki, su anda .xlsx dosyasini .xls olarak adlandirinca cikacak problemin detayi yok. Saece problem oldugunu hatirliyorum. xls binary format, xlsx ise ziplenmis xml).

10

Re: Excel dosya açma save etme

Evet, karakolda yazar, mahkemede şaşar gibi evde çalışan fabrikada kullanılan excel versiyonunda şaştı.
Ignore seçeneği de kaydı atlıyor.
Çetin'in önerisini uygulayıp bilgi vereceğim. Ben de şimdi excel versionunu (normal uzantısını belirlemek) kontrol etmek gerektiğini düşünüyorum. O zaman SaveAS() deki dosya adını sürmek gerekiyor gibi ...

İleti eklentileri

excelmesaj.jpg
excelmesaj.jpg 53.86 kb, 3 kez indirildi, 2012-11-15 tarihinden itibaren 

Bu iletideki eklenti/leri indirmeye yetkiniz yok.
VFP9 SP2

11

Re: Excel dosya açma save etme

cetinbasoz yazdı:

Nacizane fikrim 56 kullanma. Ofis olan her bilgisayarda bulamayabilirsin (bende yok galiba mesela). Onun yerine Excel'in hangi versiyonu kullaniliyor ise onu kullan:

Visual Fox Pro
#Define xlWorkbookNormal                                  -4143

oXL.ActiveWorkBook.SaveAs(m.lcXLSFileName,xlWorkbookNormal)


Büyük Bingo her zamanki gibi Çetin'e çıktı. - tşk.
Bahsettiği diğer komplikasyonlar ile kafa yormadım, program gerektirmiyor.

VFP9 SP2