کار با فایل های اکسل در پایتون — راهنمای مقدماتی

۲۸۴۴ بازدید
آخرین به‌روزرسانی: ۳۰ آبان ۱۴۰۲
زمان مطالعه: ۱۱ دقیقه
کار با فایل های اکسل در پایتون — راهنمای مقدماتی

کار با پایتون در اغلب موارد به تنهایی خود یک نعمت محسوب می‌شود. افرادی که مدت زمان زیادی با پایتون کار کرده‌اند، غالباً اظهار می‌کنند که در کار با آن هیچ مشکلی ندارد، اما شاید آن‌ها مجبور به کار با «صفحه‌های گسترده» (اسپردشیت) و فایل های اکسل در پایتون نشده‌اند. پایتون ساختار آسانی برای نوشتن دارد و سبک دینامیک آن موجب شده که به گزینه‌ای عالی برای مبتدیان تبدیل شود. اما مزیت‌های آن به اینجا ختم نمی‌شود. پایتون می‌تواند در بسیاری از محصولات بزرگ مانند فریمورک Django استفاده شود و استفاده هم می‌شود.

جنگو قدرت برخی اپلیکیشن‌های رسانه‌ای مانند اینستاگرام را تأمین می‌کند. نمونه‌های دیگر شامل BitTorrent ،Google App Engine و Ubuntu Software Center هستند. حتی کارکردهای مرکزی یوتیوب نیز در پایتون نوشته شده‌اند. همه این مثال‌ها پایداری و مفید بودن پایتون را نشان می‌دهند.

کار با داده و فایل های اکسل در پایتون

پایتون یک زبان اسکریپت‌نویسی عالی است و توسعه‌دهندگان ترجیح می‌دهند از آن در مواردی استفاده کنند که قرار است با داده سروکار داشته باشند و آن‌ها را دستکاری کنند. به طور خاص پایتون در مواردی مفید است که قرار است در یک پروژه داده‌هایی از محصولات گردآوری شده و به مشتریان گزارش‌دهی شود.

این کار نیازمند واکشی داده‌ها از پایگاه داده و دستکاری آن‌ها به صورت یک فرم قابل ارائه است که به صورت کلی قالب «صفحه گسترده» است. در این نوشته به بررسی روش انجام این کار می‌پردازیم.

نکاتی که در این نوشته مطرح می‌شوند مختص افرادی هستند که با داده‌های زیادی سروکار دارند و می‌خواهند آن‌ها را در قالب صفحه گسترده یا اسپردشیت ارائه کنند. در مسیر انجام این کار چند مشکل وجود دارد که برخی از آن‌ها را در اینجا مطرح می‌کنیم و روش‌های رفع آن‌ها را نیز توضیح می‌دهیم.

پکیج‌های شخص ثالث زیادی برای کار با اسپردشیت‌ها در پایتون وجود دارند. برخی از آن‌ها شامل فهرست زیر هستند:

  • Openpyxl (+)
  • Xlsxwriter (+)
  • Xlrd (+)
  • Xlwt (+)
  • Xlutils (+)

شاید اطلاع داشته باشید که اکسل دو پسوند فایل برای صفحه‌های گسترده ارائه کرده است که یکی xls. و دیگری xlsx. است. اولی برای فایل‌هایی با قالب مایکروسافت اکسل 2003 و قبل‌تر است و دومی برای نسخه‌های جدیدتر استفاده می‌شود.

نخستین مشکلی که در زمان کار کردن با صفحه‌های گسترده در پایتون پیش می‌آید این است که دو پسوند فایل مختلف وجود دارند. پکیج xlwt از پسوند xls. برای فایل‌های اکسل پشتیبانی می‌کند و openpyxl نیز از پسوند xlsx. برای فایل‌های اکسل پشتیبانی می‌کند.

پکیج xlwt

در ادامه شیوه استفاده از پکیج xlwt را برای کار کردن با صفحه‌های گسترده توضیح می‌دهیم. شما می‌توانید این پکیج را با اجرای دستور زیر روی ترمینال یا اعلان فرمان، نصب کنید:

pip install xlwt

توجه کنید که باید pip روی سیستم شما نصب باشد. برای نصب pip از دستورالعمل‌های این مطلب استفاده کنید:

