خواندن و ساخت فایل های اکسل با Go — از صفر تا صد
فرض کنید یک اپلیکیشن در زبان Go نوشتهاید و ناگهان از شما خواسته میشود که دکمهای برای ذخیره دادههای فرم در یک فایل اکسل نیز قرار دهید. یا شاید میخواهید یک فایل اکسل را که کاربر آپلود میکند بخوانید و سپس دادهها را بر مبنای محتوایشان در صفحه وب قرار دهید. در این نوشته با روش خواندن و ساخت فایل های اکسل با Go آشنا میشویم.
انجام این کار به صورت مستقل چندان آسان نیست. خوشبختانه یک کتابخانه به نام Excelize (+) به این منظور وجود دارد. Excelize یکی از بهترین و سریعترین گزینهها برای انجام این کار است. اگر میخواهید در مورد آن اطلاعات بیشتری داشته باشید، به صفحه مستندات (+) مراجعه کنید.
پیشنیاز
- Go نسخه 1.10 یا بعدتر
- مایکروسافت اکسل 2007 و بعدتر یا برنامه دیگر که میتواند با فایلهای XSLX کار کند تا بتوانید عملکرد آن را تست کنید.
راهاندازی
در ریشه پروژه Go دستور زیر را اجرا کنید:
go get github.com/360EntSecGroup-Skylar/excelize/v2
اینک میتوانید از Excelize در کد Go برای دسترسی به کارکردهای مختلف آن استفاده کنید. کافی است مطمئن شوید که دستور ()import زیر آن در فایل مربوطه دارید. البته اغلب IDE-ها این کار را به صورت خودکار انجام میدهند، اما بررسی آن مناسب خواهد بود:
1import (
2 "github.com/360EntSecGroup-Skylar/excelize/v2"
3)
ایجاد یک فایل اکسل به صورت برنامهنویسی شده
پیش از انجام هر کاری خط زیر را به کدتان اضافه کنید:
1f:= excelize.NewFile()
اکنون f کلید دسترسی شما است. لازم نیست آن را حتماً f بنامید. در واقع این حرف احتمالاً چندان گویا نیست و باید آن را تغییر دهید. مستندات Excelize از این حرف استفاده کردهاند و ما نیز برای سازگاری فعلاً از آن استفاده کردیم.
()NewFil به صورت خودکار یک برگه به نام Sheet1 ایجاد میکند. تلاش کنید چیزی به آن اضافه کنید. ما به طور خاص کلمه جدید passionfruit را به سلول A1 اضافه میکنیم.
1f.SetCellValue("Sheet1", "A1", "passionfruit")
نکته جالب در این مورد آن است که کارهای زیادی را میتوان در زمان ایجاد یک فایل جدید انجام داد. برخی موارد را در ادامه توضیح دادهایم.
استایلبندی فایل اکسل
برای نمونه میتوانید مقداری استایلبندی به سلولها اضافه کنید که در پارهای موارد برای زیباتر شدن اکسل کاملاً ضروری است.
1style, err := f.NewStyle(`{"fill":{"type":"pattern","color":["#b1cefc"],"pattern":1},"font":{"bold":true},"alignment":{"wrap_text":true}}`)
کد فوق کارهای زیادی انجام میدهد، اما اساساً معنی این استایل آن است که رنگ پسزمینه را به مقدار b1cefc# تنظیم میکند. فونت را bold میکند و سلول به صورت word-wrapped تنظیم میشود تا ادامه کلمات قطع نمیشود. البته این بخش کوچکی از کارهای زیادی است که میتوان با استایلبندی انجام داد. برای نمونه به مثال زیر توجه کنید:
1style, err := f.NewStyle(`{"alignment":{"horizontal":"center","ident":1,"justify_last_line":true,"reading_order":0,"relative_indent":1,"shrink_to_fit":true,"text_rotation":45,"vertical":"","wrap_text":true}}`)
ایجاد یک برگه جدید
یکی از بزرگترین قابلیتهای فایلهای XLSX توانایی داشتن بیش از یک صفحه (در اکسل برگه یا sheet نامیده میشود) است. Excelize امکان ایجاد برگههای جدید را به صورت زیر در کد فراهم ساخته است:
1f.NewSheet("AnothaOne")
این کار آسان است. اکنون میتوانید زمانی که تابعهای دیگر را با شیء Excelize فرا میخوانید از ارجاع این برگه استفاده کنید:
1f.SetColWidth("AnothaOne", "A", "A", 150)
2f.SetCellValue("AnothaOne", "A1", "DJ KHALED!")
حذف یک برگه
در این مورد نیز یک تابع ساده کار را بر عهده دارد:
1// This "Sheet1" is created by default when excelize.NewFile() is called, so this deletes it
2f.DeleteSheet("Sheet1")
تابعی برای بازگشت فایل Excelize
فرض کنید دادههای کاربر را از طریق UI در یک شیء Go به نام UserInputData جمعآوری کردهایم. در ادامه میتوانیم کارهایی مانند زیر روی آن انجام دهید:
1func PrepareAndReturnExcel(userInputData *UserInputData) *excelize.File {
2 f := excelize.NewFile()
3 f.SetCellValue("Sheet1", "A1", "Username")
4 f.SetCellValue("Sheet1", "A2", userInputData.username)
5 f.SetCellValue("Sheet1", "B1", "Location")
6 f.SetCellValue("Sheet1", "B2", userInputData.location)
7 f.SetCellValue("Sheet1", "C1", "Occupation")
8 f.SetCellValue("Sheet1", "C2", userInputData.occupation)
9 return f
10}
بازگشت دادن فایل اکسل برای دانلود از سوی کاربر
برای این که یک فایل Excel جهت دانلود در اختیار کاربر قرار دهید از کد زیر استفاده کنید:
1func downloadExcel(w http.ResponseWriter, r *http.Request) {
2 // Get the Excel file with the user input data
3 file := PrepareAndReturnExcel(userInputData)
4
5 // Set the headers necessary to get browsers to interpret the downloadable file
6 w.Header().Set("Content-Type", "application/octet-stream")
7 w.Header().Set("Content-Disposition", "attachment;
8filename="userInputData.xlsx")
9 w.Header().Set("File-Name", "userInputData.xlsx")
10 w.Header().Set("Content-Transfer-Encoding", "binary")
11 w.Header().Set("Expires", "0")
12 err := file.Write(w)
13}
کد فوق، اساساً فایل userInputData.xlsx را ایجاد کرده و آن را در مرورگر مینویسد. کافی است تابع downloadExcel() را فرابخوانید تا این کار را انجام دهد.
خواندن از فایل اکسل
فرض کنید میخواهید کاربر یک فایل اکسل را آپلود کند و شما در اپلیکیشن Go دادهها را خوانده و کاری روی آن انجام دهید.
به مثال زیر توجه کنید:
1package main
2
3import (
4 "fmt"
5
6 "github.com/360EntSecGroup-Skylar/excelize/v2"
7)
8
9func main() {
10 f, err := excelize.OpenFile("./BestRestaurantsInLA.xlsx")
11 if err != nil {
12 fmt.Println(err)
13 return
14 }
15 //
16 cellVal, err := f.GetCellValue("Japanese", "A2")
17 if err != nil {
18 fmt.Println(err)
19 return
20 }
21 fmt.Println(cellVal + " is the best Japanese restaurant in LA.")
22
23 // Get all the rows in the vegan section.
24 rows, err := f.GetRows("Vegan")
25 for _, row := range rows {
26 for _, colCell := range row {
27 fmt.Print(colCell, "\t")
28 }
29 }
30}
سخن پایانی
بدین ترتیب به پایان این راهنما رسیدیم. مستندات Execlize (+) کاملاً غنی و خوب نوشته شده است و با مطالعه آن میتوانید در مورد همه کارهایی که با آن قابل انجام است، اطلاعات خوبی کسب کنید. این کتابخانه مفید کمک زیادی به اجرای کارهای مرتبط با اکسل به شما میکند.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش توسعه وب با زبان برنامه نویسی Go
- مجموعه آموزشهای دروس علوم و مهندسی کامپیوتر
- زبان برنامه نویسی Go — راهنمای شروع به کار
- پکیجهای زبان برنامه نویسی Go — از صفر تا صد
==