در مقاله قبلی مثال ساخت یک GUI را بررسی کردیم که قد و وزن کاربر را دریافت میکرد و شاخص BMI فرد را اعلام میکرد. علاوه بر قد و وزن، ما از کابر نام و سن وی را هم پرسش کردیم که ارتباطی به محاسبات BMI نداشت و صرفا بخاطر آموزش مطلب این جلسه بود. در این جلسه که جلسه پایانی ساخت رابط گرافیکی کاربر است ما در ابتدا قصد داریم نحوه ارتباط بین متلب و اکسل را آموزش داده و سپس اطلاعات ورودی کاربر و همچنین وضعیت BMI آن را در یک فایل اکسل ذخیره نماییم :
برای برقراری ارتباط بین اکسل و نرم افزار متلب دو تابع کاربردی xlsread و xlswrite وجود دارد. تابع xlsread همانطور که از نامش پیداست برای خواندن اطلاعات از فایل اکسل بکار می رود. شکل کلی تابع xlread به این صورت است :
[num, txt] = xlsread(file, sheet, range)
که در عبارت بالا ، file برابر نام نام فایل اکسل (از نوع رشته) ، sheet برابر نام صفحه موردنظر داخل فایل (از نوع رشته)، range برابر یک بازه موردنظر برای خواندن (از نوع رشته) ، num برای خواندن داده های عددی (از نوع ماتریس یا آرایه عددی) و txt برای خواندن داده های متنی (از نوع آرایه سلولی) میباشند.
اما شکل کلی برای تابع xlswrite به صورت زیر است که برای نوشتن داخل یک فایل اکسل به کار میرود:
xlswrite(file, m, sheet, range)
که در آن :
m برابر ماتریسی است که قرار است در اکسل قرار بگیرد و پارامترهای file ، sheet و range مطابق تعریف قبل هستند. برای روشن شدن مطالب بالا ، یک مثال را با هم بررسی میکنیم:
فرض کنیم ما فایلی با نام ex2mat.xls داریم که شامل دو برگه با نام های Days و Mounth است. در شکل های زیر اطلاعات موجود در این فایل و برگه هایش را میبینیم
با تعریف متغیرهای زیر کار را شروع میکنیم ، باید دقت نماییم که در خط اول کد زیر فرض شده است که فایل اکسل مورد نظر در مسیری قرار دارد که فایل متلب نیز در آنجاست و اگر فایل اکسل در مسیر دیگری غیر از این باشد باید آدرس مسیر را به صورت کامل در اینجا وارد کنید:
file = 'ex2mat.xls'; sheet1 = 'Days'; sheet2 = 'Months';
بعد از تعریف این متغیر ها فقط کافیست دستور زیر را وارد نماییم :
[numbers, text] = xlsread(file, sheet1, 'a1:c8')
و نتیجه به این شکل خواهد بود :
numbers = 1.0e+004 * 0.5538 0.0381 0.5504 0.0371 0.5480 -1.7382 2.3209 -0.8941 3.2497 3.1644 0.1200 -1.0851 1.2398 1.2745 text = 'Day' 'Value 1 ' 'Value 2' 'Monday' '' '' 'Tuesday' '' '' 'Wednesday' '' '' 'Thursday' '' '' 'Friday' '' '' 'Saturday' '' '' 'Sunday' '' ''
همانطور که در بالا مشخص است، خروجی به شکل دو ماتریس چاپ شده اند که یکی فقط شامل اعداد است و دیگری فقط شامل متن ها است.
برای نوشتن اطلاعلات در اکسل از کدهای زیر در ادامه کدهای قبل استفاده میکنیم :
m = mean(numbers) xlswrite(file, m, sheet1, 'b9:c9') [numbers, text] = xlsread(file, sheet1, 'a5:c5') m = m + numbers; xlswrite(file, m, sheet1, 'b10:c10')
در خط 1 از کدهای بالا ، میانگین اعداد ستون b و c در یک ماتریس به نام m قرار میگیرند و در خط 2 این اطلاعات در سلول های b9 و c9 چاپ میشوند. در خط 4 اطلاعات ردیف پنجم 5 خوانده میشود و در خط 5 پارامتر m با که میانگین ستون ها بود، با مقدار ردیف پنجم جمع میشود، در خط آخر نیز مجددا در فایل اکسل اطلاعات نوشته میشود. خروجی کدهای بالا به شکل زیر است :
همانند مثال بالا برای برگه Mounth هم میتوانیم داشته باشیم :
[n1, txt1] = xlsread(file, sheet2, 'a1:c13') [n2, txt2] = xlsread(file, sheet2, 'a2:c2')
و نتایج آن :
n1 = 1.0e+004 * 2.5000 2.3723 2.6000 2.4723 2.6500 2.5223 2.2002 2.0725 3.4098 3.2821 4.9854 4.8577 0.2454 0.1177 2.3111 2.1834 2.2311 2.1034 6.5471 6.4194 2.3841 2.2564 2.3999 2.2722 txt1 = 'Month' 'Value 1 ' 'Value 2' 'January' '' '' 'February' '' '' 'March' '' '' 'April' '' '' 'May' '' '' 'June' '' '' 'July' '' '' 'August' '' '' 'September' '' '' 'October' '' '' 'November' '' '' 'December' '' '' n2 = 25000 23723 txt2 = 'January'
بعد از مشخص شدن نحوه عمل این دو تابع، به مثال خودمان در مبحث رابط گرافیکی کاربر باز گردیم در جایی که شکل زیر را داشتیم :
حال میخواهیم در ادامه کدهای جلسه سوم به ساخت کد های مربوط به دکمه save to BMI.xls بپردازیم. قبل از رفتن سراغ کد نویسی بهتر است فایل اکسلی مطابق زیر در مسیر اصلی بسازیم :
سلول B1 تعداد کل فیلد ها را محاسبه میکند که دارای فرمول +COUNT( G3 : G65536 ) . این فیلد به این منظور است که به متلب نشان دهد چند فیلد برای نمایش وجود دارد. همچنین ما میتوانیم یک پنجره پاپ آپ برای نمایش موفقیت آمیز بودن عملیات نمایش دهیم. این موارد با کدهای زیر انجام میپذیرند :
% --- Executes on button press in save_button. function save_button_Callback(hObject, eventdata, handles) d{1, 1} = handles.name; d{1, 2} = handles.age; d{1, 3} = handles.weight; d{1, 4} = handles.wu; d{1, 5} = handles.height; d{1, 6} = handles.hu; d{1, 7} = handles.result; d{1, 8} = handles.condition; c = xlsread('bmi', 1 , 'b1'); position = ['a' num2str(c+3)]; [status, message] = xlswrite('bmi', d, 1, position); if status helpdlg('Data saved ok...', 'Save Spreadsheet'); else errordlg('Could not save data', 'Save Spreadsheet'); end
با توجه به مطالب گفته شده در این جلسه ، میتوانیم کدهای بالا را تفسیر کنیم:
خط 3 تا 10 آرایه d را با مقادیر ورودی مناسب پر میکند، خط 11 سلول b1 را میخواند تا تشخیص دهد خروجی را باید در کدام ردیف چاپ کند.
خط 12 با جمع کرد مقدار موجود در b1 با عدد3 ، به اولین ردیف خالی در فایل اکسل اشاره میکند.
خط 13 اطلاعات d را در فایل اکسل در اولین ردیف خالی قرار میدهد.
خط های بعدی وضعیت موفقیت یا عدم موفقیت را به کاربر نمایش میدهند.
نتایج به صورت زیر است :
در اینجا آموزش مقدماتی ساخت رابط گرافیکی کاربر به اتمام میرسد