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


    我们想为用户提供一些数据,考虑再三, 大家认为对于用户(人,而非机器)的可读性, Excel文件要好一些.

    因为相比csv,xml等文件, Excel中我们可以运用自动筛选, 窗口锁定, 还可以控制背景颜色, 前景颜色, 字体, 网格等等...

    业务逻辑并不复杂, 文件的内容和格式也比较固定,所以大家决定直接拿C#去创建这些文件.

    于是一搜索,首先来到了这个链接:C# Excel Tutorial

    里面包含了下面这些主题的代码示例, 示例很详细, 编译可直接运行.

    为了理解上面这些代码需要理解一下Excel的对象模型, 可以参考msdn的下面这个链接

    Excel Object Model Overview

    里面介绍了4个核心对象:

    前三个对象比较好理解, 关键在于第四个对象: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格式的色表文件下载.

  • 相关阅读:
    UART和RS232/RS485的关系是什么?
    Async & Await 的前世今生
    asp.net EFcore配置链接sqlserver
    ASP.NET Core启动流程
    ASP.NET Core 过滤器
    Nginx简介及配置文件详解
    3.ASP.NET Core Docker学习-构建单机多容器环境
    2.ASP.NET Core Docker学习-镜像容器与仓库
    asp.net core 依赖注入
    1.ASP.NET Core Docker学习-Docker介绍与目录
  • 原文地址:https://www.cnblogs.com/gc2013/p/3804393.html
Copyright © 2020-2023  润新知