上一篇介紹 Excel 的基本操作,煩瑣的程式碼,是不是令人心煩?
良好的類設計能使系統結構更加清晰,並可加強代碼的復用性和易維護性,減少開發的工作量。有鑑於此,我規劃了一個 MyExcel類,用于處理 Excel 的相關操作。
有三種打開 Excel 的方式:
1) 開啟一個新檔。
2) 開啟一個已存在的檔案。
3) 開啟一個已存在的檔案,並設定某工作表為作用中的工作表。
所以設計了三種建構方式:
aXLS = new MyExcel();
aXLS = new MyExcel(file);
aXLS = new MyExcel(file, "Sheet1");
不管存或取,都要指定單元格,而單元格的表示方式的有兩種,如:"B3" 或 [Row, Col],所以設計了如下的存取方法:
// 設定單元格的值。
SetCells(int nCol, int nRow, string szValue);
SetCells(string szRangeName, string szValue);
// 取得單元格的值。
GetCells(int nCol, int nRow);
GetCells(string szRangeName);
調用時:
aXLS = new MyExcel();
aXLS.SetCells("A1", "Hello!");
aXLS.Dispose();
完整的程式碼如下:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Reflection;
using System.Text;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
class MyExcel
{
privateobject missing = Type.Missing;
privateExcel.Application m_aExcelApp = null;
privateExcel.Workbook m_aWB = null;
privateExcel.Worksheet m_aSheet =null;
//----------------------------------------------
public MyExcel()
{
Open("", "");
}
//----------------------------------------------
public MyExcel(string szFileName)
{
Open(szFileName, "");
}
//----------------------------------------------
public MyExcel(string szFileName, string szSheetName)
{
Open(szFileName, szSheetName);
}
//----------------------------------------------
private void Open(string szFileName, string szSheetName)
{
CreateApp();
if (m_aExcelApp == null) return;
if (szFileName != "")
{
m_aWB = m_aExcelApp.Workbooks.Open(szFileName);
}
else
{
m_aWB = m_aExcelApp.Workbooks.Add();
}
if( szSheetName == "" )
m_aSheet = (Excel.Worksheet)m_aWB.Sheets[1];
else
m_aSheet = (Excel.Worksheet)m_aWB.Sheets[szSheetName]; // 設定為ActiveSheet
}
//----------------------------------------------
private void CreateApp()
{
try
{
m_aExcelApp = new Excel.Application();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
m_aExcelApp = null;
}
}
//----------------------------------------------
public void Dispose()
{
if (m_aExcelApp == null) return;
m_aWB.Close();
m_aExcelApp.Workbooks.Close();
m_aExcelApp.Quit();
ReleaseObject(m_aWB);
ReleaseObject(m_aExcelApp);
m_aWB = null;
m_aExcelApp = null;
}
//----------------------------------------------
private void ReleaseObject(object aObj)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(aObj);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
GC.Collect();
}
}
//----------------------------------------------
public void SetCells(int nCol, int nRow, string szValue)
{
m_aSheet.Cells[nRow, nCol] = szValue;
}
//----------------------------------------------
public void SetCells(string szRangeName, string szValue)
{
Excel.Range aRange = m_aSheet.get_Range(szRangeName,missing);
aRange.Value2 = szValue;
}
//----------------------------------------------
public string GetCells(int nCol, int nRow)
{
Excel.Range oRange = (Excel.Range)m_aSheet.Cells[nRow, nCol];
if (oRange.Value2 == null)
return "";
else
return oRange.Value2.ToString();
}
//----------------------------------------------
public string GetCells(string szRangeName)
{
if (szRangeName == "") return "";
try
{
Excel.Range oRange = m_aSheet.get_Range(szRangeName,missing);
if (oRange.Value2 == null)
return "";
else
return oRange.Value2.ToString();
}
catch
{
return "";
}
}
//----------------------------------------------
}
Open() 是整個核心,它會建立 Application 及 Workbook,並設定作用中的WookSheet。不再使用時,記得要呼叫 Disponse() ,釋放所引用的 COM 對象。