zoukankan      html  css  js  c++  java
  • .net实现与excel的数据交互、导入导出

      应该说,一套成熟的基于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的数据导入就全部完成了,欧耶!

  • 相关阅读:
    14.4.9 Configuring Spin Lock Polling 配置Spin lock 轮询:
    14.4.8 Configuring the InnoDB Master Thread IO Rate 配置InnoDB Master Thread I/O Rate
    14.4.7 Configuring the Number of Background InnoDB IO Threads 配置 后台InnoDB IO Threads的数量
    14.4.7 Configuring the Number of Background InnoDB IO Threads 配置 后台InnoDB IO Threads的数量
    14.4.6 Configuring Thread Concurrency for InnoDB 配置Thread 并发
    14.4.6 Configuring Thread Concurrency for InnoDB 配置Thread 并发
    14.4.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering
    14.4.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering
    14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器
    14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器
  • 原文地址:https://www.cnblogs.com/ione/p/5514823.html
Copyright © 2011-2022 走看看