Eyl 29, 2014 - X++    Yorum Yok

Axaptadan Excele Aktarım

Daha önceki konularımızda dışarıdan(excel ve csv ile) axapta içerisine nasıl veri atılacağını anlatmıştım. Bu konumuzda da Axaptadan excele atarım yani export işlemini anlatacağım. Genellikle daha çok csv ye aktarım gibi konular ihtiyaç olsada ilk etapta excel ile nasıl yapılıyor hücrelere atamaları nasıl yaparız onlarla ilgili basit bir örnek hazırladım. Bir sonraki konumuzda da cvs den bahsedeceğim.

Export işlemi import işlemi kadar(excel ve csv) sık çıkmasada karşımıza zaman zaman ihtiyaç duyabileceğimiz bir konudur.Burada iki yöntem vardır. Birincisi boş bir excel oluşturarak istediğiniz alanları sizin dolduracağınız yöntemdir. Diğer bir yöntem ise hazır bir excel şablonu hazırlayıp belirttiğiniz yerden o şablonu çağırarak istediğiniz alanlara ax içerisindeki istediğiniz verileri basmak için kullanacağınız bir yöntemdir excele aktarım.

İlk olarak boş bir excele kayıt aktarmaya bakalım. Sistemde kayıt edilecek yer seçimli bir dialoglu örnek aşağıdaki gibidir.

static void Erkn_ExceleAktarim(Args _args)
{
    #AviFiles
    SysOperationProgress        progress = new SysOperationProgress();
    SysExcelApplication         application;
    SysExcelWorkbooks           workbooks;
    SysExcelCells               cells;

    FileIoPermission            perm;

    SysExcelWorkbook            workbook;
    SysExcelWorksheets          worksheets;
    SysExcelWorksheet           worksheet;

    int                         i;
    int                         row = 1;
    FileName                    toFileName;
    FilePath                    toFilePath;

    CustTable                   custTable;
    SalesTable                  salesTable;

    SysGlobalCache          globalCache = infolog.objectOnServer() ? appl.globalCache() : infolog.globalCache();

    #define.FileMode('R')
    ;

    toFilePath      = WinAPI::browseForFolderDialog("Dosyasının kaydedliceği klasörü seçin");
    toFileName      = toFilePath + "\\test.xlsx";

    perm         = new FileIOPermission(toFileName, #FileMode);
    perm.assert();
    application  = SysExcelApplication::construct();
    workbooks    = application.workbooks();
    workbook     = workbooks.add();
    worksheets   = workbook.worksheets();
    worksheet    = worksheets.itemFromNum(1);
    if (worksheet)
    {
        cells = worksheet.cells();
    }
    else
    {
        throw warning('Dosya açılmadı.');
    }

    progress.setCaption("Migrating ...");
    progress.setAnimation(#AviTransfer);

    try
    {
        //worksheet.cells().item(satır sırası,sutün sırası).value(YazılacakDeğer);
        //Başlık
        worksheet.cells().item(row,1).value("Müşteri Kodu");
        worksheet.cells().item(row,2).value("Müşteri Adı");
        worksheet.cells().item(row,3).value("Sipariş numarası");

        //Satırlar
        while select custTable
            join salesTable
            where salesTable.CustAccount == custTable.AccountNum
        {
            row++;
            worksheet.cells().item(row,1).value(custTable.AccountNum);
            worksheet.cells().item(row,2).value(custTable.name());
            worksheet.cells().item(row,3).value(salesTable.SalesId);
        }

        worksheet.cells().item(row + 2,1).value("Müşterilere bağlı satış sipariş numaraları listelenmiştir.");
    }
    catch (Exception::Error)
    {
        workbooks.close();
        CodeAccessPermission::revertAssert();
        application.quit();
        ttsabort;
    }
    if(WinApi::fileExists(toFileName))
      WinApi::deleteFile(toFileName);
    //Excel kaydetme
    workbook.saveAs(toFileName);
    //Excel açma
    application.visible(true);
    CodeAccessPermission::revertAssert();
    //Excel kapatma
    application.quit();
}

Kaydettiğimiz excel çıktısı aşağıdaki gibi olacaktır.

ax2012 excele aktarım

Diğer bir yöntem olan şablon kullanma yönteminden bahsedecek olursak.
Örnek bir adet karmaşık bir şablonumuz olsun. Onu bi yerde sabit tuttuktan sonra(seçimli vs yapılabilir geliştirmek size kalmış) orjinali bozmamak için ordan bir kopya oluşturup kaydedilecek yer seçilir ve istenilen hücreleri doldurularak işlem tamamlanır.

excele aktarım excel import

static void Erkn_ExceleAktarimSablon(Args _args)
{
    #AviFiles
    SysOperationProgress        progress = new SysOperationProgress();
    SysExcelApplication         application;
    SysExcelWorkbooks           workbooks;
    SysExcelCells               cells;

    FileIoPermission            perm;

    SysExcelWorkbook            workbook;
    SysExcelWorksheets          worksheets;
    SysExcelWorksheet           worksheet;

    int                         i;
    int                         row = 4;
    FileName                    fromFileName,toFileName;
    FilePath                    toFilePath;

    CustTable                   custTable;
    SalesTable                  salesTable;

    SysGlobalCache          globalCache = infolog.objectOnServer() ? appl.globalCache() : infolog.globalCache();

    #define.FileMode('R')
    ;
    
    fromFileName    = "C:\\testSablon.xlsx"; //Şablonun alınacağı yer ve dosya
    toFilePath      = WinAPI::browseForFolderDialog("Dosyasının kaydedliceği klasörü seçin");
    toFileName      = toFilePath + "\\testCopy.xlsx"; //Kaydedilecek yol + dosya adı
    WinAPI::copyFile(fromFileName, toFileName, true); //Kopya oluşturma işlemi

    perm         = new FileIOPermission(toFileName, #FileMode);
    perm.assert();
    application  = SysExcelApplication::construct();
    workbooks    = application.workbooks();
    try
    {
        workbooks.open(toFileName);
    }
    catch (Exception::Error)
    {
        throw error("Dosya açılmadı.");
    }
    workbook = workbooks.item(1);
    worksheets   = workbook.worksheets();
    worksheet    = worksheets.itemFromNum(1);
    
    if (worksheet)
    {
        cells = worksheet.cells();
    }
    else
    {
        throw warning('Dosya açılmadı.');
    }

    progress.setCaption("Migrating ...");
    progress.setAnimation(#AviTransfer);

    try
    {
        worksheet.cells().item(2,2).value(CompanyInfo::find().Name);
        //worksheet.cells().item(satır sırası,sutün sırası).value(YazılacakDeğer);
        //Satırlar
        while select firstOnly10 custTable
            join salesTable
            where salesTable.CustAccount == custTable.AccountNum
        {
            row++;
            worksheet.cells().item(row,2).value(custTable.AccountNum);
            worksheet.cells().item(row,3).value(custTable.name());
            worksheet.cells().item(row,4).value(salesTable.SalesId);
        }
        worksheet.cells().item(17,1).value("Erkan OĞUZ");
        worksheet.cells().item(17,3).value("Yönetim");
    }
    catch (Exception::Error)
    {
        workbooks.close();
        CodeAccessPermission::revertAssert();
        application.quit();
        ttsabort;
    }
    if(WinApi::fileExists(toFileName))
      WinApi::deleteFile(toFileName);
    //Excel kaydetme
    workbook.saveAs(toFileName);
    //Excel açma
    application.visible(true);
    CodeAccessPermission::revertAssert();
    //Excel kapatma
    application.quit();
}

excele aktarım excel import

Sonuçta çıktı üstteki gibi olacaktır. Şablon oluşturmanın avantajı dışarıdan girilen fontlar biçimler başlıklar gibi durumlarla uğraşmak durumunda kalmıyorsunuz. Dezavantajları ise liste dökümü hazırlıyorsanız mutlaka sınırını belirtmeniz gerekiyor. Diğer bir dezavantajı ise yazmak istediğiniz hücrenin adresini direk bilmeniz gerekmektedir.

Bu gibi durumları göz önüne alarak hangi yöntem işinize yarıyorsa kendiniz belirleyerek kullanabilirsiniz.

Erkan OĞUZ

Önceki Konu->

<- Sonraki Konu

Benzer yazılar

Yorum Yazın...