در این مطلب از xlwt نسخه 1.3.0 استفاده شده است. پس از این که کار نصب پکیج کامل شد یک ویرایشگر متنی باز کنید و یک فایل جدید ایجاد کرده و نامی که دوست دارید را به آن بدهید. ما نام فایل خود را excelScript.py گذارده‌ایم.

درون این اسکریپت کد زیر را بنویسید:

1import xlwt
2def main():
3    book = xlwt.Workbook()
4    sheet = book.add_sheet('Sheet 1')
5    book.save('Sample.xls')
6if __name__ == '__main__':
7    main()

کد فوق یک فایل اکسل خالی با نام Sample.xls ایجاد می‌کند که شامل یک برگه منفرد با عنوان Sheet 1 است. این برگه نمونه‌ای از ایجاد فایل ساده xls. است. اسکریپت فوق را می‌توانید به صورت زیر در خط فرمان اجرا کنید:

python excelScript.py

برای نوشتن داده‌ها در برگه اکسل، کد را به صورت زیر تغییر دهید:

1import xlwt
2def main():
3    book= xlwt.Workbook()
4    sheet = book.add_sheet('Sheet 1')
5# sheet.write(r, c, <text>)
6    sheet.write(0, 0, 'sample')
7book.save('Sample.xls')
8if __name__ == '__main__':
9    main()

بدین ترتیب عبارت sample در ردیف صفر و ستون صفر نوشته می‌شود. به خاطر بسپارید که پکیج xlwt اندیس‌های ردیف‌ها و ستون‌ها را از صفر آغاز می‌کند. بدین ترتیب می‌توانیم هر تعداد برگه که می‌خواهید در فایل‌های اکسل بنویسید. این اسکریپت را با استفاده از دستور زیر در خط فرمان اجرا کنید:

python excelScript.py

این یک روش رایج برای نوشتن اکسل با استفاده از پکیج xlwt است که در آن می‌توانید ستون‌ها و ردیف‌ها را ادغام کنید. شما می‌توانید استایل نیز تعیین کنید. کد زیر روش انجام این کار را نشان می‌دهد:

1import xlwt
2def main():
3    book= xlwt.Workbook()
4    sheet = book.add_sheet('Sheet 1')
5# sheet.write_merge(r1, r2, c1, c2, <text>)
6    # For styling add
7    # xlwt.easyxf('align: horz center, vert center')
8    # add the above after <text> as 6th argument to write_merge
9sheet.write_merge(0, 1, 0, 1, 'sample 1', xlwt.easyxf('align: horz center, vert center'))
10book.save('Sample.xls')
11if __name__ == '__main__':
12    main()

بدین ترتیب ستون‌های (0,1) و ردیف‌های (0,1) ادغام می‌شوند تا یک ستون منفرد تشکیل دهند و sample 1 در آن نوشته می‌شود که در جهات افقی و عمودی به صوت مرکزی هم‌راستا شده است. xlwt.easyxf کار استایل دادن را برای شما انجام می‌دهد. اگر فایل xls را باز کنید، نمونه قبلاً نوشته شده را می‌بینید. برای کسب اطلاعات بیشتر در مورد متدهای ارائه شده از سوی پکیج xlwt می‌توانید به صفحه مستندات آن (+) مراجعه کنید.

توجه داشته باشید که اگر از xlwt استفاده کنید و فایلی با همان نام وجود داشته باشد در این صورت فایل جایگزین خواهد شد. رویه فوق محدودیت‌هایی نیز دارد، زیرا می‌توانید تنها 65536 ردیف و 256 ستون در نسخه‌های قدیمی اکسل ایجاد کنید. به طور مشابه در زمان استفاده از این پکیج نیز تنها می‌توانید این تعداد ردیف و ستون ایجاد کنید. اگر می‌خواهید داده‌های بیشتر از این مقدار بنویسید، در این صورت متأسفانه این پکیج نمی‌تواند به شما کمک کند و باید از پکیج پایتون دیگری به نام openpyxl (+) استفاده کنید.

