C# API: 生成和讀取Excel文件我們想為用戶提供一些數據,考慮再三, 大家認為對于用戶(人,而非機器)的可讀性, Excel文件要好一些.
因為相比csv,xml等文件, Excel中我們可以運用自動篩選, 窗口鎖定, 還可以控制背景顏色, 前景顏色, 字體, 網格等等...
業務邏輯并不復雜, 文件的內容和格式也比較固定,所以大家決定直接拿C#去創建這些文件.
于是一搜索,首先來到了這個鏈接:C# Excel Tutorial
里面包含了下面這些主題的代碼示例, 示例很詳細, 編譯可直接運行.
- How to create Excel file in C#
- How to open an Excel file in C#
- How to read an Excel file in CSharp
- How to format an Excel file using C#
- How to insert a picture in excel from C# App
- How to insert a background picture in excel
- How to create Excel Chart from C#
- How to export excel chart from C#
- How to excel chart in C# picturebox
- C# data validation input box in excel file
- How to read from an Excel file using OLEDB
- How to insert data to Excel file using OLEDB
- How to update data in Excel file using OLEDB
- How to export databse to excel file
- How to export DataGridView to excel file
為了理解上面這些代碼需要理解一下Excel的對象模型, 可以參考msdn的下面這個鏈接
Excel Object Model Overview
里面介紹了4個核心對象:
Microsoft.Office.Interop.Excel.application
Microsoft.Office.Interop.Excel.Workbook
Microsoft.Office.Interop.Excel.Worksheet
Microsoft.Office.Interop.Excel.Range
前三個對象比較好理解, 關鍵在于第四個對象:Range.
起初我以為更改一些單元格的字體顏色格式等等的, 是需要通過Cell這個對象來做.
看完了之后才發現, 這些操作其實都是通過Range來完成的.
還包括和并單元格, 設置網格線等等, 甚至讀取和設置一個單元格的值,都可以通過Range來完成,
所以基本上當我們操作excel的時候, 我們最經常的就是和Range對象打交道, 而很少使用Cell等對象.
如果有什么需求不知道怎么實現,
建議可以先到Range對象里面翻一翻, 看看msdn上Range對象的Members,Methods,PRoperties的相關文檔.
還有一點要補充的是:
不僅僅是C#, 還包括其他語言的Excel API, 都是對Excel對象模型的直接模擬和包裝.不過java,Ruby等等.
也就是說, 其他語言的Excel API也都會有上面那四個主要對象, 而且也都會以近乎相同的方式, 干著差不多的事兒.
接下來想寫一寫關于Missing.Value的事兒
對于前面給出的,創建Excel表的例子的代碼, 轉載如下:
這段代碼中,很多函數調用都傳遞了這個參數:
object misValue = System.Reflection.Missing.Value;
他的詳細介紹參考這個鏈接Missing Class上面的例子,
簡單的說就是:
當我想以一些參數的默認值來調用一些dll中的方法的, 我們在方法調用中忽略掉這些參數也不對,
我們用null傳遞給這些參數還不對,
這時我們便可以給這些參數賦值以Missing.Value來告訴運行時環境, 用這個參數的默認值幫我運行吧.
對于這段代碼還有一個需要注意的問題:
注意Application,Workbook,Worksheet這三個對象的清理工作
該保存的保存, 該close的close, 該quit的quit, 最后, 他們還都應該被release
C#代碼
- usingSystem;
- usingSystem.Windows.Forms;
- usingExcel=Microsoft.Office.Interop.Excel;
- namespaceWindowsApplication1
- {
- publicpartialclassForm1:Form
- {
- publicForm1()
- {
- InitializeComponent();
- }
- privatevoidbutton1_Click(objectsender,EventArgse)
- {
- Excel.ApplicationxlApp;
- Excel.WorkbookxlWorkBook;
- Excel.WorksheetxlWorkSheet;
- objectmisValue=System.Reflection.Missing.Value;
- xlApp=newExcel.ApplicationClass();
- xlWorkBook=xlApp.Workbooks.Add(misValue);
- xlWorkSheet=(Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
- xlWorkSheet.Cells[1,1]="http://csharp.net-informations.com";
- xlWorkBook.SaveAs("csharp-Excel.xls",Excel.XlFileFormat.xlWorkbookNormal,misValue,misValue,misValue,misValue,Excel.XlSaveAsaccessMode.xlExclusive,misValue,misValue,misValue,misValue,misValue);
- xlWorkBook.Close(true,misValue,misValue);
- xlApp.Quit();
- releaSEObject(xlWorkSheet);
- releaseObject(xlWorkBook);
- releaseObject(xlApp);
- MessageBox.Show("Excelfilecreated,youcanfindthefilec://csharp-Excel.xls");
- }
- privatevoidreleaseObject(objectobj)
- {
- try
- {
- System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
- obj=null;
- }
- catch(Exceptionex)
- {
- obj=null;
- MessageBox.Show("ExceptionOccuredwhilereleasingobject"+ex.ToString());
- }
- finally
- {
- GC.Collect();
- }
- }
- }
- }
最后想寫一下關于如何設置字體的顏色, 以及單元格的背景顏色的事兒.
以背景色設置為紅色為例, 首先我們可以寫出形如下面這樣的代碼:
C#代碼