You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:24:17