第一步要先装 Openxml SDK 2.0, 然后引用DocumentFormat.Openxml.dll。
引用名称空间
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Spreadsheet;
using System.Linq;
Openxml 只能生成Office2007的文档,并且需要Linq。
关于Excel.xlsx:
office 2007的excel 实质是zip文件, 把扩展名改为.zip后,我们可以看到里面是一些xml 文件
excel的主要内容都在xl目录下,excel数据保存在sharedString.xml文件中,worksheets目录存放的是worksheet对应的文件。
有点时候我们生成的文件不能正常打开, 我们可以通过这个方式去对比和能打开的文件有啥区别,找到出错原因。
Openxml Excel 结构:
1.创建SpreadsheetDocument, 这个相当于excel文件级, SpreadsheetDocument.Create;
2. 创建WorkbookPart,在代码中主要使用这个相当于xml的root elements, spreadSheet.AddWorkbookPart(), 虽然是"Add"方法, 但你只能加一个。
3. 初始workbookpart
4. 创建WorksheetPart, 这个就是excel sheets的管理类了, 这个可以参加sdk的how to 里的方法
5. 创建SharedStringTablePart, 这个管理excel的内容, 不管你的数据是在那个excel worksheet里, cell里的值都是存在sharestringtable里的, 然后通过relationshipID进行关联。这里有有一点需要注意, sdk里没有提及。如果要创建多个worksheet, 那么一定要设置SharedStringTable 的Count 和UniqueCount 值。 否则创建多个worksheet, 生成的excel 在打开时会报错。
shareStringPart.SharedStringTable.Count = 1;
shareStringPart.SharedStringTable.UniqueCount = 1;
6. 写入cell值:
先把值写入sharestringtable,参加sdk里InsertSharedStringItem方法, 返回值对应的id。
然后利用sdk 提供的示例方法InsertCellInWorksheet, 创建一个新cell
最后把值和cell 做关联
每写一个cell 都要执行以下worksheetPart.Worksheet.Save();
7. 创建多个excel worksheet:
通过workbookPart.Workbook 获得 Sheets 集合元素
创建worksheetpart
创建Worksheet
通过workbookPart.GetIdOfPart获得新worksheetpart的relationID
通过relationID 创建新的sheet。
append 创建的sheet到sheets 合集里
执行worksheetPart.Worksheet.Save();
Asp.net 导出 Openxml excel
1. 添加System.IO名称空间引用
2. MemoryStream ms = new MemoryStream(); 用MemoryStream 代替常规的文件流
3. 创建 openxml的 excel 文件
4. 下载:
这里有一点要注意, 我原先用下面的方法:
byte[] buffer = ms.GetBuffer();
Response.OutputStream.Write(buffer, 0, buffer.Length);
这样是有问题的, 因为memorystring有两个长度, 一个是字节长度,另一个是占用空间长度, 因此用GetBuffer生成byte[] 是memory占用的空间的长度, 而不是内容的实际长度, 这样导致response出的文件, 不能正常打开。
我封装了一下Openxml,供大家下载共同学习/Files/skyfei/OpenXMLExcel.rar