您的位置:首页 > 编程语言 > ASP

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

2016-10-17 14:34 399 查看
继续在上篇《使用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);  

 


主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用

  转载请注明出处:


撰写人:伍华聪  http://www.iqidi.com 

    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: