效果图:

前台调用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using ExportCells; namespace WebApplication1
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
/***********************参数赋值***********************/ //设置列
List<ExportCells.AsposeHelper.JqxTableColumns> columns = new List<ExportCells.AsposeHelper.JqxTableColumns>();
columns.Add(new ExportCells.AsposeHelper.JqxTableColumns() { text = "id" });
columns.Add(new ExportCells.AsposeHelper.JqxTableColumns() { text = "name", columngroup = "namesex" });
columns.Add(new ExportCells.AsposeHelper.JqxTableColumns() { text = "sex", columngroup = "namesex" });
columns.Add(new ExportCells.AsposeHelper.JqxTableColumns() { text = "id2" });
columns.Add(new ExportCells.AsposeHelper.JqxTableColumns() { text = "cat", columngroup = "Animal" });
columns.Add(new ExportCells.AsposeHelper.JqxTableColumns() { text = "dog", columngroup = "Animal" });
columns.Add(new ExportCells.AsposeHelper.JqxTableColumns() { text = "rabbit", columngroup = "Animal" });
columns.Add(new ExportCells.AsposeHelper.JqxTableColumns() { text = "id3" }); //设置分组
List<ExportCells.AsposeHelper.JqxTableColumnsGroup> group = new List<ExportCells.AsposeHelper.JqxTableColumnsGroup>();
group.Add(new ExportCells.AsposeHelper.JqxTableColumnsGroup() { name = "Animal", text = "动物" });
group.Add(new ExportCells.AsposeHelper.JqxTableColumnsGroup() { name = "namesex", text = "名字性别" }); //设置数据
DataTable dt = new DataTable();
dt.Columns.Add("id");
dt.Columns.Add("name");
dt.Columns.Add("sex");
dt.Columns.Add("id2");
dt.Columns.Add("cat");
dt.Columns.Add("dog");
dt.Columns.Add("rabbit");
dt.Columns.Add("id3");
var dr = dt.NewRow();
dr[0] = 0;
dr[1] = 1;
dr[2] = 2;
dr[3] = 3;
dr[4] = 4;
dr[5] = 5;
dr[6] = 6;
dr[7] = 7;
dt.Rows.Add(dr);
var dr2 = dt.NewRow();
dr2[0] = 10;
dr2[1] = 11;
dr2[2] = 12;
dr2[3] = 13;
dr2[4] = 14;
dr2[5] = 15;
dr2[6] = 16;
dr2[7] = 17;
dt.Rows.Add(dr2); AsposeHelper.SaveColumnsHierarchy("1.xls", columns, group, dt);
}
}
}

  

