开源免费类库在.net中操作Excel
自从上次找到NPOI之后,根据园友提供的线索以及Google,又找到了一些开源免费的类库,所以都简单体验了一遍。
主要找到以下类库:
MyXls( http://sourceforge.net/projects/myxls/ ) Koogra( http://sourceforge.net/projects/koogra/ ) ExcelLibrary( http://code.google.com/p/excellibrary/ ) ExcelPackage( http://excelpackage.codeplex.com/ ) EPPlus( http://epplus.codeplex.com/ ) LinqToExcel( http://code.google.com/p/linqtoexcel/ ) NetOffice( http://netoffice.codeplex.com/ ) 需安装Office Excel从1-6的类库均不需要安装Office,不使用Office COM组件;而NetOffice需要安装Office,它提供的是与Office COM组件差不多的功能。
注:本文仅简单演示读取与创建Excel。
准备测试代码
首先,为这些类库准备一些测试代码,用于之后的测试。
aspx主要代码如下:
1 < asp:FileUpload ID = "FileUpload1" runat = "server" />
2 < asp:Button ID = "Button1" runat = "server" Text = "上传Excel"
3 onclick = "Button1_Click" />
4 < asp:Button ID = "Button2" runat = "server" Text = "下载Excel"
5 onclick = "Button2_Click" />
6 < asp:GridView ID = "GridView2" runat = "server" >
7 </ asp:GridView >
aspx.cs主要代码如下:
01 private void RenderToBrowser(MemoryStream ms, string fileName)
02 {
03 if (Request.Browser.Browser == "IE" )
04 fileName = HttpUtility.UrlEncode(fileName);
05 Response.AddHeader( "Content-Disposition" , "attachment;fileName=" + fileName);
06 Response.BinaryWrite(ms.ToArray());
07 }
08
09 protected void Button1_Click( object sender, EventArgs e)
10 {
11 if (FileUpload1.HasFile)
12 { //读取上传的文件绑定到GridView
13 GridView1.DataSource = ReadByXXX(FileUpload1.FileContent);
14 GridView1.DataBind();
15 }
16 }
17
18 protected void Button2_Click( object sender, EventArgs e)
19 {
20 DataTable table = new DataTable();
21 table.Columns.Add( "aa" , typeof ( string ));
22 table.Columns.Add( "bb" , typeof ( string ));
23 table.Columns.Add( "cc" , typeof ( string ));
24 for ( int i = 0; i < 10; i++)
25 {
26 string a = DateTime.Now.Ticks.ToString();
27 Thread.Sleep(1);
28 string b = DateTime.Now.Ticks.ToString();
29 Thread.Sleep(1);
30 string c = DateTime.Now.Ticks.ToString();
31 Thread.Sleep(1);
32 table.Rows.Add(a, b, c);
33 }
34 //从DataTable创建Excel并下载
35 RenderToBrowser(CreateByXXX(table), "test.xls" );
36 }
MyXls
MyXls支持Office Excel 97-2003格式(Biff8格式),但目前并 不支持formula 即公式; 网上流传的支持2007是错误的说法 。
使用它还需要注意的是,它与Office PIA一样, 索引号是从1开始 的。
另外不得不说的是,它的构造函数、Save方法、属性中的FileName让人看的眼花瞭乱,无所适从呐-_-。
主要使用的类型都位于 org.in2bits.MyXls 空间下,主要测试代码如下:
01 MemoryStream CreateByMyXls(DataTable table)
02 {
03 XlsDocument doc = new XlsDocument();
04 Worksheet sheet = doc.Workbook.Worksheets.Add( "Sheet1" );
05 int colCount = table.Columns.Count;
06 for ( int i = 1; i <= colCount; i++)
07 {
08 sheet.Cells.Add(1, i, table.Columns[i - 1].Caption);
09 }
10
11 int k = 2;
12 foreach (DataRow row in table.Rows)
13 {
14 for ( int i = 1; i <= colCount; i++)
15 {
16 sheet.Cells.Add(k, i, row[i - 1]);
17 }
18 k++;
19 }
20 MemoryStream ms = new MemoryStream();
21 doc.Save(ms);
22 return ms;
23 }
24
25 DataTable ReadByMyXls(Stream xlsStream)
26 {
27 XlsDocument doc = new XlsDocument(xlsStream);
28 DataTable table = new DataTable();
29 Worksheet sheet = doc.Workbook.Worksheets[0];
30 int colCount = sheet.Rows[1].CellCount;
31 int rowCount = sheet.Rows.Count;
32
33
34 for ( ushort j = 1; j <= colCount; j++)
35 {
36 table.Columns.Add( new DataColumn(sheet.Rows[1].GetCell(j).Value.ToString()));
37 }
38
39 for ( ushort i = 2; i < rowCount; i++)
40 {
41 DataRow row = table.NewRow();
42 for ( ushort j = 1; j <= colCount; j++)
43 {
44 row[j - 1] = sheet.Rows[i].GetCell(j).Value;
45 }
46 table.Rows.Add(row);
47 }
48
49 return table;
50 }
Koogra
Koogra支持Office 97-2003(Biff8)以及Office 2007以上(Xlsx)格式,但它仅提供读取功能,没有相关的创建Excel功能;另需要注意它的 索引号又是从0开始 的。
我在几台机器上测试不太稳定,即有的机器直接不能运行,没有深究什么问题。
操作xls格式的类型主要位于 Net.SourceForge.Koogra.Excel 空间,主要测试代码如下:
01 public static DataTable ReadByKoogra(Stream xlsStream)
02 {
03 DataTable table = new DataTable();
04 Workbook book = new Workbook(xlsStream);
05 Worksheet sheet = book.Sheets[0];
06
07 Row headerRow = sheet.Rows[0];
08 uint colCount = headerRow.Cells.MaxCol;
09 uint rowCount = sheet.Rows.MaxRow;
10 Row tempr = null ;
11 Cell tempc = null ;
12
13 for ( ushort j = 0; j <= colCount; j++)
14 {
15 tempc = headerRow.Cells[j];
16 if (tempc != null )
17 table.Columns.Add( new DataColumn((tempc.Value ?? string .Empty).ToString()));
18 }
19
20 for ( ushort i = 0; i <= rowCount; i++)
21 {
22 DataRow row = table.NewRow();
23 tempr = sheet.Rows[i];
24
25 for ( ushort j = 0; j <= colCount; j++)
26 {
27 tempc = tempr.Cells[j];
28 if (tempc != null )
29 row[j] = tempc.Value;
30 }
31 table.Rows.Add(row);
32 }
33
34 return table;
35 }
操作XLSX格式的类型主要位于 Net.SourceForge.Koogra.Excel2007 空间,主要测试代码如下:
01 public static DataTable ReadByKoogra(Stream xlsStream)
02 {
03 DataTable table = new DataTable();
04 Workbook book = new Workbook(xlsStream);
05 Worksheet sheet = book.GetWorksheet(0);
06
07 Row headerRow = sheet.GetRow(0);
08 uint colCount = sheet.CellMap.LastCol;
09 uint rowCount = sheet.CellMap.LastRow;
10 Row tempr = null ;
11 ICell tempc = null ;
12
13 for ( ushort j = 0; j <= colCount; j++)
14 {
15 tempc = headerRow.GetCell(j);
16 if (tempc != null )
17 table.Columns.Add( new DataColumn((tempc.Value ?? string .Empty).ToString()));
18 }
19
20 for ( ushort i = 0; i <= rowCount; i++)
21 {
22 DataRow row = table.NewRow();
23 tempr = sheet.GetRow(i);
24
25 for ( ushort j = 0; j <= colCount; j++)
26 {
27 tempc = tempr.GetCell(j);
28 if (tempc != null )
29 row[j] = tempc.Value;
30 }
31 table.Rows.Add(row);
32 }
33
34 return table;
35 }
ExcelLibrary
听说这是国人开发的,目前支持97-2003(biff8)格式,未来可能会支持xlsx格式。它使用二维数组的方式来操作,这种方式比较接近Office PIA,另外,它的 索引号是从0开始 的。
在测试时,创建出的Excel有时内容是空的,可能存在bug。
它提供了一个DataSetHelper的工具类,用于从DataTable/DataSet和WorkBook之间的转换,但这个工具类不支持对流的操作,所以还是自己写测试代码(ExcelLibrary空间):
01 MemoryStream CreateByExcelLibrary(DataTable table)
02 {
03 Workbook book = new Workbook();
04 Worksheet sheet = new Worksheet( "Sheet123" );
05
06 int colCount = table.Columns.Count;
07 for ( int i = 0; i < colCount; i++)
08 {
09 sheet.Cells[0, i] = new Cell(table.Columns[i].Caption);
10 }
11
12 int k = 1;
13 foreach (DataRow row in table.Rows)
14 {
15 for ( int i = 0; i < colCount; i++)
16 {
17 sheet.Cells[k, i] = new Cell(row[i]);
18 }
19 k++;
20 }
21 book.Worksheets.Add(sheet);
22 MemoryStream ms = new MemoryStream();
23 book.Save(ms);
24 return ms;
25 }
26
27 DataTable ReadByExcelLibrary(Stream xlsStream)
28 {
29 DataTable table = new DataTable();
30 Workbook book = Workbook.Load(xlsStream);
31 Worksheet sheet = book.Worksheets[0];
32
33 int colCount = sheet.Cells.LastColIndex;
34 int rowCount = sheet.Cells.LastRowIndex;
35
36 for ( ushort j = 0; j <= colCount; j++)
37 {
38 table.Columns.Add( new DataColumn(sheet.Cells[0, j].StringValue));
39 }
40
41 for ( ushort i = 1; i <= rowCount; i++)
42 {
43 DataRow row = table.NewRow();
44 for ( ushort j = 0; j <= colCount; j++)
45 {
46 row[j] = sheet.Cells[i, j].Value;
47 }
48 table.Rows.Add(row);
49 }
50
51 return table;
52 }
ExcelPackage与EPPlus
ExcelPackage它主要支持OOXML即Office Open XML标准,Office 2007以上XLSX格式的读写;但它不支持对流的操作,仅支持对实体文件的操作。
EPPlus 全称应该是ExcelPackage Plus,即ExcelPackage的增强版,它在ExcelPackage的基础上,增强了许多功能包括对流、Linq的支持,可以说相当不错。
它的 索引号是从1开始 的,主要使用的类型位于OfficeOpenXml空间,具体测试代码如下:
01 MemoryStream CreateByExcelLibrary(DataTable table)
02 {
03 using (ExcelPackage package = new ExcelPackage())
04 {
05 ExcelWorksheet sheet = package.Workbook.Worksheets.Add( "sheet111" );
06
07 int colCount = table.Columns.Count;
08 for ( int i = 0; i < colCount; i++)
09 {
10 sheet.Cells[1, i + 1].Value = table.Columns[i].Caption;
11 }
12
13 int k = 2;
14 foreach (DataRow row in table.Rows)
15 {
16 for ( int i = 0; i < colCount; i++)
17 {
18 sheet.Cells[k, i + 1].Value = row[i];
19 }
20 k++;
21 }
22
23 MemoryStream ms = new MemoryStream();
24 package.SaveAs(ms);
25 return ms;
26 }
27 }
28
29 DataTable ReadByExcelLibrary(Stream xlsStream)
30 {
31 DataTable table = new DataTable();
32 using (ExcelPackage package = new ExcelPackage(xlsStream))
33 {
34 ExcelWorksheet sheet = package.Workbook.Worksheets[1];
35
36 int colCount = sheet.Dimension.End.Column;
37 int rowCount = sheet.Dimension.End.Row;
38
39 for ( ushort j = 1; j <= colCount; j++)
40 {
41 table.Columns.Add( new DataColumn(sheet.Cells[1, j].Value.ToString()));
42 }
43
44 for ( ushort i = 2; i <= rowCount; i++)
45 {
46 DataRow row = table.NewRow();
47 for ( ushort j = 1; j <= colCount; j++)
48 {
49 row[j - 1] = sheet.Cells[i, j].Value;
50 }
51 table.Rows.Add(row);
52 }
53 }
54
55 return table;
56 }
LinqToExcel,NetOffice…
至于LinqToExcel,只能说是颗糖而已,不支持对流的操作,实在是无爱啊,不多说。
NetOffice提供与Office PIA相似的功能,又需要安装Office,实在不适合在web场景中使用,所以也不多说。
结尾
对于Excel 97-2003格式,还是用NPOI最好,API设计比较好(上面这些类库又是0又是1的索引号和二维数组实在让人好晕);而对于2007(xlsx)以上版本,可以使用EPPlus;这样基本所有的Excel格式通吃了。
当然这只是免费的方案,对于不缺大洋的,用Apose.Cell等强大的商业解决方案又是另一回事了。
另,由于各个类库容量较大,就不提供下载了,若要测试请自行下载类库复制代码~_~。
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于开源免费类库在.net中操作Excel的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did50198