1.方法一:采用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 ) ; ystem.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(); }
2.方法二:引用的com组件:Microsoft.Office.Interop.Excel.dll 读取EXCEL文件
首先是Excel.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); excel.Quit(); excel = null; Process[] procs = Process.GetProcessesByName("excel"); foreach (Process pro in procs) { pro.Kill();//没有更好的方法,只有杀掉进程 } GC.Collect(); }
3.方法三:将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(); }
第一种:逐个单元格导出法(此方法操作相对复杂,但是比较灵和,适合对导出表有要求的情况)
javascript代码如下 <SCRIPT LANGUAGE="javascript"> function ExcelExport(tableid) { var table = document.getElementById(tableid); //获取页面的table var excel = new ActiveXObject("Excel.Application"); //实例化Excel.Application对象 var workB = excel.Workbooks.Add(); ////添加新的工作簿 var sheet = workB.ActiveSheet; //var sheet= workB.Worksheets(1);//该句代码和上句代码同意,都是激活一个sheet /***************常用样式设置语句***************************************/ //sheet.Rows(1).WrapText = false; //自动换行设置 //sheet.Rows(1).Font.Size=18;//设置第一行的字体大小 //sheet.Rows(1).Interior.ColorIndex=2;//设置第一行背景色 //sheet.Rows(1).Font.ColorIndex=1;//设置第一行字体色 //sheet.Range(sheet.Cells(1,1),sheet.Cells(1,7)).mergecells=true;//第一行1到7单元格合并 sheet.Columns("A").ColumnWidth =35;//设置列宽 sheet.Columns("B").ColumnWidth =35; //sheet.Columns("A:B").ColumnWidth =35;//另一种设置列宽的方式 sheet.Rows(1).RowHeight = 35;//设置行高 //sheet.Rows(1).Font.Name="黑体";//设置字体 //sheet.Columns.AutoFit;//所有列自适应宽度 //水平对齐方式(貌似-4108为水平居中) //sheet.Range( sheet.Cells(1,1),sheet.Cells(1,5)).HorizontalAlignment =-4108; //垂直对齐方式 //sheet.Range( sheet.Cells(1,1),sheet.Cells(1,5)).VerticalAlignment =-4108; //根据Borders()中参数值设置各个方向边距,1,2,3,4--->top,buttom,left,right //sheet.Range( sheet.Cells(2,1),sheet.Cells(1,5)).Borders(1).Weight = 2; /**将页面table写入到Excel中,具体复杂情况(合并单元格等)可在这里面具体操作**********/ var LenRow = table .rows.length; //以下为循环遍历获取页面table的cell元素 for (i = 0; i < LenRow ; i++) { var lenCol = table.rows(i).cells.length; for (j = 0; j < lenCol ; j++) { sheet.Cells(i + 1, j + 1).value = table.rows(i).cells(j).innerText; //通过该语句将table的每个 //cell赋予Excel 当前Active的sheet下的相应的cell下 } } excel.Visible = true;//设置excel为可见 excel.UserControl = true; //将Excel交由用户控制 } </SCRIPT>
第二种方法:整体拷贝法(该方法以较少代码实现Excel数据的导出,但是导出数据格式可能存在样式和页面不一致情况,甚至像背景色等会出现错位,而且如果在html页面中对需要导出的table样式做过设置的话,此处部分样式设置可能不会起作用)
<SCRIPT LANGUAGE="javascript"> function ExcelExport(tableid) { var table = document.getElementById(tableid); var ax =new ActiveXObject("Excel.Application"); var workbook = oXL.Workbooks.Add(); var sheet = workbook.ActiveSheet; var sel = document.body.createTextRange(); //把table中的数据移到sel中 sel.moveToElementText(table); sel.select(); //选中sel中所有数据 sel.execCommand("Copy");//复制sel中的数据 sheet.Columns("A").ColumnWidth =35;//设置列宽 sheet.Columns("B").ColumnWidth =35; sheet.Rows(1).RowHeight = 35;//设置表头高 //将sel中数据拷贝到sheet工作薄中 sheet.Paste(); ax.Visible = true; //通过打印机直接将Excel数据打印出来 sheet.Printout; ax.UserControl = true; } </SCRIPT>