前往顾页
以后地位: 主页 > 收集编程 > .Net实例教程 >

C#中对Excel的操纵体例详解

时候:2010-06-22 11:03来源:知行网www.zhixing123.cn 编辑:麦田守望者

 

Excel表格文档因为其简朴易用,遍及利用于很多单位或部分,因此在编写利用法度过程中,偶然会需求对Excel文档进行操纵,最简朴的环境凡是有两种:(1)需求获得文档中一些单位格的值;(2)将文档导入至数据库。
 
1).在操纵Excel文档之前,需求增加对Excel工具库的援引:
援引—COMMicrosoft Excel 11.0 Object Library(版本号可能不合)
 
2).以下代码表示翻开一个已有的Excel文档的第一个sheet页,获得单位格“B1的内容,并判定其值是不是为“my”:

 

        private void Operate(string pFileName)
        
{
            Excel.Application app 
= new Excel.Application();//翻开一个Excel利用
            if (app == null)
            
{
                
return;
            }


            Workbooks wbs 
= app.Workbooks;
            _Workbook wb 
= wbs.Add(pFileName);//翻开一个现有的事情薄
            Sheets shs = wb.Sheets;
            _Worksheet sh 
= (_Worksheet)shs.get_Item(1);//挑选第一个Sheet页
            if (sh == null)
            
{
                
return;
            }


            Range r 
= sh.get_Range("B1", Missing.Value);
            
if (System.Convert.ToString(r.Value2).Trim().Equals("my"))
            
{
                
//Do Something.
            }

        }

很多人在翻开Excel利用后,对如安在利用完成后开释它年夜感头痛,在网上我找到一种体例,颠末尝试证明是OK的:

 
3).

 

        private void ReleaseCOM(object pObj)
        
{
            
try
            
{
                System.Runtime.InteropServices.Marshal.ReleaseComObject(pObj);
            }

            
catch
            
{
                
throw new Exception("开释资本时产生错误!");
            }

            
finally
            
{
                pObj 
= null;
            }

        }

 

有了该体例,则只需在步调2)代码以后增加以下代码,便可以完成对资本的开释:

 

        private void Operate(string pFileName)
        

……
//开释资本
            ReleaseCOM(sh);
            ReleaseCOM(shs);
            ReleaseCOM(wb);
            ReleaseCOM(wbs);
            app.Quit();
            ReleaseCOM(app);
        }

基于Excel中的函数可以编辑出相当复杂的公式,偶然候在措置Excel文档时,希望利用Excel中的公式,以下连络FREQUENCYMATCH函数对B列计较distinct count,将其写入B100单位格(假定有数据的行不超越100行):


4).

 

        string  count = sh.UsedRange.Rows.Count.ToString();
        Range r 
= sh.get_Range("B100",Missing.Value);
        r.Formula 
= "=SUM(IF(FREQUENCY(MATCH(B1:B" + count + ",B1:B" + count + ",0),MATCH(B1:B" + count + ",B1:B" + count + ",0))>0,1))";
        Console.WriteLine(System.Convert.ToString(r.Value2));

Excel导入数据,可以先利用ODBC,以select查询时利用“[sheet页称呼$]”作为“表名”,将数据以datatable情势载入到内存中,以后的事就比较简朴了,可以按照datatable逐行机关insert语句,然后拔出到目标数据库中:


5).

 

        private DataTable LoadExcel(string pPath)
        
{
            
string connString = "Driver={Driver do Microsoft Excel(*.xls)};DriverId=790;SafeTransactions=0;ReadOnly=1;MaxScanRows=16;Threads=3;MaxBufferSize=2048;UserCommitSync=Yes;FIL=excel 8.0;PageTimeout=5;";
            connString 
+= "DBQ=" + pPath;
            OdbcConnection conn 
= new OdbcConnection(connString);
            OdbcCommand cmd 
= new OdbcCommand();
            cmd.Connection 
= conn;
            
//获得Excel中第一个Sheet称呼,作为查询时的表名
            string sheetName = this.GetExcelSheetName(pPath);
            
string sql = "select * from [" + sheetName.Replace('.''#'+ "$]";
            cmd.CommandText 
= sql;
            OdbcDataAdapter da 
= new OdbcDataAdapter(cmd);
            DataSet ds 
= new DataSet();
            
try
            
{                
                da.Fill(ds);
                
return ds.Tables[0];
            }

            
catch (Exception x)
            
{
                ds 
= null;
                
throw new Exception("从Excel文件中获得数据时产生错误!");
            }

            
finally
            
{
                cmd.Dispose();
                cmd 
= null;
                da.Dispose();
                da 
= null;
                
if (conn.State == ConnectionState.Open)
                
{
                    conn.Close();
                }

                conn 
= null;
            }

        }


        
private string GetExcelSheetName(string pPath)
        
{
            
//翻开一个Excel利用
            Excel.Application app = new Excel.Application();
            
if (app == null)
            
{
                
throw new Exception("翻开Excel利用时产生错误!");
            }

            Excel.Workbooks wbs 
= app.Workbooks;
            
//翻开一个现有的事情薄
            Excel._Workbook wb = wbs.Add(pPath);
            Excel.Sheets shs 
= wb.Sheets;
            
//挑选第一个Sheet页
            Excel._Worksheet sh = (Excel._Worksheet)shs.get_Item(1);
            
string sheetName = sh.Name;

            ReleaseCOM(sh);
            ReleaseCOM(shs);
            ReleaseCOM(wb);
            ReleaseCOM(wbs);
            app.Quit();
            ReleaseCOM(app);
            
return sheetName;
        }

 

(“string sql = "select * from [" + sheetName.Replace('.', '#') + "$]";”如果sheet页称呼中含有“.”,则要将其替代为“#”,详细启事,没研究出来-_-。别的贴一张界面截图:)
 
6).关于从Excel导入数据,网上应当有很多例子,这里弥补一个关于数据导入时的效力问题。最后在从Excel导入数据到MySql中时,当文件到达50000行时,逐行导入花了10余分钟的时候。年夜量履行拔出操纵,逐条履行很慢启事可能在于:
(1)每履行一条拔出语句,客户端需求与办事器交互一次,这要有代价
(2)一些数据库对每条拔出操纵都履行事件,这也要有代价
所以在年夜量履行拔出操纵时,应当尽可能先多个insert语句拼接好,比方每次拼接好200个insert语句,然后再一次履行它,如许可以年夜幅进步效力。
顶一下
(33)
100%
踩一下
(0)
0%
------分开线----------------------------
标签(Tag):EXCEL C#
------分开线----------------------------
颁发评论
请自发遵循互联网相关的政策法规,严禁公布色情、暴力、革命的谈吐。
评价:
神色:
考证码:点击我更换图片
猜你感兴趣