您的位置:首页 > 其它

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

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

图形工具CodeGenerator

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





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

classProgram{
staticvoidMain(string[]args){
ExcelXmlWriter.Sample.Appapp=newExcelXmlWriter.Sample.App();
app.Generate(@"c:\test.xml");
}
}


.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

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

对象模型ObjectModel

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

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

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

ExcelXmlWorkbookbook=newExcelXmlWorkbook();
book.Properties.Author="YogeshJagota";
Worksheetsheet=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="Outstandingason"+DateTime.Now;

sheet[0,1].Value="NameofParty";
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/sStupidPaymaster";
sheet[1,2].Value="Mr.Nonsense";
sheet[2,2].Value="Mr.MoreNonsense";
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/sGoodPaymaster";
sheet[1,3].Value="Mr.GoodRSM";
sheet[2,3].Value="Mr.GoodASM";
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];

stringoutputFile="OutstandingFile.xml";
book.Export(outputFile);

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

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

导入导出Import/Export

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

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


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

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


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




访问单元格AccessCell

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


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


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

2使用
Worksheet对象


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

3使用Row对象


Worksheetsheet=book[0];
Rowrow=sheet[1];
row[3].Value=1

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

4使有Cell对象

Worksheetsheet=book[0];
Rowrow=sheet[1];
Cellcell=row[3];
cell.Value=1

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

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


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

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

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

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

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

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


.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

高级特性AdvancedFeature

设置列自动过滤

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


.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

给单元格设置求值公式

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

sheet[7,3].Value=newFormula().Add("sum").StartGroup().Add(newRange(sheet[3,3],sheet[6,3])).EndGroup();

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

Formulaformula=newFormula().Add("sum").StartGroup();
formula.Add("D4").Operator(',');

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

.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}

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

ExcelXmlWorksheetsheet=ExcelXmlWorksheet.DataSetToWorkbook(sourceDataSet)


资源地址

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

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

代码下载:http://www.carlosag.net/downloads/ExcelSamples.zip
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: