效果图:

前台调用:

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. 如何查看Linux的系统是64位的还是32位的

    可以用命令“getconf LONG_BIT”查看,如果返回的结果是32则说明是32位,返回的结果是64则说明是64位. 此外还可以使用命令“uname -a”查看,输出的结果中,如果有x86_64就 ...

  2. java动态代理汇总

    逛知乎,有篇关于fastjson如此快为什么国外还是喜欢用Jackson的问题,高票答案中有一点提到了fastjson有很多写死的地方,也不太适合像spring这种依赖AOP的框架使用,顺便提到了AS ...

  3. 如何制作CSR文件?

    如何制作CSR文件? 在申请数字证书之前,您必须先生成证书私钥和证书请求文件(CSR,Cerificate Signing Request),CSR是您的公钥证书原始文件,包含了您的服务器信息和您的单 ...

  4. (String) | String.valueOf()

    Map m = new HashMap(); Integer i = 5; String s = null; m.put("val1", i); m.put("val2& ...

  5. WPF 模板

    一.DataTemplate(数据模板)1.引用命名空间xmlns:别名="clr-namespace:命名空间" 2.调用命名空间下的类别和属性<Window.Resour ...

  6. C++读取mysql中utf8mb4编码表数据乱码问题及UTF8转GBK编码

    数据库编码为utf8,但是由于某些表的一些字段存储了emoji字符,表采用了utf8mb4编码,默认情况下在C++代码中读出的中文字段值都变成了乱码. 解决方法为,在进行数据库查询前,在C++中执行一 ...

  7. MAC 磁盘清理工具 ncdu

    下载命令:brew install ncdu 使用命令:ncdu . 它会将当前目录下的所有文件.文件夹大小安倒叙排列,方便清除

  8. C#3.0新特性之扩展方法介绍

    C#3.0扩展方法是给现有类型添加一个方法.现在类型即可是基本数据类型(如int,String等),也可以是自己定义的类.以下是引用片段: //Demo--1 //扩展基本类型 namespace T ...

  9. Java Web dev搭建经验总结

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! 回馈分析法使我看到,我对专业技术人员,不管是工程师.会计师还是市场研究人员,都容易从直觉上去理解 ...

  10. swift 枚举类型

    1:swift的枚举类型是一系列的值,不同于c语言中枚举类型是整数类型.每个枚举定义了个新的类型 2:switch类型匹配 2.1枚举类型和switch单个匹配 enum PlatType{ case ...