OleDb导入数据到Excel,跨过Com组件

此种方式导入Excel,不支持对Excel单元格进行操作
   #region 变量
        //Excel 2007文件
        private static string _connString2007 = string.Empty;
        private static string str2007 = @"Provider=Microsoft.ACE.OLEDB.12.0;data source={0};Extended Properties='Excel 12.0 XML;HDR=Yes;'";

        //Excel 2003文件
        private static string _connString2003 = string.Empty;
        private static string str2003 = @"Provider=Microsoft.Jet.OleDb.4.0;data source={0};Extended Properties='Excel 8.0;HDR=Yes;'";

        //OleDbConnection对象
        private static OleDbConnection _oleDBConn;
        #endregion
        #region 打开及关闭
        /// <summary>
        /// 打开Excel链接
        /// </summary>
        /// <param name="dbName"></param>
        public static void OpenExcelDB(string dbName)
        {
            FileInfo fileInfo = new FileInfo(dbName);
            try
            {
                switch (fileInfo.Extension.ToLower())
                {
                    case ".xls":
                        _connString2003 = string.Format(str2003, dbName);
                        _oleDBConn = new OleDbConnection(_connString2003);
                        break;
                    case ".xlsx":
                        _connString2007 = string.Format(str2007, dbName);
                        _oleDBConn = new OleDbConnection(_connString2007);
                        break;
                    default: break;
                }
            }
            catch
            {
                _oleDBConn = null;
            }
        }

        /// <summary>
        /// 关闭Excel链接
        /// </summary>
        public static void CloseExcelDB()
        {
            if (_oleDBConn != null && _oleDBConn.State == ConnectionState.Open)
            {
                _oleDBConn.Close();
                _oleDBConn.Dispose();
            }
        }
        #endregion

        #region 导出数据到Excel

        /// <summary>
        /// 创建Excel路径
        /// </summary>
        public static string OpenSaveFolderBrowserDialog()
        {
            SaveFileDialog fd = new SaveFileDialog();
            fd.Filter = "EXCEL文件(*.xls)|*.xls|EXCEL文件(*.xlsx)|*.xlsx";
            fd.FileName = "新建 Microsoft Excel 工作表";
            if (fd.ShowDialog() == DialogResult.OK)
            {
                return fd.FileName;
            }

            return string.Empty;
        }

        /// <summary>
        /// 创建表头语句
        /// </summary>
        /// <param name="sheetName">Excel中sheet名</param>
        /// <param name="heads">Excel字段名</param>
        public static string GetCreateTableCmdText(string sheetName,string[] heads)
        {
            StringBuilder cmdText = new StringBuilder() ;
            
            cmdText.Append(string.Format("CREATE TABLE [{0}] (", sheetName));

            foreach (string headName in heads)
            {
                cmdText.Append(string.Format("[{0}] VarChar,", headName));
            }

            cmdText = cmdText.Remove(cmdText.Length - 1, 1);

            cmdText.Append(")");

            return cmdText.ToString();
        }

        /// <summary>
        /// 创建插值语句
        /// </summary>
        /// <param name="sheetName">Excel中待插值的sheet名</param>
        /// <param name="values">待插入的值</param>
        /// <returns></returns>
        public static string GetInsertValueCmdText(string sheetName,string[] values)
        {
            StringBuilder cmdText = new StringBuilder();
            
            cmdText.Append(string.Format("INSERT INTO {0} VALUES (", sheetName));

            foreach (string value in values)
            {
                cmdText.Append(string.Format("'{0}',",value));
            }

            cmdText = cmdText.Remove(cmdText.Length - 1, 1);

            cmdText.Append(")");

            return cmdText.ToString();
        }

        /// <summary>
        /// 导出数据到Excel
        /// </summary>
        /// <param name="sheetName">sheet名</param>
        /// <param name="heads">表头</param>
        /// <param name="values">于表头对应的值</param>
        public static void WriteDataToExcel(string sheetName,string[] heads,List<string[]> values)
        {
            string filePath = OpenSaveFolderBrowserDialog();
            if (string.IsNullOrEmpty(filePath))
            {
                MessageBox.Show("未获取到正确Excel路径");
                return;
            }

            OpenExcelDB(filePath);
            if (_oleDBConn == null)
            {
                MessageBox.Show("Excel链接失败");
                return;
            }

            _oleDBConn.Open();
            OleDbCommand cmd = new OleDbCommand { Connection = _oleDBConn};

            try
            {
                cmd.CommandText = GetCreateTableCmdText(sheetName, heads);
                cmd.ExecuteNonQuery();
            }
            catch (Exception exc)
            {
                MessageBox.Show(string.Format("表头插入失败: ", exc.Message));
                return;
            }

            StringBuilder valueError = new StringBuilder();
            foreach (string[] value in values)
            {
                try
                {
                    cmd.CommandText = GetInsertValueCmdText(sheetName, value);
                    cmd.ExecuteNonQuery();
                }
                catch
                {
                    valueError.Append(string.Format("插值失败 表名:{0} 行数:{1} /n", sheetName, values.IndexOf(value)));
                    continue;
                }
            }



            if (string.IsNullOrEmpty(valueError.ToString()))
            {
                MessageBox.Show("导入成功");
            }
            else
            {
                MessageBox.Show(valueError.ToString());
            }

            CloseExcelDB();
        }

        #endregion



猜你喜欢

转载自blog.csdn.net/han317426731/article/details/79213902