第二篇博客:Microsoft.Office.Interop.Excel

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

原博位置https://www.cnblogs.com/gc2013/p/3804393.html

我们想为用户提供一些数据,考虑再三, 大家认为对于用户(人,而非机器)的可读性, 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#代码 收藏代码

using System;  
using System.Windows.Forms;  
using Excel = Microsoft.Office.Interop.Excel;   
  
namespace WindowsApplication1  
{  
    public partial class Form1 : Form  
    {  
        public Form1()  
        {  
            InitializeComponent();  
        }  
  
        private void button1_Click(object sender, EventArgs e)  
        {  
            Excel.Application xlApp ;  
            Excel.Workbook xlWorkBook ;  
            Excel.Worksheet xlWorkSheet ;  
            object misValue = System.Reflection.Missing.Value;  
  
            xlApp = new Excel.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("Excel file created , you can find the file c:\\csharp-Excel.xls");  
        }  
  
        private void releaseObject(object obj)  
        {  
            try  
            {  
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);  
                obj = null;  
            }  
            catch (Exception ex)  
            {  
                obj = null;  
                MessageBox.Show("Exception Occured while releasing object " + ex.ToString());  
            }  
            finally  
            {  
                GC.Collect();  
            }  
        }  
    }  
}  
 

 

最后想写一下关于如何设置字体的颜色, 以及单元格的背景颜色的事儿.

以背景色设置为红色为例, 首先我们可以写出形如下面这样的代码:

C#代码 收藏代码

Excel.Range chartRange;  
chartRange = xlWorkSheet.get_Range("a1", "e4");  
chartRange.Interior.Color = 255;  

但是这个255很不好记, 比如青色对应的数字是16777164, 这个就更加不好理解.

所以我们可以改为这样设置颜色, 使用ColorTranslator转换一下:

C#代码 收藏代码

chartRange.Interior.Color=System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red);  

最后还有一种设置方法是不对Color进行设置, 而是设置相应的ColorIndex, 形如下面这样:

C#代码 收藏代码

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值