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.
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.
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(); }
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.