zoukankan      html  css  js  c++  java
  • 使用Aspose.Cell控件实现Excel高难度报表的生成(三)

    在之前几篇文章中,介绍了关于Apsose.cell这个强大的Excel操作控件的使用,相关文章如下:

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

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

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

    这几篇文章,都对Apose.Cell这个控件生成各种Excel的方式进行了阐述,对直接把DataTable或者IList生成Excel的操作,对通过模板方式实现自定义报表的各种方式,以及多个文件的合并的方式进行了介绍。

    本文继续介绍该控件进一步的使用,也主要介绍如何动态生成(不使用模板文件)各种单元格,以及图表的增加等功能,介绍生成的表格完全自定义,这个报表时一个典型的图文并茂的统计报表,它的最终样式如下所示。

    这个报表,表格数据是动态生成,图形则是直接从窗体的图表控件(如ZedGraph图表控件)或者PictureBox控件中获取,写入Excel文档中的。

    测试程序主界面如下所示。

    和很多其他的Excel操作控件(NPOI、Myxls)一样吗,Apose.Cell也提供了WorkBook、WorkSheet、Range、Cell这些对象的包装,操作这些对象,基本上能够满足我们各种复杂的需求,给我们更加弹性化的操作。

    1、 添加基本对象进行操作

                Workbook workbook = new Workbook();
                Worksheet worksheet = workbook.Worksheets[0];

    这几个对象是操作Excel必须的,如果需要设定生成的Excel打印预览的参数,进行一些属性设置,如下所示。

    复制代码
                Workbook workbook = new Workbook();
                Worksheet worksheet = workbook.Worksheets[0];
    
                worksheet.PageSetup.Orientation = PageOrientationType.Landscape;//横向打印
                worksheet.PageSetup.Zoom = 100;//以100%的缩放模式打开
                worksheet.PageSetup.PaperSize = PaperSizeType.PaperA4;
    复制代码

    我们知道,由于该报表完全是手工生成,报表的标题,以及下面几行说明文字,也是需要生成的,操作其实就是把一些单元格合并为一个区域(Range),然后赋值,改变样式就可以了,如下所示的效果和代码

    复制代码
                Range range; Cell cell;
                int colSpan = 4 + DeptNameList.Count * 2;
                range = worksheet.Cells.CreateRange(0, 0, 1, colSpan);
                range.Merge();
                range.RowHeight = 20;
                range.Style = CreateTitleStyle(workbook);
                cell = range[0, 0];
                cell.PutValue("患病情况统计");
    
                range = worksheet.Cells.CreateRange(1, 0, 1, colSpan);
                range.Merge();
                range.RowHeight = 15;
                cell = range[0, 0];
                cell.PutValue("所选部别范围内,总计有1000名人员,查询统计结果如下:");
    
                range = worksheet.Cells.CreateRange(2, 0, 1, colSpan);
                range.Merge();
                range.RowHeight = 15;
                cell = range[0, 0];
                cell.PutValue("自2007-1-1开始到现在,统计共有500人有患病史,累计900人次,患病情况如下表:");
    复制代码

    2、生成报表头部表格

    报表中最复杂的是表头的生成,因为它是不规则的表头,因此需要很细的操作Cell和Range对象,实现复杂表头(也是很常见的)的生成。

    这个是慢工出细活,需要对Cell和Range熟悉使用,然后给他们分配不同的行列就可以生成一个标准如下的表头了。

    复制代码
                Style headStyle = CreateStyle(workbook, true);
                Style normalStyle = CreateStyle(workbook, false);
                int startRow = 4;
                range = worksheet.Cells.CreateRange(startRow, 0, 2, 1);
                range.Merge();
                range.Style = headStyle;
                cell = range[0, 0];
                cell.PutValue("序号");
                cell.Style = headStyle;
    
                range = worksheet.Cells.CreateRange(startRow, 1, 2, 1);
                range.Merge();
                range.Style = headStyle;
                range.ColumnWidth = 40;
                cell = range[0, 0];
                cell.PutValue("疾病名称");
                cell.Style = headStyle;
    
                int startCol = 2;
                foreach (string deptName in DeptNameList)
                {
                    range = worksheet.Cells.CreateRange(startRow, startCol, 1, 2);
                    range.Merge();
                    range.Style = headStyle;
                    cell = range[0, 0];
                    cell.PutValue(deptName);
    
                    cell = worksheet.Cells[startRow + 1, startCol];
                    cell.PutValue("人次");
                    cell.Style = headStyle;
                    cell = worksheet.Cells[startRow + 1, startCol + 1];
                    cell.PutValue("百分比");
                    cell.Style = headStyle;
    
                    startCol += 2;
                }
    
                range = worksheet.Cells.CreateRange(startRow, startCol, 1, 2);
                range.Merge();
                range.Style = headStyle;
                cell = range[0, 0];
                cell.PutValue("合计");
    
                cell = worksheet.Cells[startRow + 1, startCol];
                cell.PutValue("人次");
                cell.Style = headStyle;
                cell = worksheet.Cells[startRow + 1, startCol + 1];
                cell.PutValue("百分比");
                cell.Style = headStyle; 
                #endregion
    复制代码

    3、填入表格内容

    这个不算复杂,只需要遍历然后生成内容到单元格即可。

    复制代码
                //写入数据到Excel
                startRow = startRow + 2;            
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    startCol = 0;
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        DataRow dr = dt.Rows[i];
                        cell = worksheet.Cells[startRow, startCol];
                        cell.PutValue(dr[j]);
                        cell.Style = normalStyle;
    
                        startCol++;
                    }
                    startRow++;
                }
    复制代码

    4、插入图表及导出打开操作

    这个Apose.Cell控件的WorkSheet提供了worksheet.Pictures.Add方法,可以添加图片的操作,不过图片是通过流方式写入,我们把图表的Image对象转换一下,创建一个内存流就可以了。如下所示。

    复制代码
                //写入图注
                startRow += 1;//跳过1行
                range = worksheet.Cells.CreateRange(startRow++, 0, 1, colSpan);
                range.Merge();
                range.RowHeight = 15;
                cell = range[0, 0];
                cell.PutValue("以柱状图展示如下:");
    
                //插入图片到Excel里面
                byte[] bytes = ImageHelper.ImageToBytes(this.pictureBox1.Image);
                using (MemoryStream stream = new MemoryStream(bytes))
                {
                    worksheet.Pictures.Add(startRow, 0, stream);
                }
    
                //Save the excel file.
                string saveFile = FileDialogHelper.SaveExcel("rangecells.xls", "C:\");
                if (!string.IsNullOrEmpty(saveFile))
                {
                    workbook.Save(saveFile);
                    if (MessageUtil.ShowYesNoAndTips("保存成功,是否打开文件?") == System.Windows.Forms.DialogResult.Yes)
                    {
                        System.Diagnostics.Process.Start(saveFile);
                    }
                }
    复制代码

    至此,基于Apose.Cell的自定义报表的另外一种操作也全部实现了,为了实现这个简单的例子,以便在项目中使用,花了不少时间,不过以后对于生成这类复杂的和自定义报表,可以直接利用它们基础的对象进行操作即可;

    如果是一些常规的报表,可以利用自定义模板的方式生成,然后绑定数据源;如果是二维表,或者ILIst集合,导出Excel就更简单了。以上两种都可以直接利用封装好的AsposeExcelTools来进行操作,这个通用的类库,可以省却每次去编写代码的繁琐,提高效率。

  • 相关阅读:
    《.NET深入体验与实战精要》读书体会
    为什么周易中有64卦?
    16进制与8进制之间的快速转码
    3种夸克有多少组合?
    分辨率宽高和为整千?
    abt DVD
    为什么有20种氨基酸?
    HD与BD次时代之战!
    [转载]Java一些基础问题
    [转载]Java环境变量配置
  • 原文地址:https://www.cnblogs.com/BrokenIce/p/5994990.html
Copyright © 2011-2022 走看看