近日項目中有一個多筆料号要輸入,我做了一個用javascript複制輸入框的功能,可以輸入多筆料号。
但是使用者回報,料号太多,可能幾百個料号在EXCEL檔案裡,這樣輸入很慢,需要增加功能。于是想到了SQLSERVER導入EXCEL的功能。

declare @strExcelName varchar(50)

set @strExcelName='c:\sl.xls'

exec('select * into ##tmp from openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 8.0;HDR=No;IMEX=1;DATABASE='+@strExcelName+''',[Sheet1$]) ')

select * from ##tmp
這樣是可以導入資料,但是問題來了。我的資料庫伺服器和運作程式伺服器不在同一伺服器,無法導入(可能有方法,但是項目緊,沒時間去探索),于是想到另外一個方法:先上傳EXCEL檔案,然後讀入DATASET放入GridView,然後從GridView送出到資料庫,這樣就沒有問題。

檔案上傳控件:<input id="myFile" runat="server" type="file" />

Form裡不需要enctype="multipart/form-data"
檔案上傳代碼:

if (myFile.PostedFile.FileName != "")
{
//上傳檔案的絕對路徑
string sFile = myFile.PostedFile.FileName;
//擷取檔案全名
sFile = sFile.Substring(sFile.LastIndexOf("\\") + 1);
//擷取字尾名
sFile = sFile.Substring(sFile.LastIndexOf("."));
if (sFile.ToLower() != ".xls")
Response.Write("請選擇Excel檔案!");
Response.End();
}
//為了防止重名,獲得日期為檔案名年月日時分秒毫秒
string datatime = System.DateTime.Now.ToString("yyyMMddHHmmssffff");
//上傳後檔案的新名
sFile = datatime + sFile;
//AppDomain.CurrentDomain.BaseDirectory.ToString() 擷取此項目的根目錄
//sPath 擷取上傳後的路徑
string sPath = AppDomain.CurrentDomain.BaseDirectory.ToString() + "ExcelFiles\\" + sFile;
//上傳檔案
myFile.PostedFile.SaveAs(sPath);
this.myGridView.DataSource = GetExcelContent(sPath);
this.myGridView.DataBind();
}
讀取EXCEL到DATASET代碼:

private DataSet GetExcelContent(string filepath)
string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepath + ";Extended Properties='Excel 8.0;HDR=No;IMEX=1'";
System.Data.OleDb.OleDbConnection myConn = new System.Data.OleDb.OleDbConnection(strCon);
string strCom = "SELECT F1 as resno,F2 as resname FROM [Sheet1$]";
myConn.Open();
System.Data.OleDb.OleDbDataAdapter myCommand = new System.Data.OleDb.OleDbDataAdapter(strCom, myConn);
//建立一個DataSet對象
DataSet myDataSet = new DataSet();
//得到自己的DataSet對象
myCommand.Fill(myDataSet);
//關閉此資料連結
myConn.Close();
return myDataSet;
}
最後是資料送出到資料庫代碼:

string stresno = "";

string stresname = "";

foreach (GridViewRow row in this.myGridView.Rows)
Label txtesno = (Label)row.FindControl("labresno");
stresno += txtesno.Text.ToString().Trim().Replace("'", "''") + ";";
Label txtresname = (Label)row.FindControl("labresname");
stresname += txtresname.Text.ToString().Trim().Replace("'", "''") + ";";

Response.Write(stresno + "<br/>" + stresname);

Response.End();