今天开始学习C#使用Excel。
首先,要先添加引用:
放大了看就是这个:
若发现没有这个项,可以默认安装office,我这里使用的是office2013:
若发现还是没有在引用中找到对应的项,可尝试添加VS的功能:关于office的功能组件。
[C# .Net] Microsoft.Office.Interop.Excel 讀 / 寫 Excel 語法概全 這篇當時是使用Excel2003所完成,距離現在2010的版本已經有點久遠了,版本不同寫法也有點不同,今天就來更新一下用法。
首先要先加入Excel.exe參考
再來匯入 using Excel = Microsoft.Office.Interop.Excel;
http://www.dotblogs.com.tw/yc421206/archive/2009/12/06/12297.aspx
再來瞭解一下我們會用到以下類別,這已經跟舊版的Excel名稱不同了。
Excel.Application:Excel應用程式
Excel.Workbook:應用程式裡的活頁簿,預設情況下,不管你開幾個Excel檔案,在工作管理員裡只會出現一個Excel.exe
Excel.Worksheet:活頁簿裡的工作表
Excel.Range:工作表裡的儲存格,一格也是Range,多格也是Range,用法Excel.Range[“A1”];
Excel.Range.Cells:這是儲存格的最小單位,代表一格的Range,用法Excel.Range.Cells[1,1];
接下來實作,initailExcel方法會檢查有無Excel.exe執行,若有則引用舊有Excel
Excel.Application _Excel = null;
void initailExcel()
{
//檢查PC有無Excel在執行
bool flag = false;
foreach (var item in Process.GetProcesses())
{
if (item.ProcessName == "EXCEL")
{
flag = true;
break;
}
}
if (!flag)
{
this._Excel = new Excel.Application();
}
else
{
object obj = Marshal.GetActiveObject("Excel.Application");//引用已在執行的Excel
_Excel = obj as Excel.Application;
}
this._Excel.Visible = true;//設false效能會比較好
}
///------初始化Excel.Application在.NET裡沒有版本之分,但下列Method就有了
///-----@VS2010以前的版本VS2005 C#2.0~VS2008 C#3.0
private void button1_Click(object sender, EventArgs e)
{
initailExcel();
operExcel();
}
private void button2_Click(object sender, EventArgs e)
{
this._Excel.Quit();
this._Excel = null;
//確認已經沒有excel工作再回收
GC.Collect();
}
void operExcel()
{
Excel.Workbook book = null;
Excel.Worksheet sheet = null;
Excel.Range range = null;
string path = Application.StartupPath + "\\test.xlsx";
try
{
book = _Excel.Workbooks.Open(path, 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);//開啟舊檔案
sheet = (Excel.Worksheet)book.Sheets[1];
range = sheet.get_Range("A5", "D23");
foreach (Excel.Range item in range)
{
Console.WriteLine(item.Cells.Formula);
Console.WriteLine(item.Cells.Value2);
Console.WriteLine(item.Cells.Text);
}
book.Sheets.Add(Type.Missing, sheet, 1, Type.Missing);
sheet = (Excel.Worksheet)book.Worksheets[2];
sheet.Name = "新的工作表";
//另存活頁簿
book.SaveAs(Application.StartupPath + "\\test1.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
}
finally
{
book.Close(Type.Missing, Type.Missing, Type.Missing);
book = null;
}
}
@VS2010 C# 4.0 版本:因為C# 4.0新增了選擇性參數,不在像舊版那樣必須強制代入無用的參數Type.Missing
另外:
在.NET4.0的專案中可以不必轉型
sheet = book.Sheets["Sheet1"];
在.NET2.0~3.5的專案中要轉型
sheet = (Excel.Worksheet)book.Sheets["Sheet1"];
private void button1_Click(object sender, EventArgs e)
{
initailExcel();
operExcel();
}
private void button2_Click(object sender, EventArgs e)
{
this._Excel.Quit();
this._Excel = null;
//確認已經沒有excel工作再回收
GC.Collect();
}
void operExcel()
{
Excel.Workbook book = null;
Excel.Worksheet sheet = null;
Excel.Range range = null;
string path = Application.StartupPath + \\test.xlsx;
try
{
book = _Excel.Workbooks.Open(path);//開啟舊檔案
//sheet = (Excel.Worksheet)book.Sheets[1];//指定活頁簿,代表Sheet1
sheet = (Excel.Worksheet)book.Sheets["Sheet1"];//也可以直接指定工作表名稱
range = sheet.get_Range("A5", "D23");
foreach (Excel.Range item in range)
{
Console.WriteLine(item.Cells.Formula);
Console.WriteLine(item.Cells.Value);
Console.WriteLine(item.Cells.Value2);
Console.WriteLine(item.Cells.Text);
}
book.Sheets.Add(After: sheet, Count: 1);
sheet = (Excel.Worksheet)book.Worksheets[2];
sheet.Name = "新的工作表";
//另存活頁簿
book.SaveAs(Filename: Application.StartupPath + "\\test1.xls", FileFormat: Excel.XlFileFormat.xlXMLSpreadsheet, AccessMode: Excel.XlSaveAsAccessMode.xlNoChange);
}
finally
{
book.Close();
book = null;
}
}
延伸閱讀
http://www.dotblogs.com.tw/yc421206/archive/2008/12/20/6470.aspx
下面的代码示例演示如何使用 COM interop 创建 Excel 电子表格。有关 Excel 的更多信息,请参见“Microsoft Excel Objects”(Microsoft Excel 对象)和“Open Method”(Open 方法)
此示例演示如何在 C# 中使用 .NET Framework COM interop 功能打开现有的 Excel 电子表格。使用 Excel 程序集来打开 Excel 电子表格中一定范围内的单元格并向其中输入数据。
注意 |
---|
为使此代码正常运行,必须在系统中安装 Excel。 |
注意 |
---|
显示的对话框和菜单命令可能会与“帮助”中描述的不同,具体取决于您现用的设置或版本。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置。 |
使用 COM interop 创建 Excel 电子表格
在 Visual Studio 中创建新的 C# 控制台应用程序,将其命名为 CreateExcelWorksheet。
将 Excel 程序集作为引用添加到项目中:右键单击项目,选择“添加引用”。
单击“添加引用”对话框的“COM”选项卡,找到“Microsoft Excel 11 对象库”。
双击“Microsoft Excel 11 对象库”,然后按“确定”。
注意 |
---|
根据安装的 Office 版本的不同,Excel 程序集可能名为“Excel 10 对象库”或“Excel 11 对象库”。 |
复制下面的代码并将其粘贴到 Program.cs 文件中覆盖原有内容。
using System;
using System.Reflection;
using Microsoft.Office.Interop.Excel;
public class CreateExcelWorksheet
{
static void Main()
{
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
{
Console.WriteLine("EXCEL could not be started. Check that your office installation and project references are correct.");
return;
}
xlApp.Visible = true;
Workbook wb = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Worksheet ws = (Worksheet)wb.Worksheets[1];
if (ws == null)
{
Console.WriteLine("Worksheet could not be created. Check that your office installation and project references are correct.");
}
// Select the Excel cells, in the range c1 to c7 in the worksheet.
Range aRange = ws.get_Range("C1", "C7");
if (aRange == null)
{
Console.WriteLine("Could not get a range. Check to be sure you have the correct versions of the office DLLs.");
}
// Fill the cells in the C1 to C7 range of the worksheet with the number 6.
Object[] args = new Object[1];
args[0] = 6;
aRange.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, aRange, args);
// Change the cells in the C1 to C7 range of the worksheet to the number 8.
aRange.Value2 = 8;
}
}