C#使用第三方aspose.cell类库动态导出多表头EXCEL实例

先我们来看看效果图:

前台调用:

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; }
        }
    }
}

C#利用Aspose.Cells组件导入导出excel文件

Aspose.Cells导入excel代码:

public static System.Data.DataTable ReadExcel(String strFileName)
{
    Workbook book = new Workbook();
    book.Open(strFileName);
    Worksheet sheet = book.Worksheets[0];
    Cells cells = sheet.Cells;
    
    return cells.ExportDataTableAsString(0, 0, cells.MaxDataRow + 1, cells.MaxDataColumn + 1, true);
}

       
Aspose.Cells导出excel代码:

private static void Export<T>(IEnumerable<T> data, HttpResponse response)
{
    Workbook workbook = new Workbook();
    Worksheet sheet = (Worksheet)workbook.Worksheets[0];                        
    PropertyInfo[] ps = typeof(T).GetProperties();
    var colIndex = "A";
    foreach (var p in ps)
    {
        
            sheet.Cells[colIndex + 1].PutValue(p.Name);
            int i = 2;
            foreach (var d in data)
            {
                sheet.Cells[colIndex + i].PutValue(p.GetValue(d, null));
                i++;
            }
            colIndex = ((char)(colIndex[0] + 1)).ToString();
    }
    response.Clear();
    response.Buffer = true;
    response.Charset = "utf-8";
    response.AppendHeader("Content-Disposition", "attachment;filename=xxx.xls");
    response.ContentEncoding = System.Text.Encoding.UTF8;
    response.ContentType = "application/ms-excel";
    response.BinaryWrite(workbook.SaveToStream().ToArray());
    response.End();
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索string
, new
, datatable
using
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-09-17 04:00:27

C#使用第三方aspose.cell类库动态导出多表头EXCEL实例的相关文章

使用Aspose.Cell控件实现多个Excel文件的合并

之前有写过多篇关于使用Apose.Cell控件制作自定义模板报表和通用的导出Excel表格数据的操作,对这个控件的功能还是比较满意,而且也比较便利.忽然有一天,一个朋友说:你已经有生成基于自定义模板报表了,可是我每个单位都导出一张相同的报表的话,我岂不是要生成很多文件,而且对比查看也不方便,有没有更好的办法合并他们到一个文件里面呢?这样我看报表就方便很多了.本文主要介绍如何实现基于一个自定义报表模式,生成多个类似报表合并在一个文件中具体操作. 查询Apose.Cell控件的使用介绍,WorkBo

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

我们知道,一般都导出的Word文档或者Excel文档,基本上分为两类,一类是动态生成全部文档的内容方式,一种是基于固定模板化的内容输出,后者在很多场合用的比较多,这也是企业报表规范化的一个体现. 我的博客介绍过几篇关于Aspose.Word控件和Aspose.Cell控件的使用操作,如下所示. <使用Aspose.Cell控件实现Excel高难度报表的生成(一)> <使用Aspose.Cell控件实现Excel高难度报表的生成(二)> <使用Aspose.Cell控件实现Ex

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

在之前几篇文章中,介绍了关于Apsose.cell这个强大的Excel操作控件的使用,相关文章如下: 使用Aspose.Cell控件实现Excel高难度报表的生成(一) 使用Aspose.Cell控件实现Excel高难度报表的生成(二) 使用Aspose.Cell控件实现多个Excel文件的合并 这几篇文章,都对Apose.Cell这个控件生成各种Excel的方式进行了阐述,对直接把DataTable或者IList生成Excel的操作,对通过模板方式实现自定义报表的各种方式,以及多个文件的合并的

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

继续在上篇<使用Aspose.Cell控件实现Excel高难度报表的生成(一)>随笔基础上,研究探讨基于模板的Aspose.cell报表实现,其中提到了下面两种报表的界面,如下所示:  或者这样的报表格式    首先来分析第一种报表,这个其实还是比较固定的二维表,我们只要绑定相关的信息即可,设计模板如下所示:   实际生成的报表如下所示:   实现的代码其实不复杂,如下所示:          private DataTable GetTable(string sql)         {  

怎么在datagrid的第一个cell里动态插入checkbox?

问题描述 怎么在datagrid的第一个cell里动态插入checkbox?我想实现一下功能:我把几条数据显示在datagrid里,每条数据的最前面的cell里是一个checkbox,选中若干checkbox,按"消除"按钮,将选中的数据删掉.怎么在datagrid的第一个cell里动态插入checkbox?还有怎样才能知道我选中的是哪几条纪录呢? 解决方案 解决方案二:在应用程序中我这动态绑上去的.DataGridTableStyle样式来做的.asp.net中没做过动态的,静态的用

如何查看Aspose.cell是不是破解版?

问题描述 今天试用了Aspose.cell来操作excel,发现非常好用,又不占用进程.想要用到现在开发的项目里面,但是如何查看我现在用的这个Aspose.cell组件是不是破解版? 解决方案 解决方案二:没人来回答...解决方案三:破解版会在输出的时候打上水印的.解决方案四:这个前阵子刚用过还不错网上找个破解版的很好用

利用Aspose.Cell控件导入Excel非强类型的数据

导入Excel的操作是非常常见的操作,可以使用Aspose.Cell.APOI.MyXls.OLEDB.Excel VBA等操作Excel文件,从而实现数据的导入,在导入数据的时候,如果是强类型的数据,那么这几种方式好像都表现差不多,正常操作能够导入数据.如果是非强类型的数据,那么就需要特别注意了,一般情况下,导入的DataTable数据列的类型是以第一行内容作为确定列类型的,本文介绍利用Aspose.Cell控件导入Excel非强类型的数据的操作. 什么是强类型的数据呢,就是在Excel表格中

在asp.net中怎么导出真正的excel文件

问题描述 求教导出真正的excel文件,导出的文件在不做任何变动的情况下,还要能够导入进去.也就是说导出的文件,要和桌面创建的excel是一个格式. 解决方案 解决方案二:用aspose.cells插件导出可以按指定的模板(也就是你导入的格式)导出解决方案三:楼主可以去看看NPOI解决方案四:微软自带的Excel组件就可以啊,只不过是一个cell一个cell的写,导出的时候比较慢解决方案五:导入Microsoft.Office.Interop.Excel类库DimapplicationClass

.NET 导出图片到Excel中,打开不显示(或提示受保护)问题。

问题描述 .NET 导出图片到Excel中,打开不显示(或提示受保护)问题. public static MemoryStream TablesToExcelForXLSX(DataTable dt, DataTable reportTable, string file, int timeCount, string exportAll, string exportDatasource, string exportChart, out byte[] buf) { //HSSFWorkbook //