در زمان کار با پکیج xlwt متوجه شدیم که ایجاد فایل‌های xls. بسیار آسان است، اما اگر از قبل یک فایل xls. داشته باشیم و بخواهیم داده‌های جدیدی به فایل موجود الحاق کنیم چطور؟ در چنین حالتی پکیج xlwt مناسب نخواهد بود و باید این مشکل را رفع کنیم. توجه داشته باشید که اگر یک فایل xls. داشته باشید در این صورت نمی‌توانید از openpyxl استفاده کنید که از الحاق داده‌ها به فایل‌های موجود پشتیبانی می‌کند، زیرا این پکیج با نسخه‌های قدیمی فایل‌های اکسل ناسازگار است.

برای حل این مشکل به دو پکیج دیگر پایتون نیاز داریم. برای نمونه پکیج xlrd برای خواندن فایل اکسل و پکیج xlutils برای ایجاد یک کپی از شیء اکسل درون شیء xlwt است به طوری که بتوان درون آن چیزی نوشت. برای نصب این پکیج‌ها دستورهای زیر را اجرا کنید:

pip install xlrd
pip install xlutils

برای الحاق داده‌ها به یک فایل موجود xls. با استفاده از xlwt، رویه زیر می‌تواند مورد استفاده قرار گیرد. در فایل excelScript.py، کد را به صورت زیر تغییر دهید:

1from xlutils.copy import copy
2import xlrd
3import xlwt
4def main():
5    rb = xlrd.open_workbook('sample.xls')
6    
7    wb = copy(rb)
8    sheet = wb.get_sheet(0)
9   
10    sheet.write(5, 5, 'sample 2')
11    sheet.write_merge(3, 4, 3, 4, 'sample 3', xlwt.easyxf('align: horse center, vert center'))
12wb.save('sample.xls')
13if __name__ == '__main__';
14    main()

زمانی که این اسکریپت را با استفاده از دستور زیر اجرا کنید:

python excelScript.py

و فایل اکسل ایجاد شده را باز کنید، متوجه خواهید شد که sample 1 در فایل xls. موجود قبلی نوشته شده است و sample 2 و sample 3 نیز به آن فایل اضافه شده است. این همان کارکردی است که به آن نیاز داریم. در ادامه روش اجرای آن را توضیح می‌دهیم.

سیر وقایعی که اتفاق می‌افتند به صورت زیر است. ابتدا فایل با استفاده از پکیج xlrd خوانده می‌شود و در یک متغیر به نام rb در قالب یک شیء ذخیره می‌شود. سپس این شیء با استفاده از متد copy در پکیج xlutils درون یک متغیر wb کپی می‌شود. این بدان معنی است که در بازه‌ای از زمان هر دو متغیر rb و wb حاوی داده‌های شیء یکسانی خواهند بود. اکنون با استفاده از اندیس صفر به برگه نخست اکسل دسترسی داریم و داده‌های شیء آن را درون متغیر sheet ذخیره می‌کنیم. همچنین در این زمان می‌توانیم از همه ظرفیت‌های کارکردی پکیج xlwt برای ذخیره نهایی برگه اکسل با همان نام قبلی یعنی sample.xls استفاده کنیم.

اگر مطالب فوق را به دقت پیگیری کرده باشید، در این صورت احتمالاً متوجه شده‌اید که داده‌ها در عمل واقعاً به فایل موجود الحاق نشده‌اند. در واقع کاری که ما انجام دادیم این است که داده‌های فایل موجود را با استفاده از xlrd درون حافظه کپی کرده‌ایم، پس آن‌ها را با استفاده از متد copy از پکیج xlutiles درون فایل اکسل جدیدی نوشته‌ایم و در نهایت داده‌های جدید را در فایل جدید اکسل نوشته‌ایم و آن را با همان نام قبلی ذخیره کرده‌ایم تا روی فایل قبلی بازنویسی شود.

اسپردشیت در پایتون

پکیج openpyxl

در صورتی که با فایل‌های قدیمی xls. کار می‌کنید، شاید این روش چندان مناسب نباشد و قضیه به همین جا ختم نمی‌شود. همه این موارد که طرح شد به کار با فایل‌های xls. مربوط می‌شوند، اما گر بخواهیم همین کار را روی فایل‌های xlsx. انجام دهیم باید از پکیج openpyxl استفاده کنیم.

