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


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

    查询Apose.Cell控件的使用介绍,WorkBook对象确实有一个Combine的方法,专门做文件合并的工作,实现的代码如下所示。

    Workbook SourceBook1 = new Workbook();
    SourceBook1.Open(
    "c:\\excels\\ChartTest.xls");

    Workbook SourceBook2 
    = new Workbook();
    SourceBook2.Open(
    "C:\\excels\\PictureTest.xls");

    SourceBook1.Combine(SourceBook2);
    SourceBook1.Save("c:\\excels\\combined.xls"); 


    既然有了这个方法合并文件,那么客户提出的问题,就也可以通过该思路来解决了。问题只是这个方法合并已有的文件,而客户需要的是在一个自定义模板的基础上生成多个相似的报表,放到一个文件中,每个报表一个Sheet而已。

    SourceBook1.Combine(SourceBook2);
    SourceBook1.Save(
    "c:\\excels\\combined.xls"); 

    通过以上的代码,我们可以看到,文件合并的逻辑,其实是多个WorkBook之间的合并,然后把最后的WorkBook重新保存为另外一个文件即可。 

    首先我通过一个简单例子来介绍实现思路,先来设计一个简单的自定义模板,如下所示 。

     

     这样,我们通过基于该自定义模板,生成一系列相似的报表文件,然后逐一合并他们即可,例子实现的代码如下所示:

            private DataTable GetCustomersTable()
            {
                DataTable dt 
    = new DataTable("Customers");
                dt.Columns.Add(
    "Address");
                dt.Columns.Add(
    "City");
                dt.Columns.Add(
    "CompanyName");
                dt.Columns.Add(
    "ContactName");
                dt.Columns.Add(
    "ContactTitle");
                dt.Columns.Add(
    "Country");
                dt.Columns.Add(
    "CustomerID");
                dt.Columns.Add(
    "Fax");
                dt.Columns.Add(
    "Phone");
                dt.Columns.Add(
    "PostalCode");
                dt.Columns.Add(
    "Region");
                
    for (int i = 0; i < 10; i++)
                {
                    DataRow row 
    = dt.NewRow();
                    
    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        row[j] 
    = dt.Columns[j].ColumnName + "(" + i.ToString() + "," + j.ToString() + ")";
                    }
                    dt.Rows.Add(row);
                }
                
    return dt;
            }

            
    private void btnCombind_Click(object sender, EventArgs e)
            {
                Workbook SourceBook1 
    = new Workbook();

                
    string path = System.IO.Path.Combine(Application.StartupPath, "SmartMarkerCombind.xls");
                DataTable dt 
    = GetCustomersTable();//使用DataTable对象

                List
    <string> fileList = new List<string>();
                
    for (int i = 0; i < 3; i++)
                {
                    Workbook tempBook 
    = new Workbook();

                    
    //创建设计模板对象,并绑定数据源
                    WorkbookDesigner designer = new WorkbookDesigner();
                    designer.Open(path);
                    designer.SetDataSource(dt);
                    designer.Process();

                    
    //修改Sheet的名称
                    designer.Workbook.Worksheets[0].Name = "test" + i.ToString();

                    
    //根据数据源和自定义模板,生成相应的报表Excel文件
                    string fileToSave = System.IO.Path.Combine(Application.StartupPath, string.Format("Combind{0}.xls", i));
                    designer.Save(fileToSave, FileFormatType.Excel2003);
                    fileList.Add(fileToSave);

                    
    //第一次要打开
                    if (i == 0)
                    {
                        SourceBook1.Open(fileToSave);
                    }
                    
    else
                    {
                        
    //第二个使用Combind函数操作
                        tempBook.Open(fileToSave);
                        SourceBook1.Combine(tempBook);
                    }
                }

                
    //最后将WorkBook保存为一个文件即可
                string soucePath = System.IO.Path.Combine(Application.StartupPath, "Combind.xls");
                SourceBook1.Save(soucePath);

                
    //删除临时文件
                foreach (string file in fileList)
                {
                    
    if (File.Exists(file))
                    {
                        File.Delete(file);
                    }
                }

                
    //打开文件
                Process.Start(soucePath);
            }
        }

    注意,由于Workbook对象默认只创建了一个Sheet对象供使用,因此要逐一修改Sheet对应的名称,如下代码所示:

    designer.Workbook.Worksheets[0].Name = "test" + i.ToString(); 

    最终生成的多Sheet对象的Excel报表效果如下图所示:

     

    当然,复杂的报表可能相对处理会更加复杂一些,不过大致的逻辑就是通过这样的步骤来实现整合即可,在项目中整合 真正的报表后,对方满意,一切OK。

    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    HackerRank "Minimum Average Waiting Time" !
    HackerRank "Components in a graph"
    LeetCode "Range Sum Query
    LeetCode "Additive Number"
    LintCode "Post Office Problem" !!!
    LintCode "Longest Increasing Continuous subsequence II" !!
    LintCode "Coins in a Line III" !!
    LeetCode "Range Sum Query 2D
    LeetCode "Smallest Rectangle Enclosing Black Pixels"
    LintCode "Coins in a Line II" !
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/2149757.html
Copyright © 2020-2023  润新知