Friday, April 1, 2011

C#: การอ่านไฟล์ Excel

ถ้าเป็นไฟล์ excel เวอร์ชั่นเก่าที่เป็นนามสกุล .xls ให้อ่านด้วย Microsoft.Jet.OLEDB.4.0 แต่ถ้าเป็นเวอร์ชั่นใหม่ .xlsx ต้องใช้ Microsoft.ACE.OLEDB.12.0

HDR=YES คือไฟล์นั้นมีแถวที่เป็น Header
IMEX=1 เกี่ยวกับการ Encoding ภาษาให้ถูกต้อง


string filePath = @"C:\temp\test.xls";
DataSet objDataset1 = new DataSet();
string ConnectionString = "";
ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=1\"";
if (filePath.IndexOf("xlsx") != -1) // ถ้าเป็น excel เวอร์ชั่นใหม่
{
ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\"";
}

OleDbConnection objXlsConn = new OleDbConnection(ConnectionString);
objXlsConn.Open();
OleDbDataAdapter objAdapter1 = null;
OleDbCommand objCmdSelect = null;
try
{
// หาชื่อ worksheet.
System.Data.DataTable dt = objXlsConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
DataRow row = dt.Rows[0];
string worksheetName = row["TABLE_NAME"].ToString();

// อ่านทุกแถวใน worksheet ด้วยคำสั่ง SQL
String strConString = "SELECT * from [" + worksheetName + "]";
objCmdSelect = new OleDbCommand(strConString, objXlsConn);
objAdapter1 = new OleDbDataAdapter(objCmdSelect);
objAdapter1.Fill(objDataset1);

// ตั้งตัวแปรสำหรับรับค่าในคอลัมน์
string dataColumn1;
string dataColumn2;

// วนลูปอ่านทีละแถว
foreach (DataRow dr in objDataset1.Tables[0].Rows)
{
dataColumn1 = dr[0].ToString();
dataColumn2 = dr[1].ToString();
// อยากทำอะไรต่อกับค่าที่ได้ก็เขียนตรงนี้
}
}
catch (Exception ex)
{
var strMsg = ex.Message;
// จะทำอะไรกับ error message ก็ทำตรงนี้
}


จะเห็นได้ว่าเราสามารถใช้คำสั่ง SQL กับ worksheet ของ Excel ได้ ทีนี้ในการ Insert, Update, Delete เราก็สามารถทำได้เหมือนกัน