در ادامه به بررسی استفاده از پکیج پایتون openpyxl برای ایجاد صفحه‌های گسترده در قالب xlsx. می‌پردازیم. چنان که پیش‌تر گفتیم، اگر داده‌های زیادی در فایل خود داشته باشید و مشتری‌های زیادی وجود داشته باشند که قرار باشد به همه آن‌ها گزارش دهیم در این صورت دانستن روش کار با قالب‌های xls. و xlsx. به عنوان قالب‌های قدیمی و جدید ذخیره فایل اکسل مهارت مناسبی است که در اغلب موارد به کار شما می‌آید.

پکیج openpyxl (+) یک کتابخانه پایتون برای خواندن و نوشتن فایل‌های xlsx/xlsm/xltx/xltm است.

بدین ترتیب تنها با استفاده از یک پکیج می‌توان داده‌ها را خواند، نوشت و الحاق کرد. این پکیج را می‌توان با استفاده از دستور زیر در ترمینال یا اعلان فرمان نصب کرد:

pip install openpyxl

توجه کنید که pip باید روی سیستم نصب باشد. پس از این که نصب پکیج پایان یافت، ویرایشگر متنی را باز کنید تا یک فایل جدید ایجاد کنید و نامی که دوست دارید را روی آن بگذارید. ما فایل خود را excelScript.py نامیدیم. درون اسکریپت کد زیر را بنویسید:

1import openpyxl
2def main():
3   book = openpyxl.Workbook()
4   book.create_sheet('Sample Sheet')
5   book.save('Sample.xlsx')
6if __name__ == '__main__':
7   main()

کد فوق یک فایل اکسل خالی به نام Sample.xlsx ایجاد می‌کند که شامل یک برگه منفرد به نام sheet 1 است. این برگه نمونه‌ای از فرایند ایجاد یک فایل xslx. است. اسکریپت زیر را با وارد کردن دستور زیر در خط فرمان اجرا کنید:

python excelScript.py

زمانی که این فایل xlsx. را باز کنید، می‌بینید که به جای یک برگه، دو برگه در فایل ایجاد شده است. دلیل رخ دادن این وضعیت آن است که در زمان ایجاد یک شیء با متد ()Workbook در پکیج openpyxl، این متد به طور پیش‌فرض به محض فراخوانی یک برگه به نام sheet ایجاد می‌کند.

اگر نام‌های برگه‌ای که روی آن کار می‌کنید، برایتان مهم نیست می‌توانید مستقیماً روی همین برگه کار کنید و نیازی به ایجاد برگه دیگر وجود ندارد. اگر کارتان طوری است که باید حتماً از یک برگه استفاده کنید، می‌توانید مستقیماً شروع به نوشتن در این برگه بکنید. در ادامه شیوه حذف برگه پیش‌فرض Sheet از فایل xlsx. را آموزش خواهیم داد. برای نوشتن داده‌ها در اکسل کد را به صورت زیر تغییر دهید:

1import openpyxl
2def main():
3    book = openpyxl.Workbook()
4    book.create_sheet('Sample')
5# Acquire a sheet by its name
6    sheet = book.get_sheet_by_name('Sample')
7# Writing to sheet
8    sheet.cell(row=1, column=1).value = 'sample'
9book.save('Sample.xlsx')
10if __name__ == '__main__':
11    main()

کد فوق عبارت sample را در ردیف اول و ستون اول وارد می‌کند. به خاطر داشته باشید که پکیج openpyxl اندیس‌های ردیف و ستون را با شروع از یک می‌خواند. بدین ترتیب می‌توانید در فایل اکسل بنویسید و هر تعداد برگه که دوست دارید ایجاد کنید. اسکریپت فوق را با وارد کردن دستور زیر در خط فرمان اجرا کنید:

python excelScript.py

همچنین می‌توانید به آن استایل نیز بدهید. کد زیر روش انجام این کار را به شما نشان می‌دهد:

1import openpyxl
2def main():
3    book = openpyxl.Workbook()
4    book.create_sheet('Sample')
5# Acquire a sheet by its name
6    sheet = book.get_sheet_by_name('Sample')
7# Writing to sheet
8    sheet.cell(row=1, column=1).value = 'sample'
9# To set alignment of text inside cell and text wrapping
10    sheet.cell(row=1, column=1).alignment = openpyxl.styles.Alignment(horizontal='center', vertical='center', wrap_text=True)
11# To make font bold or italic
12    sheet.cell(row=1, column=1).font = openpyxl.styles.Font(bold=True, italic=True)
13book.save('Sample.xlsx')
14if __name__ == '__main__':
15    main()

