• 0803C#如何高效读取EXCEL文件


    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> 
  • 相关阅读:
    59
    58
    57
    56
    55
    54
    53
    转 Using $.ajaxPrefilter() To Configure AJAX Requests In jQuery 1.5
    jquery用正则表达式验证密码强度
    什么是高内聚、低耦合?(转载)
  • 原文地址:https://www.cnblogs.com/jonson1126/p/3234868.html
Copyright © 2020-2023  润新知