OpenXML: Asp.net利用OpenXML 导出Excel.

it2022-05-09  16

第一步要先装 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, 04096);                    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文件

最新回复(0)