利用程式將資料寫入Excel已經不是第一次了,
如果有時間,應該把這個功能寫成可重復使用的類別。
底下是記錄使用Microsoft.Office.Interop.Excel的過程。
在寫程式之前,要將Microsoft.Office.Interop.Excel加入參考。
要注意依照自己的需求,載入不同版本的DLL。
Microsoft.Office.Interop.Excel的架構是要先有Application,
然後開啟Workbook,再使用Workbook產生Worksheet。
Worksheet則包含Range,可以存取Cell。
這個架構在下列的網址有更詳細的描述,
http://msdn.microsoft.com/en-us/library/wss56bz7%28v=VS.80%29.aspx
底下是範例程式,
using System.IO;
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection;
string fileName = @"C:\XYZ.XLS";
//設定輸入的報表表頭
string[] header = { //...字串陣列 代表資料表欄位名稱 };
string firstLineTitle = "First Line";
string secondLineTitle = "Second Line";
//設定必要的物件
//按照順序
//分別是Application -> Workbook -> Worksheet -> Range -> Cell
Excel.Application oXL = new Excel.Application();
Excel.Workbook oWB;
Excel.Worksheet oSheet;
Excel.Range oRng;
//如果需要讓使用者從程式的開始執行後
//就可以操作Excel
//則將下列屬性改為true
oXL.Visible = false;
oXL.UserControl = false;
//產生一個Workbook物件,並加入Application
oWB = oXL.Workbooks.Add(Missing.Value);
//設定工作表
oSheet = (Excel.Worksheet)oWB.ActiveSheet;
//在工作表的特定儲存格,設定內容
//這裡是將表頭指定到儲存格A1和A2
oSheet.Cells[1, 1] = firstLineTitle;
oSheet.Cells[2, 1] = secondLineTitle;
//在特定範圍設定儲存格內容
//這裡是資料表的欄位名稱
oSheet.get_Range("A4", "I4").Value2 = header;
DataTable dt = //....取得資料表
//從第五行開始,設定第一欄和第二欄的內容
//資料是從某資料表取出
int row = 5;
for (int counter = 0; counter < dt.Rows.Count; counter++)
{
oSheet.Cells[row, 1] = dt.Rows[counter]["XYZ"].ToString();
oSheet.Cells[row, 2] = dt.Rows[counter]["ABC"].ToString();
row++;
}
//設定為按照內容自動調整欄寬
oRng = oSheet.get_Range("A5", "A" + row.ToString());
oRng.EntireColumn.AutoFit();
//設定為置中
oRng = oSheet.get_Range("B5", "B" + row.ToString());
oRng.EntireColumn.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
//存檔
//在這裡只設定檔案名稱(含路徑)即可
oWB.SaveAs(fileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Excel.XlSaveAsAccessMode.xlShared, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
oWB.Close();
oWB = null;
oXL.Quit();
oXL = null;
底下是參考文件,
1. http://support.microsoft.com/kb/302084
2. http://msdn.microsoft.com/en-us/library/y1xatbkd%28v=VS.80%29.aspx
編輯記錄,
第一版:2010.07.13
第二版:2011.10.23

十二月 7, 2011 at 4:59 下午
您好,如果我的Excel表有好幾個 工作表。
我要怎麼寫入特定的資料表呢。
我現在只能寫入第一個工作表。
十二月 8, 2011 at 9:03 上午
http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.worksheet.aspx
你可以使用Worksheets的collection,對於不同的工作表進行存取。
例如,如果你要新增一張工作表,
可以使用worksheets.add。
http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.worksheets.add.aspx
十二月 12, 2011 at 9:14 上午
感謝您的回覆:我的部分程式如下
Excel.Application excel = new Excel.Application();
Excel.Workbook book;
Excel.Worksheet Total_D5, Output;
Excel.Range range;
excel.Visible = true;
book = excel.Application.Workbooks.Add(“c:\\test.xls”);
Total_D5 = (Excel.Worksheet)book.Worksheets[1];
Total_D5 = (Excel.Worksheet)book.ActiveSheet;
Total_D5.Cells[1, 1] = textBox2.Text;
Output = (Excel.Worksheet)book.Worksheets[2];
Output = (Excel.Worksheet)book.ActiveSheet;
Output .Cells[1, 1] = textBox3.Text;
我用
(Excel.Worksheet)book.Worksheets[2]; 設第2個工作表,還是沒用。
資料還是只會寫到第一個資料表去。
十二月 13, 2011 at 9:58 上午
我把回應的程式寫在另外一篇,請參考,
http://gradyli.wordpress.com/2011/12/12/c-excel-寫入多工作表/
十二月 13, 2011 at 10:43 上午
Dear gradyli:
感謝您的解答,不過我想要的需求是,將資料寫入現有的資料表,
就是我的EXCEL已經有幾個固定格式的資料表 A ,B C……
我要寫入這些已存在的資料表,我用.Add的方法會將資料寫入新增的資料表而不會寫入我原本已有的資料表裡。
不好意思。問題很多。
感謝您
十二月 13, 2011 at 11:41 上午
你可以直接使用已存在的工作表,不需要先使用Worksheets.Add。
十二月 13, 2011 at 11:45 上午
感謝您:
我用excel.Worksheets.get_Item(2);可以了