程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> c#創建、保存excel正常執行要點補疑

c#創建、保存excel正常執行要點補疑

編輯:關於C#

網上搜索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應用的方面很多,可能還會有些疑問出現,知曉來龍去脈的朋友盡量補充以方便大家吧。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved