当前位置: 首页 > news >正文

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

继续在上篇《使用Aspose.Cell控件实现Excel高难度报表的生成(一)》随笔基础上,研究探讨基于模板的Aspose.cell报表实现,其中提到了下面两种报表的界面,如下所示:

 或者这样的报表格式

  


首先来分析第一种报表,这个其实还是比较固定的二维表,我们只要绑定相关的信息即可,设计模板如下所示:

 
实际生成的报表如下所示:

 

实现的代码其实不复杂,如下所示:

         private DataTable GetTable(string sql)

        {
            Database db 
=  DatabaseFactory.CreateDatabase();
            DbCommand command 
=  db.GetSqlStringCommand(sql);
            
return  db.ExecuteDataSet(command).Tables[ 0 ];
        }
        
private   void  btnAllMonthReport_Click( object  sender, EventArgs e)
        {
            
string  sql  =   @" Select [LastCount] as LC, [LastMoney] as LM, [CurrentInCount] as CIC, [CurrentInMoney] as CIM, 
                           [CurrentOutCount] as COC, [CurrentOutMoney] as COM, [CurrentCount] as CC, [CurrentMoney] as CM, 
                           YearMonth,ItemName 
                           from TB_ReportMonthCheckOut 
" ;
            DataTable dtBigType 
=  GetTable(sql  +   "  where ReportType =3 " );
            dtBigType.TableName 
=   " BigType " ;
            
if  (dtBigType.Rows.Count  ==   0 )
                
return ;

            DataTable dtItemType 
=  GetTable(sql  +   "  where ReportType =3 " );
            dtItemType.TableName 
=   " ItemType " ;

            WorkbookDesigner designer 
=   new  WorkbookDesigner();
            
string  path  =  System.IO.Path.Combine(Application.StartupPath,  " Report2-1.xls " );
            designer.Open(path);
            designer.SetDataSource(dtBigType);
            designer.SetDataSource(dtItemType);
            designer.SetDataSource(
" YearMonth " , dtBigType.Rows[ 0 ][ " YearMonth " ].ToString());
            designer.Process();

            
// Save the excel file
             string  fileToSave  =  FileDialogHelper.SaveExcel();
            
if  (File.Exists(fileToSave))
            {
                File.Delete(fileToSave);
            }
            designer.Save(fileToSave, FileFormatType.Excel2003);
            Process.Start(fileToSave);
        }

 
通过绑定两个不同的DataTable对象,然后引用他的属性即可,行会自动增加以适应实际的数据,并且对象变量&=$YearMonth也正常显示了,注意一点就是,所有使用变量的地方,都必须在一个独立的Excel单元格中,否则不能解析出来。另外上图的红色圆圈里面表示,汇总的函数,会自动根据行列的增加,自动调整引用,这真是我们需要的。 

 

 出库单的实现也差不多,实现代码如下所示:

             string  TakeOutBill  =  Path.Combine(Application.StartupPath,  " TakeOutBill.xls " );
            WorkbookDesigner designer 
=   new  WorkbookDesigner();
            designer.Open(TakeOutBill);
            designer.SetDataSource(
" TakeOutDate " , DateTime.Now.ToString( " yyyy-MM-dd " ));
            designer.SetDataSource(
" WareHouse " this .txtWareHouse.Text);
            designer.SetDataSource(
" Manager " this .txtCreator.Text);
            designer.SetDataSource(
" CostCenter " this .txtCostCenter.Text);
            designer.SetDataSource(
" Dept " this .txtDept.Text);

            
string  columns  =   " Start|int,ItemNo,ItemName,Specification,Unit,Price|decimal,Count|int " ;
            DataTable dt 
=  DataTableHelper.CreateTable(columns);
            dt.TableName 
=   " Detail " ;
            DataRow row 
=   null ;
            
for  ( int  i  =   0 ; i  <   this .lvwDetail.Items.Count; i ++ )
            {
                PurchaseDetailInfo info 
=   this .lvwDetail.Items[i].Tag  as  PurchaseDetailInfo;
                
if  (info  !=   null )
                {
                    row 
=  dt.NewRow();
                    row[
" Start " =  (i  +   1 );
                    row[
" ItemNo " =  info.ItemNo;
                    row[
" ItemName " =  info.ItemName;
                    row[
" Specification " =  info.Specification;
                    row[
" Unit " =  info.Unit;
                    row[
" Price " =  info.Price;
                    row[
" Count " =  Math.Abs(info.Quantity);
                    dt.Rows.Add(row);
                }
            }
            designer.SetDataSource(dt);
            designer.Process();
            
string  fileToSave  =  FileDialogHelper.SaveExcel();
            
if  (File.Exists(fileToSave))
            {
                File.Delete(fileToSave);
            }
            designer.Save(fileToSave, FileFormatType.Excel2003);
            Process.Start(fileToSave); 


以上报表,其实实现思路基本都差不多,相对来时,还是比较容易的,接下来设计一个比较困难的报表,需要结合Aspose.Cell一些对象来动态创建行列,并设置单元格的变量,然后填入相应的对象构造报表,另外还需要注意单元格格式的变化,如下所示的这种报表

 

这个报表初看没有太多特别的地方,难点就是他的第一行列也是变化的,因此不能通过普通的方式构建二维表,然后绑定数据源的方式,要先加载模板文件,然后操作Excel对象,把第一行的各列头部补齐,然后给下一行各单元格填入对象公式,如&=BigType.DeptName 和&=BigType.TotalMoney等内容,实现的代码如下所示:

             string  sql  =   @" Select [YearMonth], [DeptName], [ItemType], [TotalMoney]
                           from TB_ReportDeptCost 
" ;
            DataTable dt 
=  GetTable(sql);
            
if  (dt.Rows.Count  ==   0 )
                
return ;

            List
< string >  itemTypeList  =   new  List < string > ();
            List
< string >  partList  =   new  List < string > ();
            
foreach  (DataRow row  in  dt.Rows)
            {
                
string  itemType  =  row[ " ItemType " ].ToString();
                
if  ( ! itemTypeList.Contains(itemType))
                {
                    itemTypeList.Add(itemType);
                }

                
string  part  =  row[ " DeptName " ].ToString();
                
if  ( ! partList.Contains(part))
                {
                    partList.Add(part);
                }
            }

            
string  columnString  =   " DeptName " ;
            
for  ( int  i  =   0 ; i  <  itemTypeList.Count; i ++ )
            {
                columnString 
+=   string .Format( " ,TotalMoney{0}|decimal " , i);
            }
            DataTable dtBigType 
=  DataTableHelper.CreateTable(columnString);
            dtBigType.TableName 
=   " BigType " ;
            
foreach  ( string  part  in  partList)
            {
                DataRow row 
=  dtBigType.NewRow();
                row[
" DeptName " =  part;
                
for  ( int  i  =   0 ; i  <  itemTypeList.Count; i ++ )
                {
                    
string  itemType  =  itemTypeList[i];
                    DataRow[] rowSelect 
=  dt.Select( string .Format( " DeptName='{0}' AND ItemType='{1}' " , part, itemType));
                    
if  (rowSelect.Length  >   0 )
                    {
                        row[
" TotalMoney "   +  i.ToString()]  =  rowSelect[ 0 ][ " TotalMoney " ];
                    }
                }
                dtBigType.Rows.Add(row);
            }

            WorkbookDesigner designer 
=   new  WorkbookDesigner();
            
string  path  =  System.IO.Path.Combine(Application.StartupPath,  " Report1.xls " );
            designer.Open(path);

            Aspose.Cells.Worksheet w 
=  designer.Workbook.Worksheets[ 0 ];
            
// 先设置标题项目:如大修件,日常备件等
             int  rowIndex  =   2 ; // 第三行为标题
            Aspose.Cells.Style style  =  w.Cells[rowIndex  +   1 1 ].Style; // 继承数字栏目的样式
            style.Number  =   4 ; // 对应格式是#,##0.00
            Aspose.Cells.Style boldStyle  =  w.Cells[rowIndex,  0 ].Style; // 继承开始栏目的样式
             for  ( int  i  =   0 ; i  <  itemTypeList.Count; i ++ )
            {
                w.Cells[rowIndex, i 
+   1 ].PutValue(itemTypeList[i]);
                w.Cells[rowIndex, i 
+   1 ].Style  =  boldStyle;
                w.Cells[rowIndex 
+   1 , i  +   1 ].PutValue( " &=BigType.TotalMoney "   +  i.ToString());
                w.Cells[rowIndex 
+   1 , i  +   1 ].Style  =  style;
            }

            
// 添加合计行
            w.Cells[rowIndex, itemTypeList.Count  +   1 ].PutValue( " 合计 " );
            w.Cells[rowIndex, itemTypeList.Count 
+   1 ].Style  =  boldStyle;
            w.Cells[rowIndex 
+   1 , itemTypeList.Count  +   1 ].PutValue( string .Format( " &=&=SUM(B{{r}}:{0}{{r}}) " , GetChar(itemTypeList.Count  +   1 )));
            w.Cells[rowIndex 
+   1 , itemTypeList.Count  +   1 ].Style  =  style;

            designer.SetDataSource(dtBigType);
            designer.SetDataSource(
" YearMonth " , dt.Rows[ 0 ][ " YearMonth " ].ToString());
            designer.Process();

            
// Save the excel file
             string  fileToSave  =  FileDialogHelper.SaveExcel();
            
if  (File.Exists(fileToSave))
            {
                File.Delete(fileToSave);
            }
            designer.Save(fileToSave, FileFormatType.Excel2003);
            Process.Start(fileToSave);  

 

转载于:https://www.cnblogs.com/wuhuacong/archive/2011/02/23/1962347.html

相关文章:

  • 第十四章 重载运算与类型转换
  • 使用类的思想来重构asp网站开发
  • android129 zhihuibeijing 聊天机器人
  • 【转】nios II架构uclinux的过程
  • 开发人员学Linux(4):使用JMeter对网站和数据库进行压力测试
  • 项目选题报告
  • [转载]精益求精Sybase数据库标题大包括-6
  • Android基础:SQLites数据库事物处理的优越性
  • DB2 9 利用斥地(733 测验)认证指南,第 9 部分: 用户定义的例程(2)
  • JS区别IE6、IE7、IE8之间的方法
  • 基础算法10:过滤器(Filter)对指定路径不进行过滤
  • Asp.net用户多次登录问题
  • 如何应对被地下的Oracle口令加密算法(1)
  • Haproxy+Keepalived+Jboss集群实施架构一例
  • Solaris10下载、安设和设置装备摆设(2)
  • 2017-09-12 前端日报
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • js面向对象
  • LintCode 31. partitionArray 数组划分
  • mysql常用命令汇总
  • Mysql优化
  • python 装饰器(一)
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Unix命令
  • 猴子数据域名防封接口降低小说被封的风险
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 深度学习在携程攻略社区的应用
  • 我看到的前端
  • 一个JAVA程序员成长之路分享
  • 移动端唤起键盘时取消position:fixed定位
  • const的用法,特别是用在函数前面与后面的区别
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​Linux·i2c驱动架构​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • #在 README.md 中生成项目目录结构
  • (12)Hive调优——count distinct去重优化
  • (多级缓存)多级缓存
  • (二)Linux——Linux常用指令
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (算法)N皇后问题
  • (转)memcache、redis缓存
  • (转)关于pipe()的详细解析
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • **PHP分步表单提交思路(分页表单提交)
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET Core 版本不支持的问题
  • .net 流——流的类型体系简单介绍
  • .NetCore 如何动态路由
  • .netcore如何运行环境安装到Linux服务器
  • .Net程序帮助文档制作