ASPOSE封装类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Aspose.Cells;
using System.Data;
using System.Drawing;
using System.Web; namespace ExportCells
{
/// <summary>
/// ** 描述:Aspose
/// ** 创始时间:2015-9-10
/// ** 修改时间:-
/// ** 修改人:sunkaixuan
/// ** 使用说明:
/// </summary>
public class AsposeHelper
{
/// <summary>
/// 导出EXCEL并且动态生成多级表头
/// </summary>
/// <param name="columns">列</param>
/// <param name="group">分组</param>
/// <param name="dt">dataTable</param>
/// <param name="path">保存路径</param>
public static void SaveColumnsHierarchy(List<JqxTableColumns> columns, List<JqxTableColumnsGroup> group, DataTable dt, string path)
{ Workbook workbook = new Workbook(); //工作簿
Worksheet sheet = workbook.Worksheets[0]; //工作表
Cells cells = sheet.Cells;//单元格
for (int i = 0; i <= dt.Rows.Count + 1; i++)
{
sheet.Cells.SetRowHeight(i, 30);
}
List<AsposeCellInfo> acList = new List<AsposeCellInfo>();
List<string> acColumngroupHistoryList = new List<string>();
int currentX = 0;
foreach (var it in columns)
{
AsposeCellInfo ac = new AsposeCellInfo();
ac.y = 0;
if (it.columngroup == null)
{
ac.text = it.text;
ac.x = currentX;
ac.xCount = 1;
acList.Add(ac);
currentX++;
ac.yCount = 2;
}
else if (!acColumngroupHistoryList.Contains(it.columngroup))//防止重复
{
var sameCount = columns.Where(itit => itit.columngroup == it.columngroup).Count();
ac.text = group.First(itit => itit.name == it.columngroup).text;
ac.x = currentX;
ac.xCount = sameCount;
acList.Add(ac);
currentX = currentX + sameCount;
acColumngroupHistoryList.Add(it.columngroup);
ac.yCount = 1;
ac.groupName = it.columngroup;
}
else
{
//暂无逻辑
}
}
//表头
foreach (var it in acList)
{
cells.Merge(it.y, it.x, it.yCount, it.xCount);//合并单元格
cells[it.y, it.x].PutValue(it.text);//填写内容
cells[it.y, it.x].SetStyle(_thStyle);
if (!string.IsNullOrEmpty(it.groupName))
{
var cols = columns.Where(itit => itit.columngroup == it.groupName).ToList();
foreach (var itit in cols)
{
var colsIndex = cols.IndexOf(itit);
cells[it.y + 1, it.x + colsIndex].PutValue(itit.text);//填写内容
cells[it.y + 1, it.x + colsIndex].SetStyle(_thStyle);
}
}
}
//表格
if (dt != null && dt.Rows.Count > 0)
{
var rowList = dt.AsEnumerable().ToList();
foreach (var it in rowList)
{
int dtIndex = rowList.IndexOf(it);
var dtColumns = dt.Columns.Cast<DataColumn>().ToList();
foreach (var itit in dtColumns)
{
var dtColumnsIndex = dtColumns.IndexOf(itit);
cells[2 + dtIndex, dtColumnsIndex].PutValue(it[dtColumnsIndex]);
cells[2 + dtIndex, dtColumnsIndex].SetStyle(_tdStyle); }
}
}
workbook.Save(path);
} /// <summary>
/// 导出EXCEL并且动态生成多级表头
/// </summary>
/// <param name="columns">列</param>
/// <param name="group">分组</param>
/// <param name="dt">dataTable</param>
/// <param name="path">保存路径</param>
public static void SaveColumnsHierarchy(string fileName,List<JqxTableColumns> columns, List<JqxTableColumnsGroup> group, DataTable dt)
{ Workbook workbook = new Workbook(); //工作簿
Worksheet sheet = workbook.Worksheets[0]; //工作表
Cells cells = sheet.Cells;//单元格
for (int i = 0; i <= dt.Rows.Count + 1; i++)
{
sheet.Cells.SetRowHeight(i, 30);
}
List<AsposeCellInfo> acList = new List<AsposeCellInfo>();
List<string> acColumngroupHistoryList = new List<string>();
int currentX = 0;
foreach (var it in columns)
{
AsposeCellInfo ac = new AsposeCellInfo();
ac.y = 0;
if (it.columngroup == null)
{
ac.text = it.text;
ac.x = currentX;
ac.xCount = 1;
acList.Add(ac);
currentX++;
ac.yCount = 2;
}
else if (!acColumngroupHistoryList.Contains(it.columngroup))//防止重复
{
var sameCount = columns.Where(itit => itit.columngroup == it.columngroup).Count();
ac.text = group.First(itit => itit.name == it.columngroup).text;
ac.x = currentX;
ac.xCount = sameCount;
acList.Add(ac);
currentX = currentX + sameCount;
acColumngroupHistoryList.Add(it.columngroup);
ac.yCount = 1;
ac.groupName = it.columngroup;
}
else
{
//暂无逻辑
}
}
//表头
foreach (var it in acList)
{
cells.Merge(it.y, it.x, it.yCount, it.xCount);//合并单元格
cells[it.y, it.x].PutValue(it.text);//填写内容
cells[it.y, it.x].SetStyle(_thStyle);
if (!string.IsNullOrEmpty(it.groupName))
{
var cols = columns.Where(itit => itit.columngroup == it.groupName).ToList();
foreach (var itit in cols)
{
var colsIndex = cols.IndexOf(itit);
cells[it.y + 1, it.x + colsIndex].PutValue(itit.text);//填写内容
cells[it.y + 1, it.x + colsIndex].SetStyle(_thStyle);
}
}
}
//表格
if (dt != null && dt.Rows.Count > 0)
{
var rowList = dt.AsEnumerable().ToList();
foreach (var it in rowList)
{
int dtIndex = rowList.IndexOf(it);
var dtColumns = dt.Columns.Cast<DataColumn>().ToList();
foreach (var itit in dtColumns)
{
var dtColumnsIndex = dtColumns.IndexOf(itit);
cells[2 + dtIndex, dtColumnsIndex].PutValue(it[dtColumnsIndex]);
cells[2 + dtIndex, dtColumnsIndex].SetStyle(_tdStyle); }
}
}
var response = HttpContext.Current.Response;
response.Clear();
response.Buffer = true;
response.Charset = "utf-8";
response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName);
response.ContentEncoding = System.Text.Encoding.UTF8;
response.ContentType = "application/ms-excel";
response.BinaryWrite(workbook.SaveToStream().ToArray());
response.End();
} private static Style _thStyle
{
get
{
Style s = new Style();
s.Font.IsBold = true;
s.Font.Name = "宋体";
s.Font.Color = Color.Black;
s.HorizontalAlignment = TextAlignmentType.Center; //标题居中对齐
return s;
}
} private static Style _tdStyle
{
get
{
Style s = new Style();
return s;
}
} public class JqxTableColumns
{
public string field { get; set; }
public string cellsAlign { get; set; }
public string align { get; set; }
public string text { get; set; }
public string columngroup { get; set; }
} public class JqxTableColumnsGroup
{
public string text { get; set; }
public string align { get; set; }
public string name { get; set; }
} public class AsposeCellInfo
{
public string text { get; set; }
public int x { get; set; }
public int xCount { get; set; }
public int y { get; set; }
public int yCount { get; set; }
public string groupName { get; set; }
}
}
}

  

