程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# API: 生成和讀取Excel文件

C# API: 生成和讀取Excel文件

編輯:C#入門知識

我們想為用戶提供一些數據,考慮再三, 大家認為對於用戶(人,而非機器)的可讀性, 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#代碼  收藏代碼
  1. using System;  
  2. using System.Windows.Forms;  
  3. using Excel = Microsoft.Office.Interop.Excel;   
  4.   
  5. namespace WindowsApplication1  
  6. {  
  7.     public partial class Form1 : Form  
  8.     {  
  9.         public Form1()  
  10.         {  
  11.             InitializeComponent();  
  12.         }  
  13.   
  14.         private void button1_Click(object sender, EventArgs e)  
  15.         {  
  16.             Excel.Application xlApp ;  
  17.             Excel.Workbook xlWorkBook ;  
  18.             Excel.Worksheet xlWorkSheet ;  
  19.             object misValue = System.Reflection.Missing.Value;  
  20.   
  21.             xlApp = new Excel.ApplicationClass();  
  22.             xlWorkBook = xlApp.Workbooks.Add(misValue);  
  23.   
  24.             xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);  
  25.             xlWorkSheet.Cells[1, 1] = "http://csharp.net-informations.com";  
  26.   
  27.             xlWorkBook.SaveAs("csharp-Excel.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);  
  28.             xlWorkBook.Close(true, misValue, misValue);  
  29.             xlApp.Quit();  
  30.   
  31.             releaseObject(xlWorkSheet);  
  32.             releaseObject(xlWorkBook);  
  33.             releaseObject(xlApp);  
  34.   
  35.             MessageBox.Show("Excel file created , you can find the file c:\\csharp-Excel.xls");  
  36.         }  
  37.   
  38.         private void releaseObject(object obj)  
  39.         {  
  40.             try  
  41.             {  
  42.                 System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);  
  43.                 obj = null;  
  44.             }  
  45.             catch (Exception ex)  
  46.             {  
  47.                 obj = null;  
  48.                 MessageBox.Show("Exception Occured while releasing object " + ex.ToString());  
  49.             }  
  50.             finally  
  51.             {  
  52.                 GC.Collect();  
  53.             }  
  54.         }  
  55.     }  
  56. }  

 

 

 

最後想寫一下關於如何設置字體的顏色, 以及單元格的背景顏色的事兒.

以背景色設置為紅色為例, 首先我們可以寫出形如下面這樣的代碼:

 

C#代碼  收藏代碼
  1. Excel.Range chartRange;  
  2. chartRange = xlWorkSheet.get_Range("a1", "e4");  
  3. chartRange.Interior.Color = 255;  

 

但是這個255很不好記, 比如青色對應的數字是16777164, 這個就更加不好理解.

所以我們可以改為這樣設置顏色, 使用ColorTranslator轉換一下:

C#代碼  收藏代碼
  1. chartRange.Interior.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red);  

 

最後還有一種設置方法是不對Color進行設置, 而是設置相應的ColorIndex, 形如下面這樣:

C#代碼  收藏代碼
  1. chartRange.Interior.ColorIndex = 3;  

 

ColorIndex的色表參考下面這兩個連接:

Color Palette and the 56 Excel ColorIndex Colors

Excel Color Palette and Color Index change using VBA

第一個連接特別詳細,

第二個連接則介紹了如何使用VBA在Excel文件中生成這些色表, 同時還提供了一個xls格式的色表文件下載.

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