第一步要先装 Openxml SDK 2.0, 然后引用DocumentFormat.Openxml.dll。
引用名称空间
using DocumentFormat.OpenXml.Packaging; 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
Code spreadSheet = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook); WorkbookPart workbookPart = spreadSheet.AddWorkbookPart(); workbookPart.Workbook = new Workbook();
4. 创建WorksheetPart, 这个就是excel sheets的管理类了, 这个可以参加sdk的how to 里的方法
5. 创建SharedStringTablePart, 这个管理excel的内容, 不管你的数据是在那个excel worksheet里, cell里的值都是存在sharestringtable里的, 然后通过relationshipID进行关联。这里有有一点需要注意, sdk里没有提及。如果要创建多个worksheet, 那么一定要设置SharedStringTable 的Count 和UniqueCount 值。 否则创建多个worksheet, 生成的excel 在打开时会报错。
shareStringPart.SharedStringTable = new SharedStringTable(); shareStringPart.SharedStringTable.Count = 1 ; shareStringPart.SharedStringTable.UniqueCount = 1 ;6. 写入cell值:
先把值写入sharestringtable,参加sdk里InsertSharedStringItem方法, 返回值对应的id。
然后利用sdk 提供的示例方法InsertCellInWorksheet, 创建一个新cell
最后把值和cell 做关联
Code int index = InsertSharedStringItem(text, shareStringPart); Cell cell = InsertCellInWorksheet(name, Convert.ToUInt32(i + startx), worksheetPart); cell.CellValue = new CellValue(index.ToString()); cell.DataType = new EnumValue<CellValues>(CellValues.SharedString); worksheetPart.Worksheet.Save();每写一个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. 下载:
Code Response.Clear(); Response.ClearHeaders(); Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8"); Response.ContentType = "application/vnd.ms-excel.sheet.binary.macroEnabled.12"; Response.AddHeader("Content-Disposition", "attachment; filename=DataView.xlsx"); ms.Position = 0; byte[] buffer = new byte[4096]; int i = 0; long length = 0; while (length < ms.Length) { i = ms.Read(buffer, 0, 4096); Response.OutputStream.Write(buffer, 0, i); length += i; }; ms.Dispose(); Response.Flush(); Response.End();
这里有一点要注意, 我原先用下面的方法:
byte[] buffer = ms.GetBuffer();
Response.OutputStream.Write(buffer, 0, buffer.Length);
这样是有问题的, 因为memorystring有两个长度, 一个是字节长度,另一个是占用空间长度, 因此用GetBuffer生成byte[] 是memory占用的空间的长度, 而不是内容的实际长度, 这样导致response出的文件, 不能正常打开。
我封装了一下Openxml,供大家下载共同学习/Files/skyfei/OpenXMLExcel.rar
转载于:https://www.cnblogs.com/skyfei/archive/2009/06/12/Openxml.html
相关资源:asp.net 利用word模板导出word文件