首页 新闻 会员 周边 捐助

关于C#用OLEDB的方法把DataTable插入到Excel导致Excel里面数据样式错乱的问题

0
悬赏园豆:10 [已解决问题] 解决于 2013-10-31 14:34
        public int insertDataTableToExcel(DataTable dt, string tableName)
        {
            int flag = -1;
            try
            {
                this.Open();
                string sql = "insert into [" + tableName + "$] (A1, A2, A3, A4, A5) values (";
                int loop_1 = 0;
                OleDbParameter[] param = new OleDbParameter[dt.Columns.Count];
                OleDbCommand command = new OleDbCommand();

                //生成SQL语句, 构建入参数组
                for (loop_1 = 0; loop_1 < dt.Columns.Count; loop_1++)
                {
                    switch (dt.Columns[loop_1].DataType.ToString())
                    {
                        case "System.Decimal":
                        case "System.Int32":
                            sql = sql + "{" + loop_1 + "}, ";
                            break;
                        default:
                            sql = sql + "'{" + loop_1 + "}', ";
                            break;
                    }
                    //sql = sql + "@param_" + loop_1 + ", ";
                    //Console.WriteLine(dt.Columns[loop_1].DataType.ToString());
                    //switch (dt.Columns[loop_1].DataType.ToString())
                    //{
                    //    case "System.DateTime":
                    //        param[loop_1] = new OleDbParameter("@param_" + loop_1, OleDbType.Date);
                    //        break;
                    //    case "System.Decimal":
                    //        param[loop_1] = new OleDbParameter("@param_" + loop_1, OleDbType.Decimal);
                    //        break;
                    //    case "System.Int32":
                    //        param[loop_1] = new OleDbParameter("@param_" + loop_1, OleDbType.Integer);
                    //        break;
                    //    default:
                    //        param[loop_1] = new OleDbParameter("@param_" + loop_1, OleDbType.LongVarWChar);
                    //        break;
                    //}
                }
                sql = sql.Substring(0, sql.Length - 2) + ")";

                //插入数据
                for (loop_1 = 0; loop_1 < dt.Rows.Count; loop_1++)
                {
                    string _sql = String.Format(sql, dt.Rows[loop_1].ItemArray);
                    Console.WriteLine(_sql);
                    command.CommandText = _sql;
                    command.Connection = conn;
                    flag = flag + command.ExecuteNonQuery();
                    //command.CommandText = sql;
                    //command.CommandType = CommandType.Text;
                    //command.Connection = conn;
                    //for (loop_2 = 0; loop_2 < dt.Rows[loop_1].ItemArray.Length; loop_2++)
                    //{
                    //    param[loop_2].Value = dt.Rows[loop_1].ItemArray[loop_2];
                    //    command.Parameters.Add(param[loop_2]);
                    //}
                    //flag = flag + command.ExecuteNonQuery();
                    //command.Parameters.Clear();
                }

            }
            catch (Exception e)
            {
                flag = -3;
                Console.WriteLine(e.ToString());
            }
            finally
            {
                this.Close();
            }
            return flag;
        }

代码如上。。我已经区分了字符串和数字了 怎么到了Excel里面的时候还是会默认成字符串呢?而且明明没有说要加粗的。。。但是有部分数据却加粗了。。明明说是自动换行的。。有部分却没有换。。

eatpockyboy的主页 eatpockyboy | 菜鸟二级 | 园豆:260
提问于:2013-10-31 13:51
< >
分享
最佳答案
0

其实我找到原因了。。。是因为数据里面出现空字符的问题~ 而数据格式和样式目测是参照上一列为标准的 因为上一列为空所以导致随后插入的数据样式和格式都改变了。谢谢你的解答。。。。。

还要自己再答一次呀。。。那么再详细点说明白好了 给后人指个路什么的

conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + URL + "; Extended Properties='Excel 8.0; HDR=NO; IMEX=2'; Persist Security Info=False");

链接语句是上面那个。然后HDR设成什么其实已经不重要了。。因为是参照第一行的格式的。。。然后IMEX是什么,感觉也不是很重要,反正2就很无敌的样子。。。其实主要还是出现了空字符的关系。。。所以代码是用回了注释掉的。。。然后判断一下是否为空。。。然后空的话加个空格给他。。然后就妥了。。。。

eatpockyboy | 菜鸟二级 |园豆:260 | 2013-10-31 14:33
其他回答(2)
0

给你推荐一个专业的excel第三方插件  EPPlus 

收获园豆:5
Damon.Liu | 园豆:86 (初学一级) | 2013-10-31 14:04
0

把拼接的sql语句弄出来看下。

收获园豆:5
幻天芒 | 园豆:37205 (高人七级) | 2013-10-31 14:16

insert into [Sheet1$] values (xx, xx, xx, xx, xx); 

其中第一,三个xx是System.String 第二个是System.DateTime, 第四个是System.Decimal, 第五个是System.Int32

支持(0) 反对(0) eatpockyboy | 园豆:260 (菜鸟二级) | 2013-10-31 14:19

 其实我找到原因了。。。是因为数据里面出现空字符的问题~ 而数据格式和样式目测是参照上一列为标准的 因为上一列为空所以导致随后插入的数据样式和格式都改变了。谢谢你的解答。

支持(0) 反对(0) eatpockyboy | 园豆:260 (菜鸟二级) | 2013-10-31 14:29

@Gssl: 呵呵,解决问题就好~一般来说,写数据我还是推荐第三方,如楼上NPOI,Epplus等。

支持(0) 反对(0) 幻天芒 | 园豆:37205 (高人七级) | 2013-10-31 14:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册