1.需求
允许用户在客户段上传Excel文件,然后服务端完成对于Excel表格的读取和处理
2.问题及解决方法
2.1首先的问题是关于文件的上传问题,方法其实有两种
2.1.1 可以利用input标签,将type改为file,通过submit来想服务器上传文件
//占坑 亲测后补齐
2.1.2 更为简单的方法是利用asp.net的组件FileUpload,通过button处理后台读取
aspx
<asp:FileUpload CssClass="button_right" ID="Dep_FileUpload" runat="server"/>
<asp:Button ID="Button2" runat="server" Text="上传部门业绩考核文件" OnClick="Button2_Click"/>
aspx.cs
string fileName = Dep_FileUpload.FileName;
string sheetName = "Sheet1";
string filePath = Server.MapPath("~/UploadFiles/");
Dep_FileUpload.SaveAs(filePath + fileName);
DataTable dt = ExcelToDataTable(filePath+fileName,sheetName);
aspx.cs
/// strExcelFileName 读取的文件储存位置
/// strSheetName 读取的sheet名 通常是Sheet1
public DataTable ExcelToDataTable(string strExcelFileName, string strSheetName)
{
try
{
//源的定义
//string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + strExcelFileName + ";" + "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';";
string strConn = "Provider=Microsoft.Ace.OleDb.12.0;" + "Data Source=" + strExcelFileName + ";" + "Extended Properties='Excel 12.0;HDR=Yes;IMEX=1';";
//Sql语句
//string strExcel = string.Format("select * from [{0}$]", strSheetName); 这是一种方法
string strExcel = "select * from [" + strSheetName + "$]";
//定义存放的数据表
DataSet ds = new DataSet();
//连接数据源
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
//适配到数据源
OleDbDataAdapter adapter = new OleDbDataAdapter(strExcel, strConn);
adapter.Fill(ds, strSheetName);
conn.Close();
return ds.Tables[strSheetName];
}
catch (System.Exception ex)
{
Response.Write(ex); //用来查看异常原因
return null;
}
}
2.2读取Excel时的参数设置
HDR
若为 YES,则第一行是标题行(即列名称),不是数据;
若为 NO,则第一行不是标题行,跟后面的行一样,是数据。
IMEX
若为 0,则为输出模式,此情况下只能用作写入 Excel;
若为 1,则为输入模式,此情况下只能用作读取 Excel,并且始终将 Excel 数据作为文本类型读取;
若为 2,则为连接模式,此情况下既可用作写入、也可用作读取。
2.3 C# conn.open() 外部表不是预期的格式
注意到上面代码对于源的定义其实其实有两种方式
第一种只能操作.xls文件
第二种则可以操作.xls与.xlsx文件
2.4 未在本地计算机上注册Microsoft.ACE.OLEDB.12.0提供程序
我遇到这个问题时通过安装了Microsoft.ACE.OLEDB.12.0驱动就解决了这个问题
下载连接
3.后续补充遇到的一些坑
3.1将Excel文件转成datatable一般不会将一些隐藏的错误显示出来,比如Excel表格可能在实际使用中多了一些空格,便经常会出现诸如“不存在列名**”,又或是“SQL语句没有正确结束”的错误,很浪费时间,同时解决的时候也不会有任何成就感,只会让人觉得沮丧。。。