欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

asp.net读取excel文件的三种方法示例

程序员文章站 2024-02-24 09:45:46
方法一:采用oledb读取excel文件 把excel文件当做一个数据源来进行数据的读取操作,实例如下:复制代码 代码如下:public dataset exceltod...

方法一:采用oledb读取excel文件

把excel文件当做一个数据源来进行数据的读取操作,实例如下:

复制代码 代码如下:

public dataset exceltods(string path)  
{  
string strconn = "provider=microsoft.jet.oledb.4.0;" +"data source="+ path +";"+"extended properties=excel 8.0;";  
oledbconnection conn = new oledbconnection(strconn);  
conn.open(); 
string strexcel = "";  
oledbdataadapter mycommand = null;  
dataset ds = null;  
strexcel="select * from [sheet1$]";  
mycommand = new oledbdataadapter(strexcel, strconn);  
ds = new dataset();  
mycommand.fill(ds,"table1");  
return ds;  
}

对于excel中的表即sheet([sheet1$])如果不是固定的可以使用下面的方法得到

复制代码 代码如下:

string strconn = "provider=microsoft.jet.oledb.4.0;" +"data source="+ path +";"+"extended properties=excel 8.0;";
oledbconnection conn = new oledbconnection(strconn);
datatable schematable = objconn.getoledbschematable(system.data.oledb.oledbschemaguid.tables,null);
string tablename=schematable.rows[0][2].tostring().trim();

另外:也可进行写入excel文件,实例如下:

复制代码 代码如下:

public void dstoexcel(string path,dataset oldds)  
{  
//先得到汇总excel的dataset 主要目的是获得excel在dataset中的结构  
string strcon = " provider = microsoft.jet.oledb.4.0 ; data source ="+path1+";extended properties=excel 8.0" ;  
oledbconnection myconn = new oledbconnection(strcon) ;  
string strcom="select * from [sheet1$]";  
myconn.open ( ) ;  
oledbdataadapter mycommand = new oledbdataadapter ( strcom, myconn ) ;  
system.data.oledb.oledbcommandbuilder builder=new oledbcommandbuilder(mycommand);  
//quoteprefix和quotesuffix主要是对builder生成insertcomment命令时使用。  
builder.quoteprefix="["; //获取insert语句中保留字符(起始位置)  
builder.quotesuffix="]"; //获取insert语句中保留字符(结束位置)  
dataset newds=new dataset();  
mycommand.fill(newds ,"table1") ;  
for(int i=0;i<oldds.tables[0].rows.count;i++)  
{  
//在这里不能使用importrow方法将一行导入到news中,  
//因为importrow将保留原来datarow的所有设置(datarowstate状态不变)。  
//在使用importrow后newds内有值,但不能更新到excel中因为所有导入行的datarowstate!=added  
datarow nrow=adataset.tables["table1"].newrow();  
for(int j=0;j<newds.tables[0].columns.count;j++)  
{  
nrow[j]=oldds.tables[0].rows[i][j];  
}  
newds.tables["table1"].rows.add(nrow);  
}  
mycommand.update(newds,"table1");  
myconn.close();  
}

方法二:引用的com组件:microsoft.office.interop.excel.dll读取excel文件

首先是excel.dll的获取,将office安装目录下的excel.exe文件copy到dotnet的bin目录下,cmd到该目录下,运行 tlbimp excel.exe excel.dll 得到dll文件。

在项目中添加引用该dll文件

复制代码 代码如下:

