เล่าเรื่อง Import CSV ผ่าน CsvHelper และ Export Excel โดยใช้ CloseXml

KwangTung Taesuji
3 min readJun 13, 2021

--

เนื่องจากผู้เขียนได้รับไฟล์ CSV มาจำนวน 8–10 ไฟล์เพื่อใช้สำหรับการปรับแต่งข้อมูลใหม่โดยลูกค้าต้องการให้ทำ cleasing data และ merge data รวมในบางจุด จะมานั่งทำมือเองในทุกๆวัน ก็เสียเวลามากเกินไป เลยทดลองเขียน web app ตัวเล็ก ๆ เพื่อใช้จัดการข้อมูล ดังนี้

โจทย์ คือ
ให้สามารถอัพโหลดไฟล์รูปแบบ CSV ซึ่งในนี้จะมีข้อมูลดิบ คั่นด้วยเครื่องหมายคอมมา จากนั้นจัดการข้อมูลให้เสร็จ และนำข้อมูลออกเป็นไฟล์รูปแบบ Excel

สมมุติฐาน
ให้มีหน้า web application เพื่อที่จะได้ติดตั้งบน server ให้ใช้งานออนไลน์ได้ จากนั้นมีหุ่มสำหรับ upload file และให้ระบบ export file กลับมาอัตโนมัติ

การทดลอง
1. เลือก tech stack สำหรับเขียน web application ผู้เขียนเลือกใช้ .NET 5 เพื่อที่จะได้ติดตั้งบน Azure windows หรือ Linux ได้

2. เลือก Library สำหรับอ่าน CSV ผู้เขียนเลือกใช้ CSVHelper เนื่องจากเป็น open source ใช้งานง่าย ประสิทธิภาพเร็ว ใช้ความจำน้อย มีการทำแคช สามารถรันบน linux ได้ด้วย และมี document อ่านง่าย เวอร์ชั่นล่าสุด คือ 27.10

3. เลือก Library สำหรับเขียน Excel ผู้เขียนเลือกใช้ CloseXML เนื่องจากเป็น open source และผู้เขียนสังเกตว่าชื่อมันคล้าย ๆ OpenXML ที่เคยใช้มาก่อนหน้านี้ ก็เลยขอลองสักหน่อย

เมื่ออ่าน document ให้เข้าใจในระดับนึงแล้วก็ลุยกันเลย

เริ่มจากสร้าง project > web application .NET core 5

Download NuGet

PM> Install-Package ClosedXMLPM> Install-Package CSVHelper

สร้างหน้าจอ Razor และปุ่มสำหรับ upload file

สร้าง Controller สำหรับรับไฟล์เข้าระบบ

สร้าง method สำหรับการอ่าน CSV

และสร้าง Class สำหรับ Convert Record ที่ได้ให้กลายเป็น object พร้อมทั้ง ClassMap สำหรับกำหนดว่าจะใช้ Properties ตัวที่ต้องการ หรือไม่ต้องการในการเชื่อมโยงข้อมูล

สร้าง Logic สำหรับการ Cleaning Data

จริง ๆ มีหลายส่วนแต่แคปมาเป็นตัวอย่างแค่นี้

สร้าง method สำหรับการเขียน Excel

สรุปผลการทดลอง
นับว่าช่วยลดงาน Routine ลงไปได้เยอะพอสมควร ผู้เขียนจะพัฒนาปรับปรุงต่อให้สามารถเลือก template excel ที่ต้องการได้ รวมทั้งจะมีหน้าจอ UI เพื่อเลือกเงื่อนไขและ Logic สำหรับงานนั้นต่อไป และอาจจะเป็น Schedule job เพื่อให้ระบบทำงานต่อเนื่องตามเวลาที่ตั้งไว้

--

--