.Net读取xlsx文件
string sqlconnection="provider=microsoft.jet.oledb.4.0;data source=d:\\book\\book.xls;extended properties=excel 8.0";
(1)excel 连接字符串:
通过oledb方式读取excel文件时常常出现读取某些字段为null值,其实是有值,原因是读取文件时,excel通常会以前10行的数据类型为参考,
如果后边的与其不一致,则会出现些问题。 可以通过修改excel文件的连接串,强制读取的数据为字符串类型。
string xlsconnformat = @"provider=microsoft.jet.oledb.4.0;data source='{0}';extended properties='excel 8.0;hdr=no;imex=1';";
// 1、hdr表示要把第一行作为数据还是作为列名,作为数据用hdr=no,作为列名用hdr=yes;
// 2、通过imex=1来把混合型作为文本型读取,避免null值。
注意:把一个 excel 文件看做一个,一个sheet看做一张表。语法 "select * from [sheet1$]",表单要使用"[]"和"$"
默认excel的表,列名是"f1 ~ f99"。
如果提示 “找不到可安装的isam。”错误,主要还是connection字符串的问题,请注意data source之间是否空格,extended properties是否书写正确。
(2)、使用 oledb 读取不同版本 excel 数据的连接字符串设置
用oledb通过设置连接字符串可以像读取sqlserver一样将excel中的数据读取出来,但是excel2003和excel2007/2010的连接字符串是不同的
/// <summary>
/// 把数据从excel装载到datatable
/// </summary>
/// <param name="pathname">带路径的excel文件名</param>
/// <param name="sheetname">工作表名</param>
/// <param name="tbcontainer">将数据存入的datatable</param>
/// <returns></returns>
public datatable exceltodatatable(string pathname, string sheetname)
{
datatable tbcontainer = new datatable();
string strconn = string.empty;
if (string.isnullorempty(sheetname))
{
sheetname = "sheet1";
}
fileinfo file = new fileinfo(pathname);
if (!file.exists)
{
throw new exception("文件不存在");
}
string extension = file.extension;
switch (extension)
{
case ".xls":
strconn = "provider=microsoft.jet.oledb.4.0;data source=" + pathname + ";extended properties='excel 8.0;hdr=yes;imex=1;'";
break;
case ".xlsx":
strconn = "provider=microsoft.ace.oledb.12.0;data source=" + pathname + ";extended properties='excel 12.0;hdr=yes;imex=1;'";
break;
default:
strconn = "provider=microsoft.jet.oledb.4.0;data source=" + pathname + ";extended properties='excel 8.0;hdr=yes;imex=1;'";
break;
}
//链接excel
oledbconnection cnnxls = new oledbconnection(strconn);
//读取excel里面有 表sheet1
oledbdataadapter oda = new oledbdataadapter(string.format("select * from [{0}$]", sheetname), cnnxls);
dataset ds = new dataset();
//将excel里面有表内容装载到内存表中!
oda.fill(tbcontainer);
return tbcontainer;
}
这里需要注意的地方是,当文件的后缀名为.xlsx(excel2007/2010)时的连接字符串是"provider=microsoft.ace.oledb.12.0;....",注意中间红色部分不是"jet"。
(3)、 .net 读取 xlsx文件 excel2007
.net 读取excel 2007的xlsx文件和读取老的.xls文件是一样的,都是用oledb读取,仅仅连接字符串不同而已。
读取xlsx 用的是microsoft.ace.oledb.12.0;
具体操作方法如下:
public static datatable getexceltodatatablebysheet(string filefullpath, string sheetname)
{
//string strconn = "provider=microsoft.jet.oledb.4.0;" + "data source=" + filefullpath + ";extended properties='excel 8.0; hdr=no; imex=1'"; //此连接只能操作excel2007之前(.xls)文件
string strconn = "provider=microsoft.ace.oledb.12.0;" + "data source=" + filefullpath + ";extended properties='excel 12.0; hdr=no; imex=1'"; //此连接可以操作.xls与.xlsx文件
oledbconnection conn = new oledbconnection(strconn);
conn.open();
dataset ds = new dataset();
oledbdataadapter odda = new oledbdataadapter(string.format("select * from [{0}]", sheetname), conn); //("select * from [sheet1$]", conn);
odda.fill(ds, sheetname);
conn.close();
return ds.tables[0];
}
读取excel文件时,可能一个文件中会有多个sheet,因此获取sheet的名称是非常有用的。
具体操作方法如下:
//根据excel物理路径获取excel文件中所有表名
public static string[] getexcelsheetnames(string excelfile)
{
oledbconnection objconn = null;
system.data.datatable dt = null;
try
{
//string strconn = "provider=microsoft.jet.oledb.4.0;" + "data source=" + excelfile + ";extended properties='excel 8.0; hdr=no; imex=1'"; //此连接只能操作excel2007之前(.xls)文件
string strconn = "provider=microsoft.ace.oledb.12.0;" + "data source=" + excelfile + ";extended properties='excel 12.0; hdr=no; imex=1'"; //此连接可以操作.xls与.xlsx文件
objconn = new oledbconnection(strconn);
objconn.open();
dt = objconn.getoledbschematable(oledbschemaguid.tables, null);
if (dt == null)
{
return null;
}
string[] excelsheets = new string[dt.rows.count];
int i = 0;
foreach (datarow row in dt.rows)
{
excelsheets[i] = row["table_name"].tostring();
i++;
}
return excelsheets;
}
catch
{
return null;
}
finally
{
if (objconn != null)
{
objconn.close();
objconn.dispose();
}
if (dt != null)
{ www.2cto.com
dt.dispose();
}
}
}