分享

(转)c# 读写excel(二)

 COPY&PASTE 2009-10-05
(转)c# 读写excel(二)
2009-05-05 21:34

C# 操作Excel分两种情况

1.利用office组件,就是要安装office(或者下载dll添加引用也可以,没试过) 。代码1

 

2.不利用office组件,而是用TextWriter的某些子类编写器将字节流写入文件,这些文件其实不是真正的excel文件(可以用记事本打开不乱码),虽然能用excel打开。如果你在把这些导出的文件当作excel数据源,就不行了。

 

    其实还有一种方法虽然不利用office组件不过当导出到excel的时候有有一个事先创建好的excel文件(这样比用office组件好点,毕竟有别的编译器可以生成excel文件,不过这样也只是自欺欺人吧)。这个方法是导出的时候也把已经创建好的excel当做数据源用OleDbCommand.ExecuteNonQuery()等方法写入excel。我们把这标记为代码3,以便下面提供代码。

 

相关代码:

我们先看最后一种方法代码(我开始用的是这个不上不下的方法)

代码3

        /// <summary>
        /// 将DataTable导出为excel 自动创建excel
        /// </summary>
        /// <param name="dt"> 数据源</param>
        /// <param name="ExcelFileName"> 要保存的excel的name</param>
        /// <param name="strWorkSheetName">创建的表的名字 </param>
        public static string ExportTable2ExcelFile(DataTable dt, string ExcelFileName, string strWorkSheetName)
        {
            if (File.Exists(ExcelFileName) == false)
            {
                return "指定文件不存在!";
            }

            if (dt == null)
            {
                return "数据不能为空!";
            }

            if (strWorkSheetName.ToString() == "")
            {
                return "数据表名不可以为空!";
            }
            dt.TableName = strWorkSheetName;

            int iRows = dt.Rows.Count;
            int iCols = dt.Columns.Count;

            StringBuilder stringBuilder;
            string connString;

            if (iRows == 0)
            {
                return "没有可导入数据!";
            }

            stringBuilder = new StringBuilder();


            connString = ExcelOperation.GetExcelConnection(ExcelFileName);// "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + ExcelFileName + ";Extended Properties=Excel 8.0;";

            //先查看此Excel中是否有相关Table,如果有的话就删除,然后导入新的。
            //生成创建表的脚本
            stringBuilder.Append("CREATE TABLE ");
            stringBuilder.Append(dt.TableName + " ( ");
            for (int i = 0; i < iCols; i++)
            {
                //此处是本版本改进中最实用的地方
                string strType = ExcelOperation.GetOleDataType(dt.Columns[i]);
                if (i < iCols - 1)
                    stringBuilder.Append(string.Format("{0} {1},", dt.Columns[i].ColumnName, strType));
                else
                    stringBuilder.Append(string.Format("{0} {1})", dt.Columns[i].ColumnName, strType));
            }


            using (OleDbConnection objConn = new OleDbConnection(connString))
            {


                OleDbCommand objCmd = new OleDbCommand();
                objCmd.Connection = objConn;

                //插入新表
                objCmd.CommandText = stringBuilder.ToString();

                try
                {
                    objConn.Open();
                    //插入新表
                    objCmd.ExecuteNonQuery();

                }
                catch (Exception e)
                {
                    return "在Excel中创建表失败!错误信息:" + e.Message;
                }

                stringBuilder.Remove(0, stringBuilder.Length);

                stringBuilder.Append("INSERT INTO ");
                stringBuilder.Append(dt.TableName + " ( ");

                //先插入标头
                for (int i = 0; i < iCols; i++)
                {
                    if (i < iCols - 1)
                        stringBuilder.Append(dt.Columns[i].ColumnName + ",");
                    else
                        stringBuilder.Append(dt.Columns[i].ColumnName + ") values (");
                }

                for (int i = 0; i < iCols; i++)
                {

                    if (i < iCols - 1)
                        stringBuilder.Append("@" + dt.Columns[i].ColumnName + ",");
                    else
                        stringBuilder.Append("@" + dt.Columns[i].ColumnName + ")");
                }


                //建立插入动作的Command
                objCmd.CommandText = stringBuilder.ToString();
                OleDbParameterCollection oleParam = objCmd.Parameters;

                oleParam.Clear();
                for (int i = 0; i < iCols; i++)
                {
                    OleDbType oleDbType = ExcelOperation.GetRefOleDataType(dt.Columns[i]);

                    //此处是本版本改进中最实用的地方
                    oleParam.Add(new OleDbParameter("@" + dt.Columns[i].ColumnName, oleDbType));
                }


                //遍历DataTable将数据插入新建的Excel文件中
                foreach (DataRow row in dt.Rows)
                {
                    for (int i = 0; i < oleParam.Count; i++)
                    {
                        oleParam[i].Value = row[i];
                    }

                    objCmd.ExecuteNonQuery();


                }
                return "数据已成功导入Excel!";
            }
        }

        /// <summary>
        /// 获取与本地DataSet中指定列的类型对应的OleDbType的数据类型字符串
        /// </summary>
        /// <param name="dataColumn"></param>
        /// <returns></returns>
        public static string GetOleDataType(DataColumn dataColumn)
        {
            switch (dataColumn.DataType.Name)
            {
                case "String"://字符串
                    {
                        return "VarChar";
                    }
                case "Double"://数字
                    {
                        return "Double";
                    }
                case "Decimal"://数字
                    {
                        return "Decimal";
                    }
                case "DateTime"://时间
                    {
                        return "Date";
                    }
                default://
                    {
                        return "VarChar";
                    }
            }
        }

        /// <summary>
        /// 获取与本地DataSet中指定列的类型对应的OleDbType类型
        /// </summary>
        /// <param name="dataColumn"></param>
        /// <returns></returns>
        public static OleDbType GetRefOleDataType(DataColumn dataColumn)
        {
            switch (dataColumn.DataType.Name)
            {
                case "String"://字符串
                    {
                        return OleDbType.VarChar;
                    }
                case "Double"://数字
                    {
                        return OleDbType.Double;
                    }
                case "Decimal"://数字
                    {
                        return OleDbType.Decimal;
                    }
                case "DateTime"://时间
                    {
                        return OleDbType.Date;
                    }
                default:
                    {
                        return OleDbType.VarChar;
                    }
            }
        }
        public static string GetExcelConnection(string strFilePath)
        {
            if (!File.Exists(strFilePath))
            {
                throw new Exception("指定的Excel文件不存在!");
            }
            return
                 @"Provider=Microsoft.Jet.OLEDB.4.0;" +
                 @"Data Source=" + strFilePath + ";" +
                 @"Extended Properties=" + Convert.ToChar(34).ToString() +
                 @"Excel 8.0;" + "Imex=2;HDR=Yes;" + Convert.ToChar(34).ToString();
        }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约