//读取excel的方法    (用范围区域读取数据)  
private void openexcel(string strfilename)  
{  
object missing = system.reflection.missing.value;  
application excel = new application();//lauch excel application  
    if (excel == null)  
{  
    response.write("<script>alert('can't access excel')</script>");  
}  
    else  
{  
excel.visible = false;   excel.usercontrol = true;  
// 以只读的形式打开excel文件  
workbook wb = excel.application.workbooks.open(strfilename, missing, true, missing, missing, missing,  
missing, missing, missing, true, missing, missing, missing, missing, missing);  
//取得第一个工作薄
worksheet ws = (worksheet)wb.worksheets.get_item(1);
//取得总记录行数(包括标题列)
int rowsint = ws.usedrange.cells.rows.count; //得到行数
//int columnsint = mysheet.usedrange.cells.columns.count;//得到列数
//取得数据范围区域(不包括标题列)
range rng1 = ws.cells.get_range("b2", "b" + rowsint);//item
range rng2 = ws.cells.get_range("k2", "k" + rowsint);  //customer
object[,] arryitem= (object[,])rng1.value2;//get range's value
object[,] arrycus = (object[,])rng2.value2;
//将新值赋给一个数组
string[,] arry = new string[rowsint-1, 2];
for (int i = 1; i <= rowsint-1; i++)
{
//item_code列
arry[i - 1, 0] =arryitem[i, 1].tostring();
//customer_name列
arry[i - 1, 1] = arrycus[i, 1].tostring();
}
response.write(arry[0, 0] + "/" + arry[0, 1] + "#" + arry[rowsint - 2, 0] + "/" + arry[rowsint - 2, 1]);
}
 excel.quit();excel = null;
process[] procs = process.getprocessesbyname("excel");
foreach (process pro in procs)
{
pro.kill();//没有更好的方法,只有杀掉进程
}
gc.collect();
}

方法三:将excel文件转化成csv(逗号分隔)的文件,用文件流读取(等价就是读取一个txt文本文件)。

先引用命名空间:

复制代码 代码如下:

using system.text;和using system.io;  
filestream fs = new filestream("d:\\customer.csv", filemode.open, fileaccess.read, fileshare.none);  
streamreader sr = new streamreader(fs, system.text.encoding.getencoding(936));  
string str = "";  
string s = console.readline();  
while (str != null)  
{      
    str = sr.readline();  
    string[] xu = new string[2];  
    xu = str.split(',');  
    string ser = xu[0];  
    string dse = xu[1];                 
    if (ser == s)  
    {   
        console.writeline(dse);break;  
    }  
}     
sr.close();

另外也可以将数据库数据导入到一个txt文件,实例如下:

复制代码 代码如下:

//txt文件名  
string fn = datetime.now.tostring("yyyymmddhhmmss") + "-" + "po014" + ".txt";  
oledbconnection con = new oledbconnection(constr);  
con.open();  
string sql = "select   item,reqd_date,qty,pur_flg,po_num from tsd_po014";          
/oledbcommand mycom = new oledbcommand("select * from tsd_po014", mycon);  
//oledbdatareader myreader = mycom.executereader();   //也可以用reader读取数据  
dataset ds = new dataset();  
oledbdataadapter oda = new oledbdataadapter(sql, con);  
oda.fill(ds, "po014");  
datatable dt = ds.tables[0];  
filestream fs = new filestream(server.mappath("download/" + fn), filemode.create, fileaccess.readwrite);  
streamwriter strmwriter = new streamwriter(fs);    //存入到文本文件中  
//把标题写入.txt文件中  
//for (int i = 0; i <dt.columns.count;i++)  
//{  
//     strmwriter.write(dt.columns[i].columnname + "   ");  
//}  
foreach (datarow dr in dt.rows)  
{  
string str0, str1, str2, str3;  
string str = "|";  //数据用"|"分隔开  
str0=dr[0].tostring();
str1=dr[1].tostring();
str2=dr[2].tostring();
str3=dr[3].tostring();
str4=dr[4].tostring().trim();
strmwriter.write(str0);
strmwriter.write(str);
strmwriter.write(str1);
strmwriter.write(str);
strmwriter.write(str2);
strmwriter.write(str);
strmwriter.write(str3);
strmwriter.writeline();//换行
}
strmwriter.flush();
strmwriter.close();
if(con.state==connectionstate.open)
{
con.close();
}