بدین ترتیب عبارت sample در ردیف اول و ستون اول درج می‌شود. این سلول از جهات افقی و عمودی به صورت مرکرگزا همراستا شده است. برای کسب اطلاعات بیشتر در مورد متدهای ارائه شده از سوی پکیج openpyxl به مستندات آن (+) مراجعه کنید.

همچنین همانند کاری که با استفاده از xlwt انجام دادیم، می‌توانید با استفاده از openpyxl نیز سلول‌ها را در هم ادغام کنید. کد زیر روش ادغام سلول‌ها را با استفاده از openpyxl نشان می‌دهد:

1import openpyxl
2def main():
3    book = openpyxl.Workbook()
4    book.create_sheet('Sample')
5# Acquire a sheet by its name
6    sheet = book.get_sheet_by_name('Sample')
7# Merging first 3 columns of 1st row
8    sheet.merge_cells('A1:C1')
9# Writing to sheet
10    sheet.cell(row=1, column=1).value = 'sample'
11book.save('Sample.xlsx')
12if __name__ == '__main__':
13    main()

کد فوق شیوه ادغام سلول‌ها را هنگامی نشان می‌دهد که نام سلول‌هایی که باید ادغام شوند را به طور کامل می‌دانید. مثلاً در کد فوق می‌دانستیم که نام سلول ستون اول و ردیف اول A1 و نام سلول ستون سوم و ردیف اول C1 است. در این حالت آن‌ها را مستقیماً با استفاده از متد merge_cells در پکیج openpyxl ادغام می‌کنیم. این یکی از دو متدی است که در openpyxl برای ادغام سلول‌ها استفاده می‌شود. متد دوم نیز به صورت زیر عمل می‌کند:

1import openpyxl
2def main():
3    book = openpyxl.Workbook()
4    book.create_sheet('Sample')
5# Acquire a sheet by its name
6    sheet = book.get_sheet_by_name('Sample')
7# Merging first 3 columns of 1st 3 rows
8    r1 = 1
9    r2 = 3
10    c1 = 1
11    c2 = 3
12    sheet.merge_cells(start_row=r1, start_column=c1, end_row=r2, end_column=c2)
13# Writing to sheet
14    sheet.cell(row=1, column=1).value = 'sample'
15book.save('Sample.xlsx')
16if __name__ == '__main__':
17    main()

این متد زمانی به کار می‌آید که داده‌ها به صورت دینامیک در فایل اکسل نوشته شده باشند. اگر مطمئن نیستید که نام دقیق سلول‌هایی که قرار است ادغام شوند چه هستند، در این صورت می‌توانید از این متد استفاده کنید. این متد سه ستون اول از سه ردیف اول را در یک سلول منفرد ادغام می‌کند.

زمانی که سلول‌ها را ادغام می‌کنید، همواره به خاطر داشته باشید که باید مقدار را درون ستون اول سلول ادغام شده وارد کنید، چون در غیر این صورت مقدار مورد نظر از فایل اکسل حذف می‌شود. شما می‌توانید استایل سلول ادغام شده را به طرز مشابهی که قبلاً نشان دادیم اعمال کنید. اکنون نوبت به بررسی روش حذف برگه اضافی می‌رسد که به طور پیش‌فرض با فراخوانی متد ()Workbook کتابخانه openpyxl ایجاد شده است. روش انجام کار به صورت زیر است:

1import openpyxl
2def main():
3    book = openpyxl.Workbook()
4book.create_sheet('Sample')
5extraSheet = book.get_sheet_by_name('Sheet')
6    book.remove_sheet(extraSheet)
7book.save('Sample.xlsx')
8if __name__ == '__main__':
9    main()

در این کد ما برگه‌ای با نام Sheet را با استفاده از متد ()get_sheet_by_name در یک شیء قرار می‌دهیم و سپس آن را در متغیر extraSheet ذخیره کرده و در نهایت برگه را با استفاده از فراخوانی متد ()remove_sheet روی متغیر extraSheet حذف می‌کنیم. بدین ترتیب با مراحل ایجاد یک فایل جدید xlxs.، نوشتن آن، ادغام سلول‌ها و استایل‌دهی آن آشنا شدیم. اکنون به بررسی روش خواندن و الحاق داده‌ها در فایل xlsx. با استفاده از پکیج openpyxl می‌پردازیم.

