实用的开放源码的Excel导入导出类库 CarlosAg ExcelXmlWriter

做企业管理软件经常会遇到要把数据导出成EXCEL格式,目前市面上有很多工具类库可以实现此功能。CarlosAg ExcelXmlWriter是其中之一,它绿色小巧,免安装,又源码开放,我在项目中一直以这个类库来实现对EXCEL文件操作。

图形工具 Code Generator

因Excel涉及到的对象模型比较多,初步了解时,需要查找资料才能入门。为此作者设计了一个GUI程序,CarlosAg.ExcelXmlWriter.Generator.exe,使用它可以根据Excel文件的内容,生成.NET平台上4种语言的代码。

image

写一个控制台程序,调用上面的代码,如下所示

 class Program {
        static void Main(string[] args) {
            ExcelXmlWriter.Sample.App app = new ExcelXmlWriter.Sample.App();
            app.Generate(@"c:\test.xml");
        }
    } 
 

这个例子具备典型的意义,即使是经常使用它的开发人员,也会经常忘记需要调用的类型名称和属性。生手可以借助这个工具入门,熟练之后,仍然可以借助于这个工具,生成原型。

 

对象模型 Object Model

与Office Interop建立的对象模型相似,它主要由以下几个类型组成:

ExcelXmlWorkbook代表一个Excel文件,它下面有多个Worksheet,Worksheet中有Row代表行,Cell代表Excel单元格。
Range对象则表示一个或多个单元格,可以设置单元格的公式Formula。

请参考下面的代码,以加深对对象模型的了解。

ExcelXmlWorkbook book = new ExcelXmlWorkbook();
book.Properties.Author = "Yogesh Jagota"; 
Worksheet sheet = book[0];
sheet.Name = "AgewiseOutstanding";
sheet.FreezeTopRows = 3;

sheet.PrintOptions.Orientation = PageOrientation.Landscape;
sheet.PrintOptions.SetMargins(0.5, 0.4, 0.5, 0.4);

sheet[0, 0].Value = "Outstanding as on " + DateTime.Now;

sheet[0, 1].Value = "Name of Party";
sheet[1, 1].Value = "RSM";
sheet[2, 1].Value = "ASM";
sheet[3, 1].Value = "0-30";
sheet[4, 1].Value = "31-60";
sheet[5, 1].Value = "61-90";
sheet[6, 1].Value = "91+";

sheet[0, 2].Value = "M/s Stupid Paymaster";
sheet[1, 2].Value = "Mr. Nonsense";
sheet[2, 2].Value = "Mr. More Nonsense";
sheet[3, 2].Value = 0;
sheet[4, 2].Value = 5000;
sheet[5, 2].Value = 45000;
sheet[6, 2].Value = 0;

sheet[0, 3].Value = "M/s Good Paymaster";
sheet[1, 3].Value = "Mr. Good RSM";
sheet[2, 3].Value = "Mr. Good ASM";
sheet[3, 3].Value = 32000;
sheet[4, 3].Value = 0;
sheet[5, 3].Value = 0;
sheet[6, 3].Value = 0;
sheet[7, 3].Value = sheet[6, 3];

string outputFile = "Outstanding File.xml";
book.Export(outputFile);

在上面的例子中,可以引用一个单元格的值来设置另一个单元格的值。注意索引的下标依照C#的标准,从零开始。

 

导入导出 Import/Export

导入:ExcelXmlWorkbook的Import方法,接受一个字符串或是流,返回一个ExcelXmlWorkbook对象,表示内存的Excel对象模型。导入失败时,返回null空对象。

导出:ExcelXmlWorkbook的Export方法,接受一个字符串或是流,将当前的Excel对象写入到Excel文件中。

导出导出都涉及两个重载方法,推荐用Stream参数类型的方法,以便对导入导出错误有更多的了解。

这里也学到一个经验,包括微软和其它的第三方组件供应商遇到文件读写时,一般都会提供如上面所示的两个重载方法。

string类型的,用于直接访问磁盘文件,Stream类型的用于访问已经读取到内存流中的文件,或是资源。比如,我经常将资源嵌入到程序集中再通过读取嵌入的资源达到访问文件的目的。这种情况下,没有办法直接访问磁盘文件。

 

访问单元格 Access Cell

有以下四种方式对单元的内容进行读写

1  使用ExcelXmlWorkbook对象,下面的代码取第一个Worksheet,设置它的第四行,第二列的值是1

book[0][3, 1].Value = 1
 

2   使用Worksheet对象

Worksheet sheet = book[0];
sheet[3, 1].Value = 1
 

3   使用 Row对象

Worksheet sheet = book[0];
Row row = sheet[1];
row[3].Value = 1

4    使有Cell对象

Worksheet sheet = book[0];
Row row = sheet[1];
Cell cell = row[3];
cell.Value = 1

除数据之外,你还可以对单元的其它属性赋值,比如设置Font, Alignment, Interior, Border, 和DisplayFormat。

sheet[1, 3].Font.Bold = true;
 

如果同时要给多个单元格设置一样的属性,则可以考虑创建一个XmlStyle对象,如下面的代码所示

XmlStyle style = new XmlStyle();
style.Font.Bold = true;
sheet[1, 3].Style = style;

访问多个单元格,可以用Range对象,参考下面的代码

Range range = new Range(sheet[0, 2], sheet[7, 2]);
range.Font.Bold = true;

高级特性 Advanced Feature

设置列自动过滤

new Range(sheet[0, 1], sheet[6, 3]).AutoFilter();

给单元格设置求值公式

sheet[7, 3].Value = FormulaHelper.Formula("sum", new Range(sheet[3, 3], sheet[6, 3]));

sheet[7, 3].Value = new Formula().Add("sum").StartGroup().Add(new Range(sheet[3, 3], sheet[6, 3])).EndGroup();

应用公式是地,添加多个参数,下面的代码相当于Excel公式=SUM(D4, $E$4, F4:G4).

Formula formula = new Formula().Add("sum").StartGroup();
formula.Add("D4").Operator(',');

formula.Add(new Range(sheet[4, 3]) { Absolute = true } ).Operator(',');
formula.Add(new Range(sheet[5, 3], Range(sheet[6, 3])).EndGroup();
sheet[7, 3].Value = formula;

 

DataSet/DataTable直接转化为ExcelXmlWorksheet ,DataSet中的每一个Table被转化为一个Worksheet。

ExcelXmlWorksheet sheet = ExcelXmlWorksheet.DataSetToWorkbook(sourceDataSet)

 

资源地址

GUI工具的下载地址  http://www.carlosag.net/Tools/ExcelXmlWriter/Generator

程序集和源代码下载地址 http://www.carlosag.net/Tools/ExcelXmlWriter/

代码下载: http://www.carlosag.net/downloads/ExcelSamples.zip

posted @ 2013-07-08 19:06  信息化建设  阅读(2900)  评论(0编辑  收藏  举报