现在对Excel的操作已经很是平凡,我这里写一点自己的处理方法:
一.Excel文件的上传。
对Excel操作,首先需要把Excel文件上传到服务器,上传文件就不要多说了,直接用FileUpload控件很容易就可以把文件上传上去。在这一步我想说的是:
1.在执行FileUpload的SaveAs方法前首先要判断文件的后缀名是否是.xls或.XLS,如果是,执行上传操作,如果不是,提示用户文件类型有问题。
2.文件上传以后放到什么地方,这个也是比较重要的,一般为了安全,最好不要放到站点目录下,可以在站点目录外任意找个地方来存放上传的文件,为了方便灵活我一般会在配置文件(Web.Config)的<appSettings>下添加一个节点,如<add key="ExcelTemp" value="D:\Reports\"/>来得到文件的存放路径,这样如果路径修改了,只需修改一下配置文件就可以了。还有就是存放文件的文件夹一定要给它可以写入文件和读取文件的权限,否则在上传的时候就会报异常,因为如果没有给这些权限的话,文件就写不到这个文件夹下面。在测试的时候可以不考虑这个问题,但是如果是项目发布时候就一定要考虑这个问题了。
第二.文件的读取。
ADO.NET提供了方便的读取Excel的方法,可以通过下面的语句来获得对Excel的连接:
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet." +
"OLEDB.4.0;Extended Properties=\"Excel 8.0;HDR=yes;IMEX=1\";Data Source=" + excelPath)
excelPath=Excel上传到服务器的路径+文件名,如D:\Reports\test.xls
这里说一下Extended Properties的三个属性:
1.Excel 8.0 表示Excel的版本
2.HDR表示有无字段。
HDR=NO 即无字段
HDR=yes 即有字段,一般默认excel表中第1行的列标题为字段名,如姓名、年龄等
3.IMEX 表示是否强制转换为文本,这个属性非常重要。IMEX=1表示强制转换为文本。
比如有这样的数据 : 唯一标识
5648975
5645656
s565658
如果没有写IMEX=1,则第一行和第二行可以正确的读出来,但是第三行就读不出来,而是得到Null。
下面这段文字给出了答案:
Excel 驱动程序读取指定源中一定数量的行(默认情况下为 8 行)以推测每列的数据类型。如果推测出列可能包
含混合数据类型(尤其是混合了文本数据的数值数据时),驱动程序将决定采用占多数的数据类型,并对包含其他
类型数据的单元返回空值。(如果各种数据类型的数量相当,则采用数值类型。)
通过下面的方法得到Excel的每个sheet的名称:
string strSheetName = "";
DataTable dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
for (int i = 0; i < dt.Rows.Count; i++)
{
sheetName += "[" + dt.Rows[i][2].ToString().Trim()+ "]";
}
用Excel的一个sheet填充DataTable
string strCom = " SELECT * FROM " + sheetName;
OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, conn);
DataTable dtExcel = new DataTable(); ///建立新的数据集 dtExcel
myCommand.Fill(dtExcel , sheetName);///填充数据集
这样就把数据读入DataTable中了。最后一定要记得关闭对文件的连接:conn.Close();
第三:文件的删除(推荐)。
一般情况下我们操作完这个Excel文件后,它就没用了,这时我们可以考虑删除掉这个文件,以释放占有的硬盘资源.如下: FileInfo file = new FileInfo(filePath);
file.Delete();
这样我们就完成了对Excel的读取!