1 PRotected void BtnLoad_Click(object sender, EventArgs e) 2 { 3 //dataDR datadr = new dataDR(); 4 //datadr.delete("delete from dbo.yuepingjueyuerbiao"); 5 string fileName = DateTime.Now.ToString("yyMMddhhmmss") + ".xls"; 6 string path = Server.MapPath("~/upload/excel/") + fileName; 7 8 FileUpload1.SaveAs(path); 9 if (path != null)10 {11 DataSet ds=loadSouce(path);12 }13 else14 {15 Response.Write("<scrView Code1 <div>2 3 <asp:FileUpload ID="FileUpload1" runat="server" /><asp:Button ID="BtnLoad" runat="server" Text="上傳" OnClick="BtnLoad_Click" />4 5 </div>6 7 <asp:Button ID="Button1" runat="server" Text="下載" style="height: 21px" OnClick="Button1_Click" />View Code經過第二天想了以后,其實連接字符串什么都沒有問題,最后得出來的結論是因為導出并非標準格式的excel,不行的粘貼一下即可導入方法
1 private DataSet loadSouce(string path) 2 { 3 4 5 //連接EXCEL數據源 6 //string strPath = this.getPath(); 7 //string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=" + "/"" + "Excel 8.0;HDR=Yes;IMEX=1" + "/""; 8 9 // string strConn = "Provider = Microsoft.ACE.OLEDB.12.0;Data Source =" + path + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'";10 string strConn = "Provider = Microsoft.ACE.OLEDB.15.0;Data Source =" + path + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'";11 //此連接可以操作.xls與.xlsx文件 (支持Excel2003 和 Excel2007 的連接字符串)12 //備注: "HDR=yes;"是說Excel文件的第一行是列名而不是數據,"HDR=No;"正好與前面的相反。13 // "IMEX=1 "如果列中的數據類型不一致,使用"IMEX=1"可必免數據類型沖突。 14 15 OleDbConnection conn = new OleDbConnection(strConn);16 17 conn.Open();18 19 /*20 如果用戶把sheet表名改了就是報下面的錯:21 'sheet1$' 不是一個有效名稱。請確認它不包含無效的字符或標點,且名稱不太長。 22 如果可以動態獲得Excel中各個sheet的名稱能動態的選中返回哪個sheet的數據,23 即使用戶更改了名稱也不怕,完全可以把所有sheet的名稱列出來供用戶選擇: 24 下面就把解決問題的代碼列出來,主要用到了OleDbConnection.GetOleDbSchemaTable()方法25 */26 27 //返回Excel的架構,包括各個sheet表的名稱,類型,創建時間和修改時間等28 System.Data.DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });29 30 //包含excel中表名的字符串數組31 string[] strTableNames = new string[dtSheetName.Rows.Count];32 for (int k = 0; k < dtSheetName.Rows.Count; k++)33 {34 strTableNames[k] = dtSheetName.Rows[k]["TABLE_NAME"].ToString();35 }36 37 //OleDbDataAdapter myCommand = null;38 System.Data.DataTable dt = new System.Data.DataTable();39 40 //從指定的表明查詢數據,可先把所有表明列出來供用戶選擇41 string strExcel = "select * from [" + strTableNames[0] + "]";42 43 44 45 OleDbDataAdapter myCommand = new OleDbDataAdapter(strExcel, strConn);46 47 DataSet myDataSet = new DataSet();48 49 50 myCommand.Fill(myDataSet);51 52 return myDataSet;53 }View Code導出方法
1 private void CreateExcel(System.Data.DataTable dt, string fileName) 2 { 3 HttpResponse resp; 4 resp = Page.Response; 5 6 resp.Buffer = true; 7 resp.ClearContent(); 8 resp.ClearHeaders(); 9 resp.Charset = "GB2312";10 11 12 // resp.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");13 resp.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);14 resp.ContentEncoding = System.Text.Encoding.Default;//設置輸出流為簡體中文 15 resp.ContentType = "application/ms-excel";//設置輸出文件類型為excel文件。 16 17 18 19 string colHeaders = "", ls_item = "";20 21 ////定義表對象與行對象,同時用DataSet對其值進行初始化22 //DataTable dt = ds.Tables[0];23 DataRow[] myRow = dt.Select();//可以類似dt.Select("id>10")之形式達到數據篩選目的24 25 int i = 0;26 int cl = dt.Columns.Count;27 28 29 // colHeaders += "tttttttt" + "/n";30 //取得數據表各列標題,各標題之間以t分割,最后一個列標題后加回車符31 for (i = 0; i < cl; i++)32 {33 if (i == (cl - 1))//最后一列,加n34 {35 colHeaders += dt.Columns[i].Caption.ToString().Trim() + "/n";36 }37 else38 {39 colHeaders += dt.Columns[i].Caption.ToString().Trim() + "/t";40 }41 42 }43 resp.Write(colHeaders);44 45 //向HTTP輸出流中寫入取得的數據信息46 47 48 49 //逐行處理數據 50 foreach (DataRow row in myRow)51 {52 //當前行數據寫入HTTP輸出流,并且置空ls_item以便下行數據 53 for (i = 0; i < cl; i++)54 {55 if (i == (cl - 1))//最后一列,加n56 {57 ls_item += row[i].ToString().Trim() + "/n";58 }59 else60 {61 ls_item += row[i].ToString().Trim() + "/t";62 }63 64 }65 resp.Write(ls_item);66 ls_item = "";67 68 }69 resp.End();70 71 }View Code記得引用Micorosoft.office.Interop.Excel
新聞熱點
疑難解答