背景:最近在做Excel的导入导出功能,收获了很多的知识,首先采用数据库链接方式,使用OLEDB链接接口访问Excel表中的数据。
链接字符串:
excel 2000 ~ 2003的 OleDb 连接串的格式如下:
Provider=Microsoft.Jet.OleDb.4.0;Data Source='excel文件路径';Extended Properties='Excel 8.0;HDR=YES'
Excel 2007之上链接字符串
Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + FilePath + "; Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1
在做完Excel的工作后,发布系统后遇到 未在本地注册Microsoft ACE.OLEDB.12.0应用程序。
解决步骤一、可能是因为缺少Microsoft Office Access 2007的一些引擎组件。所以得安装一下这个组件。
解决步骤二、然后在IIS对应的应用程序池上启用32为应用程序就好。
获取Excel的Sheet表名
Excel的数据链接connection打开后,使用GetOleDbSchemaTable方法,获取Excel的表名。
//获取Excel中的的数据
public static System.Data.DataTable getExcelData(string strFilePath,string conditionText)
{
string conStr = System.Configuration.ConfigurationManager.AppSettings["officeConnection"].ToString() + "Data Source=" + strFilePath + ";Extended Properties ='Excel 12.0;HDR=Yes;IME=1'";
System.Data.DataTable excelDt = new System.Data.DataTable();
using(OleDbConnection conn = new OleDbConnection(conStr)){
conn.Open();//链接打开,然后获取使用GetOleDbSchemaTable获取表名
System.Data.DataTable dtSheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });
//包含excel中表名的字符串数组
string select = "select * from " + "[" + dtSheetName.Rows[0]["TABLE_NAME"].ToString() + "]" + conditionText+" ORDER BY 市直单位名称,定性指标名称";
OleDbCommand cmd = new OleDbCommand(select, conn);
OleDbDataReader reader = cmd.ExecuteReader();
excelDt.Load(reader);
reader.Close();
}
return excelDt;
}
在获取表名的时候,有时候Excel只有一个表名,但是运行代码总是获取多个Sheet表名
解决办法
打开Excel的VB宏(art+F11)
插入窗体或者模块输入如下代码
Sub ShowAllNames()
For Each n In ThisWorkbook.Names
n.Visible = True
Next
End Sub
然后选择Excel的公式里面的名称管理器,打开名称公里器后,把多余的表名成删除即可。