使用aspose.cell动态导出多表头 EXCEL的更多相关文章

  1. php动态导出数据成Excel表格

    一.封装 Excel 导出类 include/components/ExecExcel.php <?php /*** * @Excel 导入导出类. */ class ExecExcel { / ...

  2. 使用Aspose.Cell.dll导出Excel总结

    这两天项目上用Aspose导出Excel来着.开始感觉挺简单的,但是实际操作起来还是挺复杂的,调试占的时间很长.主要是动态生成列.合并单元格.调样式占了很长时间,还是总结一下吧. 基础操作: //EX ...

  3. Excel模板导出之动态导出

    说明 目前Magicodes.IE已支持Excel模板导出时使用JObject.Dictionary和ExpandoObject来进行动态导出,具体使用请看本篇教程. 本功能的想法.部分实现初步源于a ...

  4. 利用Aspose.Word控件和Aspose.Cell控件,实现Word文档和Excel文档的模板化导出

    我们知道,一般都导出的Word文档或者Excel文档,基本上分为两类,一类是动态生成全部文档的内容方式,一种是基于固定模板化的内容输出,后者在很多场合用的比较多,这也是企业报表规范化的一个体现. 我的 ...

  5. 使用aspose.cell导出excel需要注意什么?

    1.如果导出的数据源是汇总出来的,最好方法是将数据源放到缓存里面,当基本数据源变化的时候,在改变数据2.使用模板导出EXCEL,这样很多样式可以在模板文件里面直接设置,例如:默认打开页签,让列头固定3 ...

  6. easypoi导出动态表头excel

    easypoi导出动态表头excel 1: springBoot项目maven依赖: <dependency> <groupId>cn.afterturn</groupI ...

  7. 使用Aspose.Cell控件实现Excel高难度报表的生成(三)

    在之前几篇文章中,介绍了关于Apsose.cell这个强大的Excel操作控件的使用,相关文章如下: 使用Aspose.Cell控件实现Excel高难度报表的生成(一) 使用Aspose.Cell控件 ...

  8. Aspose.Cell和NPOI生成Excel文件

    1.使用Aspose.Cell生成Excel文件,Aspose.Cell是.NET组件控件,不依赖COM组件 1首先一点需要使用新建好的空Excel文件做模板,否则容易产生一个多出的警告Sheet 1 ...

  9. 使用Aspose.Cell控件实现Excel高难度报表的生成(一)

    时光飞逝,生活.工作.业余研究总是在不停忙碌着,转眼快到月底,该月的博客文章任务未完,停顿回忆一下,总结一些经验以及好的东西出来,大家一起分享一下.本文章主要介绍报表的生成,基于Aspose.Cell ...

随机推荐

  1. #pragma data_seg 共享数据区(转)

    原文地址:http://www.cnblogs.com/CBDoctor/archive/2013/01/26/2878201.html 1)#pragma data_seg()一般用于DLL中.也就 ...

  2. 将redis作为windows系统的系统服务

    在windows系统,每次打开redis服务都是一个dos窗口一直开着,很不爽,这里我用winsw工具把redis作为系统服务启动 我把自动启动的所有内容都整理好了,请自行下载 下载地址:http:/ ...

  3. Linux Futex的设计与实现(转)

    引子在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这个内核不一定能正确的运行使用glibc的程序" ...

  4. Gradle自定义你的BuildConfig

    BuildConfig.DEBUG 首先在Gradle脚本中默认的debug和release两种模式BuildCondig.DEBUG字段分别为true和false,而且不可更改.该字段编译后自动生成 ...

  5. 深入剖析 redis RDB 持久化策略

    简介 redis 持久化 RDB.AOF redis 提供两种持久化方式:RDB 和 AOF.redis 允许两者结合,也允许两者同时关闭. RDB 可以定时备份内存中的数据集.服务器启动的时候,可以 ...

  6. android实现自动升级并安装打开

    http://blog.csdn.net/wa991830558/article/details/41014673 这是一个比较简单的程序,但网上还是有很多人问起这个问题,并且回答的人,也没有完全回答 ...

  7. 为什么 NSLog 不支持 Swift 对象(转)

    https://segmentfault.com/a/1190000005668218 也就说: 1. 如果是 OC 的对象,重写 description 的 get 方法就可以了. 2. 如果不是 ...

  8. 伪装MAC地址

    一.界面操作法 打开"网上邻居",右键属性"本地连接",点击配置 选择"高级",再选"网路卡位址"(不同系统名字略不同) ...

  9. Spring4 MVC Hibernate4集成 Annotation

    Spring4 MVC Hibernate4集成 Annotation 一.本文所用环境 二.工程目录 三.Maven添加依赖 四.新建数据库表 五.配置文件 六.Model层 七.DAO层 八.Se ...

  10. synchronized关键字,Lock接口以及可重入锁ReentrantLock

    多线程环境下,必须考虑线程同步的问题,这是因为多个线程同时访问变量或者资源时会有线程争用,比如A线程读取了一个变量,B线程也读取了这个变量,然后他们同时对这个变量做了修改,写回到内存中,由于是同时做修 ...