網上搜索C#實現excel操作的示例太多了,但不知道有多少是經過驗證確實可行才發布出來的,也是因為開發需要,我找了一些代碼卻發現大多都不能正確執行完畢,於是決定補充自己在實踐中遇到的要點以供參考。如下示例:
using Microsoft.Office.Interop.Excel;
using System.Reflection;
public class MyConsole
{
public static void Main()
{
Application app = new ApplicationClass();
try
{
//讓後台執行設置為不可見
app.Visible = false;
//新增加一個工作簿
Workbook wBook = app.Workbooks.Add(true);
//如果要打開已有的工作簿,則使用下面的注釋語句
// Workbook wBook = app.Workbooks.Open(@"C:\YourPath\YourWorkbook.xls",
// missing, missing, missing, missing, missing, missing, missing,
// missing, missing, missing, missing, missing,missing, missing);
//取得一個工作表
//如果打開了已有的工作簿,也可以這樣獲取工作表Worksheet wSheet = wBook.ActiveSheet as Worksheet
Worksheet wSheet = wBook.Worksheets[1] as Worksheet;
wSheet.Cells[1, 1] = "this is a test";
//設置禁止彈出保存和覆蓋的詢問提示框
app.DisplayAlerts = false;
app.AlertBeforeOverwriting = false;
//保存工作簿
wBook.Save();
//保存excel文件
app.Save("C:\\abc.xls");
}
catch
{
}
finally
{
//確保Excel進程關閉
app.Quit();
app = null;
}
}
}
代碼注釋部分只是簡單描述各語句的原由,個別的還是值得推敲的。
語句一 Workbook wBook = app.Workbooks.Add(true);Workbooks.Add的參數是個object類型,通常使用true或null,表明工作簿在默認文檔下創建,或者使用枚舉值 XlWBATemplate.xlWBATWorksheet,但如果傳入一個excel完整文件名,卻相當於打開已有工作簿。
語句二 Worksheet wSheet = wBook.Worksheets[1] as Worksheet;wBook.Worksheets雖然反映的是工作表的集合,然而新創建的工作簿中只有一個工作表,且索引是1,如果換成0將無法找到指定的WorkSheet,如果是操作多個工作表的話,建議用new WorkSheetClass()實例化之後加入到wBook.Worksheets中去。如果是打開已存在的工作簿,這條語句也可能會報錯,最好是調用wBook.ActiveSheet來獲取或者再加些判斷。
語句三 wBook.Save();app.Save("C:\\abc.xls");這兩句代碼至關重要,而且必不可少,否則,保存時會彈出“是否保存sheet1.xls”的對話框。像示例中的保存,在windows server 2003中,因為權限的原因,還可能會出現這樣的現象(其它操作系統的結果有待考證):生成的abc.xls除了本機上運行此代碼的用戶打開正常外,其他戶打開後的錯誤信息如下:
無法訪問文件。請嘗試下列方法之一:
確認所指定的文件夾已存在。
確認文件所在的文件夾不是只讀的。
確認給出的文件名不包含下列字符:<>?[]:Sheet1.xls或*。
確認文件/路徑名長度不超過218個字符。
因為此時創建的工作簿其實是在當前用戶的“我的文檔”目錄下自動生成了一個Sheet1.xls副本,而abc.xls是指向這個副本的快捷方式,所以導致其他用戶無權訪問。我采取的解決辦法是將這兩句替換為:
wSheet.SaveAs("C:\\abc.xls",Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
wBook.Save();
這樣做,“我的文檔”下就不會再創建Sheet1.xls,而且打開可以發現,原來工作簿裡那個工作表名是sheet1.xls的也更改名字為abc.xls了。
語句四 app.Quit();
這個關閉一直有疑點,因為C#操作com非托管對象時,憑借Quit()還沒有釋放掉對象,excel進程不一定會終止,於是,有人使用KillProcess()來處理,我個人認為這不是一個好主意,可能會破壞其它正在執行的excel進程。目前我使用app = null;權作安慰吧。不過有一點是一定要做到,就是在Quit()前不能再有任何更改,不然還是會彈出保存的對話框。所以退出前確保一定是執行過WorkBook或是Application的Save()方法的。
對於在c#中操作excel應用的方面很多,可能還會有些疑問出現,知曉來龍去脈的朋友盡量補充以方便大家吧。