قبل از هر چیز روش خواندن فایل xlsx. را با استفاده از openpyxl بررسی می‌کنیم. همانند روش نوشتن می‌توان از ()openpyxl.load_workbook برای باز کردن یک ورک‌بوک موجود استفاده کرد:

1import openpyxl
2def main():
3    book = openpyxl.load_workbook('Sample.xlsx')
4    print book.get_sheet_names()
5    # ['Sheet2', 'New Title', 'Sheet1']
6# Get a sheet to read
7    sheet = book.get_sheet_by_name('Sheet1')
8# No of written Rows in sheet
9    r = sheet.max_row
10# No of written Columns in sheet
11    c = sheet.max_column
12# Reading each cell in excel
13    for i in xrange(1, r+1):
14        for j in xrange(1, c+1):
15            print sheet.cell(row=i, column=j).value
16if __name__ == '__main__':
17    main()

کد فوق همه سلول‌های نوشته شده در فایل اکسل را نمایش می‌دهد. حلقه for به جای 0 از 1 آغاز می‌شود چون openpyxl اندیس‌گذاری را از 1 آغاز می‌کند. همچنین می‌توان سلول‌ها را با استفاده از نام سلول‌ها نیز خواند:

1# prints 1st row, 1st column directly
2print sheet['A1']
3# get a range of cells
4cells = sheet['A1:C1']
5for cell in cells[0]:
6    print cell.value

ما [cells[0 را انتخاب کردیم، زیرا ['sheet['A1:C1 یک چندتایی از چندتایی‌ها ایجاد می‌کند و همه اشیای سلول در اندیس 0-ام چندتایی ذخیره شده‌اند، لذا [cells[0 را می‌خوانیم. در نهایت با روش الحاق داده‌ها به فایل xlsx. آشنا می‌شویم. کد زیر فرایند این کار را نشان می‌دهد:

1import openpyxl
2def main():
3    book = openpyxl.load_workbook('Sample.xlsx')
4    sheet = book.get_sheet_by_name('Sample')
5sheet.cell(row=5, column=1).value = 'Appended Data'
6book.save('Sample.xlsx')
7if __name__ == '__main__':
8    main()

در واقع فرایند کار بسیار آسان است. کافی است فایل xlsx. موجود را درون یک شیء بارگذاری کنید و آن را با فراخوانی متد روی فایل Sample.xlsx در متغیر book ذخیره کنید. سپس برگه sample را با فراخوانی متد ()get_sheet_by_name روی شیء book به دست می‌آوریم.

اکنون می‌توانیم همانند روش ایجاد یک فایل جدید، به سادگی شروع به الحاق داده‌ها روی برگه بکنیم. همه آن متدهایی که در زمان ایجاد فایل در اختیار ما بودند، هم اینک نیز موجود هستند. در نهایت زمانی که کار نوشتن داده‌ها در فایل را انجام دادیم، نباید فراموش کنیم که فایل را با فراخوانی متد ()save ذخیره کنیم.

به علاوه فراموش نکنید که در زمان کدنویسی از کدهای زیباتری استفاده کنید و استانداردهای PEP8 را رعایت کنید تا کد شما خواناتر باشد. پیش از عرضه کد خود از PyLint استفاده کنید. بدین ترتیب می‌توانید یک استاندارد کدنویسی در پروژه خود نگهداری کنید.

سخن پایانی

در این نوشته به معرفی روش‌های مختلف کار با فایل‌های صفحه گسترده در پایتون پرداختیم، اما کار به همین جا ختم نمی‌شود. این‌ها تنها مبانی مقدماتی روش خواندن، نوشتن و الحاق داده‌ها در فایل‌های xls. و xlsx. بودند. شما باید این پکیج‌ها را مورد بررسی بیشتر قرار دهید و بر اساس الزامات خود بسته به حالتی که داده‌ها را در فایل‌های اکسل نمایش می‌دهید، الگوریتم‌های خاص خود را بنویسید.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۱۳ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
swlh
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *