如何用MemoryStream生成双工作表Excel(无第三方库)
基于现有HTML转XLS方案实现多工作表Excel生成(无第三方库)
现有项目通过以下代码生成单工作表.xls文件(利用Excel兼容HTML表格的特性):
string contentType = "application/vnd.ms-excel; charset=utf-8"; string extension = "xls"; string fileName = "report-" + DateTime.Now.Ticks.ToString(); string contentDisposition = string.Format("attachment; filename={0}.{1}", fileName, extension); WebOperationContext.Current.OutgoingResponse.ContentType = contentType; WebOperationContext.Current.OutgoingResponse.Headers.Set("Content-Disposition", contentDisposition); // 业务逻辑:从数据库获取数据并转换为HTML字符串,最终赋值给result变量 byte[] preambles = serializer.PreferredEncoding.GetPreamble(); byte[] serializedResult = serializer.PreferredEncoding.GetBytes(result); byte[] resultBuffer = new byte[preambles.Length + serializedResult.Length]; // serializer为自定义类,本质使用System.Text.UTF8Encoding preambles.CopyTo(resultBuffer, 0); serializedResult.CopyTo(resultBuffer, preambles.Length); return new MemoryStream(resultBuffer);
原单表HTML示例:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="tr" lang="tr"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <table> <thead> <tr><th>Name Surname</th><th>0-5 (Min)</th><th>6-60 (Min)</th><th>> 60 (Min)</th><th>0-5 (%)</th><th>6-60 (%)</th><th>> 60 (%)</th><th>Sum</th></tr> </thead> <tbody> <tr><td>Joe</td><td>1</td><td>0</td><td>0</td><td>100</td><td>0</td><td>0</td><td>1</td></tr><tr><td>John</td><td>0</td><td>0</td><td>1</td><td>0</td><td>0</td><td>100</td><td>1</td></tr> </tbody> </table> </body> </html>
实现双工作表的修改方案
无需修改现有C#代码框架,仅需调整生成的HTML结构,利用Excel支持的特定HTML命名空间标记来定义多工作表:
1. 多工作表HTML模板示例
<html xmlns:x="urn:schemas-microsoft-com:office:excel"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <!-- 隐藏HTML页面的默认样式,仅让Excel识别 --> <style> table {display:none;} </style> </head> <body> <!-- Excel工作簿容器 --> <x:Workbook> <!-- 第一个工作表:命名为"人员统计" --> <x:Worksheet Name="人员统计"> <x:Table> <thead> <tr><th>Name Surname</th><th>0-5 (Min)</th><th>6-60 (Min)</th><th>> 60 (Min)</th><th>0-5 (%)</th><th>6-60 (%)</th><th>> 60 (%)</th><th>Sum</th></tr> </thead> <tbody> <tr><td>Joe</td><td>1</td><td>0</td><td>0</td><td>100</td><td>0</td><td>0</td><td>1</td></tr> <tr><td>John</td><td>0</td><td>0</td><td>1</td><td>0</td><td>0</td><td>100</td><td>1</td></tr> </tbody> </x:Table> </x:Worksheet> <!-- 第二个工作表:命名为"汇总数据" --> <x:Worksheet Name="汇总数据"> <x:Table> <thead> <tr><th>统计项</th><th>数值</th></tr> </thead> <tbody> <tr><td>总人数</td><td>2</td></tr> <tr><td>超时人数</td><td>1</td></tr> </tbody> </x:Table> </x:Worksheet> </x:Workbook> <!-- 可选:保留普通HTML表格,用于浏览器预览(Excel会优先识别x:Workbook标记) --> <table> <caption>人员统计预览</caption> <!-- 内容同第一个工作表 --> </table> </body> </html>
2. 关键修改点说明
- 引入Excel专属命名空间
xmlns:x="urn:schemas-microsoft-com:office:excel",让Excel识别多工作表结构 - 用
<x:Workbook>包裹所有工作表,每个工作表用<x:Worksheet Name="表名">定义,内部用<x:Table>承载表格数据 - 添加CSS隐藏普通HTML表格(可选,避免浏览器打开时显示冗余内容,Excel会忽略此样式并优先解析x:标记)
- 现有C#代码无需修改,仅需将业务逻辑生成的HTML替换为上述多工作表结构即可
3. 注意事项
- 该方案仅兼容旧版.xls格式(Excel 97-2003),若需.xlsx则无法用此方法
- 工作表名称不能包含特殊字符(如/:*?"<>|),需提前处理
- 复杂格式(如单元格合并、公式)需用对应的Excel HTML标记实现
内容的提问来源于stack exchange,提问作者RaZzLe
相关产品推荐
相关产品推荐

