陳洪磊 施秋萍
(普洱學院,云南 普洱 665000)
C#,稱為C sharp,是C和C++語言的一種升級計算編程語言,由是微軟公司退出的一種基于.NET框架的高級程序設計語言。C#是面向對象的編程語言,易于學習,使得程序員可以快速地編寫各種.NET平臺的應用程序。
Excel也是微軟公司推出的Office辦公套件中的一個處理表格的專業軟件,也是當今最流行的辦公表格處理軟件[1]。
基于 C#對 Excel的專用應用程序可以大大提高工作效率,本文主要介紹兩種常用C#操作Excel方法:COM組件操作法和OLEDB操作法。對于Excel最基本的操作包括:創建Excel文件,對Excel文檔的保存、讀寫、刪除、添加、查找,本文主要通過這些基本操作對兩種操作方式的利弊進行了實驗比較。
COM組件是微軟公司開發的一種軟件開發技術,我們狹義上可以把它理解為一個功能強大的微軟API,當然它的所含的概念遠遠超過API。由于Excel也是由微軟公司開發的,所以COM組件中也提供了對Excel操作的一些對象,其中最重要的四個對象為Application,Workbook,Worksheet和Range對象[2]。
當打開一個Excel文檔的時候就創建了一個Application對象,可以理解為只要運行 Excel程序就創建了一個Application對象。如圖1所示,一個Application中包含了很多個Workbook(Workbooks),這就相當于Excel文件可以同時打開很多個工作?。╓orkbooks),其中的一個就是Workbook,在一個Workbook中又包含了很多工作表(Worksheets),其中一個就成為Worksheet。在圖1 的結構圖中,最后一個對象Range表示一個工作表(Workbook)中單元格的使用范圍[3][4]。

