应该说,一套成熟的基于web的管理系统,与用户做好的excel表格进行数据交互是一个不可或缺的功能,毕竟,一切以方便客(jin)户(qian)为宗旨。
本人之前从事PHP的开发工作,熟悉PHP的都应该知道,PHP与excel交互有一套很方便的软件,名字也很随性,就叫PHPExcel。但,现在是.net,怎么做呢?
搜索之后发现,c#就是微软自家的啊,与ms office交互还不是小事儿吗,不废言了,进正题:
采用OleDB(什么是OleDB,没必要知道,想知道百度之(*^__^*) )读取excel文件
//// <summary> /// 从Excel提取数据--》Dataset /// </summary> /// <param name="filename">Excel文件路径名</param> private void ImportXlsToData(string fileName) { try { if (fileName == string.Empty) { throw new ArgumentNullException("Excel文件上传失败!"); } string oleDBConnString = String.Empty; oleDBConnString = "Provider=Microsoft.Ace.OleDb.12.0;"; oleDBConnString += "Data Source="; oleDBConnString += fileName; oleDBConnString += ";Extended Properties=‘Excel 12.0; HDR=Yes; IMEX=1‘"; OleDbConnection oleDBConn = null; OleDbDataAdapter oleAdMaster = null; DataTable m_tableName = new DataTable(); DataSet ds = new DataSet(); oleDBConn = new OleDbConnection(oleDBConnString); oleDBConn.Open(); m_tableName = oleDBConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); if (m_tableName != null && m_tableName.Rows.Count > 0) { m_tableName.TableName = m_tableName.Rows[0]["TABLE_NAME"].ToString(); } string sqlMaster; sqlMaster = " SELECT * FROM [" + m_tableName.TableName + "]"; oleAdMaster = new OleDbDataAdapter(sqlMaster, oleDBConn); oleAdMaster.Fill(ds, "m_tableName"); oleAdMaster.Dispose(); oleDBConn.Close(); oleDBConn.Dispose(); AddDatasetToSQL(ds, 12); //*****注意,这里是你唯一需要改动的地方,你的标准导入excel表格有多少列,就把12改成多少,其它不用管 } catch (Exception ex) { throw ex; } }
这个是OleDB导入的核心代码,下面,就按顺序来说说,先上“导入”按钮触发的方法代码
private void BtnImport_Click(object sender, System.EventArgs e) { string filename = string.Empty; try { filename = UpLoadXls(FileExcel);//上传XLS文件 ImportXlsToData(filename);//将XLS文件的数据导入数据库 if (filename != string.Empty && System.IO.File.Exists(filename)) { System.IO.File.Delete(filename);//删除上传的XLS文件 } if(isloadsuc) //标志数据是否导入成功的bool变量 LblMessage.Text = "数据导入成功!"; } catch (Exception ex) { LblMessage.Text = ex.Message; } }
很清楚,第一步,将用户选择的excel文件上传,即UpLoadXls方法
/// <summary> /// 上传Excel文件 /// </summary> /// <param name="inputfile">上传的控件名</param> /// <returns></returns> private string UpLoadXls(System.Web.UI.HtmlControls.HtmlInputFile inputfile) { string orifilename = string.Empty; string uploadfilepath = string.Empty; string modifyfilename = string.Empty; string fileExtend = "";//文件扩展名 int fileSize = 0;//文件大小 try { if (inputfile.Value != string.Empty) { //得到文件的大小 fileSize = inputfile.PostedFile.ContentLength; if (fileSize == 0) { throw new Exception("导入的Excel文件大小为0,请检查是否正确!"); } //得到扩展名 fileExtend = inputfile.Value.Substring(inputfile.Value.LastIndexOf(".") + 1); if (fileExtend.ToLower() != "xls" && fileExtend.ToLower() != "xlsx") { throw new Exception("你选择的文件格式不正确,只能导入EXCEL文件!"); } //路径 uploadfilepath = Server.MapPath("../excel"); //新文件名 modifyfilename = System.Guid.NewGuid().ToString(); modifyfilename += "." + inputfile.Value.Substring(inputfile.Value.LastIndexOf(".") + 1); //判断是否有该目录 System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(uploadfilepath); if (!dir.Exists) { dir.Create(); } orifilename = uploadfilepath + "\\" + modifyfilename; //如果存在,删除文件 if (File.Exists(orifilename)) { File.Delete(orifilename); } // 上传文件 inputfile.PostedFile.SaveAs(orifilename); } else { throw new Exception("请选择要导入的Excel文件!"); } } catch (Exception ex) { throw ex; } return orifilename; }
其次,就是ImportXlsToData方法,这个里面除了刚开始所说的OleDB核心实现方法外,还调用了AddDatasetToSQL,你的主要改动也都在这个里面,上方法
/// <summary> /// 将Dataset的数据导入数据库 /// </summary> /// <param name="pds">数据集</param> /// <param name="Cols">数据集列数</param> /// <returns></returns> private bool AddDatasetToSQL(DataSet pds, int Cols) { int ic, ir; ic = pds.Tables[0].Columns.Count; if (pds.Tables[0].Columns.Count != Cols) { throw new Exception("导入Excel格式错误!Excel有" + ic.ToString() + "列"); } ir = pds.Tables[0].Rows.Count; if (pds != null && pds.Tables[0].Rows.Count > 0) { int rowsnum = 0; bool flag=true; string tips = ""; //导入前检查数据合法性 for (int i = 0; i < pds.Tables[0].Rows.Count; i++) { //在这里验证用户数据有效性,是否数字啊、是否字母啊什么的 if(//验证不通过) { isloadsuc = false; flag = false; rowsnum = i; tips = "给用户的错误提示"; break; } } if (flag) { for (int i = 0; i < pds.Tables[0].Rows.Count; i++) { Add(pds.Tables[0].Rows[i][0].ToString(), pds.Tables[0].Rows[i][1].ToString(), pds.Tables[0].Rows[i][2].ToString(), pds.Tables[0].Rows[i][3].ToString(), pds.Tables[0].Rows[i][4].ToString(), pds.Tables[0].Rows[i][5].ToString(), pds.Tables[0].Rows[i][6].ToString(), pds.Tables[0].Rows[i][7].ToString(), pds.Tables[0].Rows[i][8].ToString(), pds.Tables[0].Rows[i][9].ToString(), pds.Tables[0].Rows[i][10].ToString(), pds.Tables[0].Rows[i][11].ToString()); } } else { Response.Write("<script>alert(‘第" + (rowsnum + 2) + "行,"+tips+"‘)</script>"); } } else { throw new Exception("导入数据为空!"); } return true; }
在上面的方法中,就开始先行后列依次读取用户的录入数据了,导入很方便,但,作为程序员,一定牢记,用户的一切输入都不可信,一旦错误的数据导进系统,那就麻烦了,所以一定做好数据有效性的校验工作。完成后,就进行最后一步,即ADD方法了。
/// <summary> /// 插入数据到数据库 /// </summary> public void Add(string a, string b)//这里,导入excel的列与数据库中的列对应起来 { StringBuilder strSql = new StringBuilder(); strSql.Append("insert into ATABLE("); strSql.Append("A,B"); strSql.Append(")"); strSql.Append(" values ("); strSql.Append("‘" + a+ "‘,"); strSql.Append("‘" + b+ "‘"); strSql.Append(")"); MyDB.ExecSQL(strSql.ToString()); }
至此,整个excel的数据导入就全部完成了,欧耶!
时间: 2024-10-14 10:46:10