使用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。

本文转自博客园伍华聪的博客,原文链接:使用Aspose.Cell控件实现多个Excel文件的合并,如需转载请自行联系原博主。

时间: 2024-09-27 18:48:34

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

利用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非强类型的数据

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

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

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

将datagrid控件内容输出到excel文件_实用技巧

一个将datagrid控件内容输出到excel文件的demo. 生成EXCEL文件 复制代码 代码如下: public void setToExcel() { // Response.Clear(); // Response.Buffer= true; // Response.Charset="utf-8"; if (eformsn.Text=="") { DataGrid1.Visible=false; Label1.Text="要汇入EXCEL,请先输

利用Aspose.Word控件实现Word文档的操作

原文:利用Aspose.Word控件实现Word文档的操作 Aspose系列的控件,功能都挺好,之前一直在我的Winform开发框架中用Aspose.Cell来做报表输出,可以实现多样化的报表设计及输出,由于一般输出的内容比较正规化或者多数是表格居多,所以一般使用Aspose.Cell来实现我想要的各种Excel报表输出.虽然一直也知道Aspose.Word是用来生成Word文档的,而且深信其也是一个很强大的控件,但一直没用用到,所以就不是很熟悉. 偶然一次机会,一个项目的报表功能指定需要导出为

vb60-vb 怎么用winsoc控件 ftp上传下载文件

问题描述 vb 怎么用winsoc控件 ftp上传下载文件 急求 vb 怎么用winsock控件 ftp上传下载文件,还有没有其他的做法,简单就好 解决方案 inet 比较简单,winsock有固定API调用,网上很多 InetFTP.UserName = txtusername.Text InetFTP.Password = txtpassword.Text InetFTP.Execute host_name, "Get logxxxx" Do While InetFTP.Still

android控件-android中xml设置控件的属性和java文件里设置控件的属性有何不同

问题描述 android中xml设置控件的属性和java文件里设置控件的属性有何不同 android中xml设置控件设置的属性和java文件里设置控件的属性有何不同 是不是java文件里设置可以改变动态的改变控件位置,文字颜色,文字大小 而在xml文件设置之后就无法改变 那具体在java文件设置的属性是如何改变的呢 解决方案 java中可以重新设置去改变xml的设置.但是xml不能去改变java中的设置. 解决方案二: 你可以这样理解,xml设置以后基本不会改变,如果会改变,就要在java里面设

C# 如何像fileUpLoad控件那样实现浏览选择文件夹的路径

问题描述 C# 如何像fileUpLoad控件那样实现浏览选择文件夹的路径 做一个选择文件夹的功能 可以点击按钮浏览本地的文件夹选择后文件夹的路径保存在框中,谢谢大神们 解决方案 OpenFileDialog FolderBrowserDialog