圖1 Excel對象層級結構
本文中的編程環境是Visual Studio 2010,在創建Excel文檔是首先要添加Excel的COM組件,即在項目中添加引用“Microsoft Excel 15.0 Object Library”,這里要特別注意,由于Office辦公套件有很多版本,所以添加引用時也有很多的版本,有些較老的版本是不支持較新的Office文件,通常最好添加新版本的COM組件[5]。
首先使用命名空間:using Excel=Microsoft.Office.Interop.Excel;
Excel.Application NewExcel = new Excel.Application();//新建一個Excel進程
NewExcel.Application.Workbooks.Add (true );//在Excel文件中創建一個工作薄
通過以上就可以簡單的創建一個空白的Excel文件,通常情況可以通過Visible屬性來設置創建的Excel文件可見性,NewExcel.Visible=false這里設置Excel為不可見。
以上創建空白的Excel后就要對新建文檔進行保存,這里使用SaveAs方法:
NewExcel.SaveAs(filename,Missing.Value,Missing.Value,Missi ng.Value,Missing.Value,Missing.Value,Excel.XlSaveAsAccessMo de.xlNoChange,Missing.Value,Missing.Value,Missing.Val ue,Missing.Value, Missing.Value);
SaveAs方法中有很多參數,這里我們主要關心其中的filename參數,其作用是要保存的文件名。可包含完整路徑。如果不指定路徑,文件保存到當前文件夾中。其他的參數設置一般使用默認方式,詳細了解可以通過微軟官方MSDN網站[1]。
2.2.1 寫入數據
在創建一個新的工作薄后,可以直接使用“Cells”對新建的Excel賦值,具體代碼如下:
NewExcel.Cells[1,1]=”第一行第一列”;
NewExcel.Cells[1,2]=”第一行第二列”;
這里的行列號是從1開始排列,不是從0開始。
2.2.2 讀取數據
讀取數據相對于寫入數據較為復雜,通常要讀取數據首先要打開有數據的 Excel文檔,這里使用 COM組件的 Open方法打開一個Excel文檔:
Excel.Workbook NewWorkbook = NewExcel.Workbooks.Open(FilePath, Type.Missing, Type.Missing,Type.Missing, Type.Missing, Type.Missing,Type.Missing, Type.Missing, Type.Missing,Type.Missing, Type.Missing, Type.Missing,Type.Missing, Type.Missing, Type.Missing);
這里使用Application新建一個Excel進程,然后在此基礎上創建一個新的工作薄NewWorkbook,打開的Excel文檔就要導入到這里工作薄中。在Open方法中有很多的參數,通常我們主要關注FilePath,這個參數就是要打開的文件路徑[6]。
接下來還要創建一個新的工作表(Worksheet),在工作表的基礎上在創建Range對象,數據的讀取就是通過Range對象完成的,具體過程如下:
Excel.Worksheet
NewSheet=(Excel.Worksheet)NewWorkbook. Sheets[1];//在工作薄中創建一個工作表
Excel.Range range= (Excel.Range)NewSheet.Cells[2,2];//這里是把工作表中的第二行第二列轉換為Range對象,并賦值給range。
得到Range對象后可以使用Text或者Value2等屬性得到里面的數據。
當數據寫入完成后要使用 NewWorkbook.Save()或者NewWorkbook.SaveAs()進行保存,最后在使用NewWorkbook.Close()關閉工作薄。
在Excel中刪除數據主要使用Range對象。
Excel.Range range= NewSheet.get_Range(”A1”,”H1”);//”A1”和”H1”是要刪除表格的范圍
Range.Delete(Type.Missing);// “Type.Missing”表示缺省值
在實際情況中,經常用到整行、整列的刪除,在COM組件中也提供這種刪除方法。
刪除整行:
Excel.Range range = (Excel.Range) NewSheet.Rows[1,Missing.Value];//把工作表中的要刪除的行賦值給 range對象,這里是第一行。
range.EntireRow.Delete(Excel.XlDeleteShiftDirect ion.xlShiftUp);//調用range對象的EntireRow表示整行,Delete表示刪除里面的參數表示刪除后下方單元格向上移動。
刪除整列:
Excel.Range range = (Excel.Range) NewSheet.Columns[1, Missing.Value];//把工作表中的要刪除的列賦值給range對象,這里是第一列。
range.EntireColumn.Delete(Excel.XlDeleteShiftDir ection.xlShiftToLeft);//調用range對象的EntireColumn表示整列,Delete表示刪除里面的參數表示刪除后右邊單元格向左移動[6]。
Excel表格增加數據主要就是指增加行或者列,其操作方式與刪除方式類似。
增加行:
Excel.Range range = (Excel.Range)NewSheet.Rows[2,Missing.Value];//獲取要插入的行號,并轉換為 Range對象,這里是要插入第二行。
range.Insert(Missing.Value,Excel.XlInsertFormatO rigin.xlFormatFromLeftOrAbove);//在 Excel表格中的第一行后插入一個空的第二行,Insert的第二個參數表示插入后,其他單元格移動方向。
增加列:
Excel.Range range = (Excel.Range)NewSheet. Columns[2, Missing.Value];//獲取要插入的列號,并轉換為Range對象,這里是要插入第二列。
range.Insert (Missing.Value, Excel.XlInsertShiftDirection.xlShiftToRight); //在 Excel表格中的第一列后插入一個空的第二列,Insert的第二個參數表示插入后,其他單元格移動方向[7]。
查找也是Excel文檔中十分重要的一個功能,下面是在一個工作表中的查找代碼:
Excel.Range range = ((Excel.Range)NewSheet. UsedRange).Find("查找關鍵字", Missing.Value, Missing.Value,Missing.Value, Missing.Value, Excel.XlSearchDirection.xlNext,Missing.Value, Missing.Value, Missing.Value);
NewSheet.UsedRange:表示當前工作表里所有使用的單元格區域組成的Range對象;
Find方法:方法中有很多個參數,主要有兩個參數必須要設置,第一個是要查找的關鍵字,另一個是 Excel.XlSearchDirection表示查詢的方向有兩個枚舉數值:xlNext向下查找和xlPrevious向前查找[7][8]。
OLEDB是微軟公司退出的針對不同的數據源的應用程序接口,也可以理解為OLEDB是一個數據庫的接口,程序可以通過 OLEDB連接到數據庫。這就說明 OLEDB操作法就是把Excel文件當作一個數據庫進行操作,這也就使得OLEDB操作法不能直接創建空白的Excel文件,這能向操作數據庫一樣連接一個已存在的一個Excel文檔。但是同時Excel本身并不是一個真正的數據庫文件,所以在 OLEDB中并不能對Excel文檔執行Delete刪除命令。
OLEDB操作Excel一般要通過C#自身的DataSet對象。DataSet為方便數據處理開發出來的,是數據的集合,正是因為使用DataSet,才使得數據操作簡單、高效。
首先要創建連接:
string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=0'";
這是連接字符串,其中 filepath是要連接的 Excel文件路徑。
“Microsoft.ACE.OLEDB.12.0”是連接Excel對象的接口引擎,較早的版本是“Microsoft.Jet.OLEDB.4.0”現在很少使用,如果程序出現連接方面的錯誤可以互相更換。
“Excel 12.0”表示Excel版本號,如果你的Excel是97年以前的版本要使用Excel 8.0。
“HDR” 表示第一行是否是標題行。
“IMEX”有三種模式,分別有0、1、2表示,“0”時Excel文檔能夠進行寫入操作;“1”時Excel文檔能夠進行讀取操作;“2”時Excel文檔可以同時只進行讀寫操作。
3.1.1 讀取數據
OleDbConnection conn = new OleDbConnection(strConn); //創建連接
conn.Open();
string strExcel = "select * from [sheet1$]";//使用SQL語句讀取Excel文檔中名為sheet1的工作表
OleDbDataAdapter myCommand = new OleDbDataAdapter(strExcel, strConn);//執行SQL語句
DataSet ds = new DataSet();
DataTable dt = new DataTable ();
ds.Tables.Add(dt);//把新建的 DataTable加入到DataSet中
myCommand.Fill(dt);//Excel文檔中的內容導入到了dt表中
conn.Close();
執行上面的程序后 Excel文檔的內容已經讀入到了 dt中,這里要說明下,DataSet中可以包含很多個DataTable,這種關系類似與Excel中工作薄和工作表的關系[8]。
3.1.2 寫入數據
這里對數據的操作有兩種方法,一種是直接使用SQL語句操作Excel表格數據;另一種方法就是操作DataSet中讀入的數據,操作全部完成后在一次更新到Excel文檔中。由于直接使用SQL語句直接操作Excel文檔效率較低,所以本文主要介紹操作DataSet,再更新到Excel文檔中的方法[8]。
DataRow NewRow = dt.NewRow();//在dt表格中新建一行數據
NewRow ["序號"]= "3";//賦值給“序號”字段
NewRow ["姓名"]= "張三";//賦值給“姓名”字段
NewRow ["學號"]= "201401001";//賦值給“學號”字段
dt.Rows.Add(NewRow);//確認插入新建的一行數據
以上增加 dt表格中的數據,接下來要把數據更新到Excel文檔中:
OleDbCommandBuilder odcb=new OleDbCommandBuilder(myCommand);
odcb.QuotePrefix = "[";
odcb.QuoteSuffix = "]";//用于糾正 INSERT INTO 語句的語法錯誤
myCommand.Update(dt);//更新dt數據到Excel文檔中
查找數據只要使用DataTable中的Find方法。
DataRow keyword = dt.Rows.Find("張三");//查找 dt表中有關“張三”數據
本文主要介紹了COM組件和OLEDB兩種方法操作Excel文檔的基本方法。從上面的內容可以看到OLEDB的操作比COM組件的操作功能少了很多,主要是因為OLEDB把Excel文檔作為一個數據庫進行處理,對數據庫處理有一定限制,比如不能隨意改變數據庫的結構,這就是為什么OLEDB中不能添加或者刪除列;而COM組件的操作就靈活多變,基本上可以實現Excel文檔操作中的所有功能,除了以上介紹的基本功能,還可以設置字體、改變顏色、設置單元格大小等;但是COM組件的操作效率較低,執行的速度遠遠低于OLEDB法,一個簡單的查找操作可能要比OLEDB操作的時間長10倍,COM組件法還有個非常麻煩的問題,每次操作完成后必須要手動把運行的Excel進程關閉,如果不關閉會影響后續對Excel文檔的處理。
最后總結,在實際編程過程中,我們可以同時使用兩種方法,發揮各自的優點,這樣才能最大限度的提高程序的效率。
[1]微軟公司. Microsoft Visual Studio.Net [Z].微軟公司,2003.
[2]Ted Faison. Visual C# 基于組件的開發[M].北京:清華大學出版社, 2003.
[3]李建忠. Microsoft .NET框架程序設計[M].武漢:華中科技大學出版社, 2004.
[4]杜成龍.ASP.NET實現通用查詢方式[J].教育信息化,2005,(7): 77-78.
[5]張文博,余文芳.ASP.NET編程中對Excel文檔操作的探討及應用[J].計算機系統應用,2010,(3): 187-189.
[6]陳志堅. ASP.NET中Excel文檔的處理[J].寧波職業技術學院學報,2010,(5): 60-62.
[7]王興,李菊,陳瑋. ASP.NET中Excel文檔生成技術研究[J].軟件導刊. 2010,(4): 130-131.
[8]張立君,王維國.基干ASP.NET與ADO.NET技術訪問數據庫[J].商丘職業技術學院學報,2008,(5): 29-31.