采用OLEDB数据库方式向指定的Excel添加数据,怪像!

时间:2023-03-09 14:53:02
采用OLEDB数据库方式向指定的Excel添加数据,怪像!

我们都知道,对Excel进行操作,其实方法是多种多样的,例如采用Office.Interop;例如采用ASPCell;例如采用NPOI;再例如采用数据库连接的方式OLEDB,etc.

还是先说说背景吧。背景是公司项目中,有一个大模块,以前采用的是Office.Interop,但是在自动化机子上面由于Office没有安装或者没有激活的情况,那么就会出现一些列的错误信息。提示的信息也是底层的什么COM......方正就是说明你的电脑上面没有安装Office或者没有激活Office,这样导致自动化机子经常报错。那么测试人员就不高兴了,人家就说,其他模块也有导入导出,也是操作Excel呀,为什么就这块出现问题呢。需要我定位查看。我通过查看代码,问题跟踪....一些常规的排查,发现我负责的模块导入导出采用的是Office.Interop组件(维护以前的代码),为什么不采用其他的控件呢?可能公司对其他插件的安全或者其他方面着想,没有使用像NPOI等类库。再者,其他模块都是采用的OLEDB,而且听说我负责这个模块相当的坑爹,我需要将所有的采用了Office.Interop的地方都使用OLEDB替换。

链接Office2003

Microsoft.Jet.OLEDB.4.0 ; Data Source =filePath;Extended Properties=Excel 8.0

链接Office2007+

Microsoft.Ace.OleDb.12.0;data source=filePath;Extended Properties='Excel 12.0; HDR=Yes; IMEX=1'

参数这些我都不说了,大家基本上都知道的,像什么增删改查,我都不一一举例了,我们模块中都是采用末班文件,导出文件,就是将模板文件拷贝到指定目录下面,再将数据插入到相应的文件中。
我们模板文件中有很多个Sheet,其中有一个Sheet只有个字段,在导出*.xls(Office2003)的时候,发现一个问题,那就是在单表单列的时候数据是从第三行开始插入的。

using (OleDbConnection conn = new OleDbConnection(connstr))
{
conn.Open();
OleDbCommand cmd = conn.CreateCommand();
for (int i = 0; i < data.Length; i++)
{
builder.Append("?,");
if (cmd.Parameters.Count <= i)
{
OleDbParameter para = cmd.CreateParameter();
para.OleDbType = OleDbType.VarChar;
cmd.Parameters.Add(para);
}
cmd.Parameters[i].Value = data[i] ?? string.Empty;
}
cmd.CommandText = string.Format("INSERT INTO [{0}$] VALUES ({1})", sheetName, builder.ToString().Trim(','));
cmd.ExecuteNonQuery();
}

在对一个表只有一列的时候出现了一下的结果。
采用OLEDB数据库方式向指定的Excel添加数据,怪像!

出现这样的情况,想请园子里面的高手看看,是否是我哪里操作不对,因为在导出*.xlsx的时候是不会出现这样的情况。而且这样的情况在*.xls中单表单列的时候出现。
麻烦各位了!!