`
妮子321
  • 浏览: 83508 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

pageoffice---实现用户自定义Excel模板

阅读更多

需求背景: 在Excel的实际使用过程中,动态生成报表、导出报表等都是最终用户常常使用的功能,使用常规的方式针对模板中具体的每个单元格编程,动态的插入数据库中数据到Excel报表模板的每一个单元格,就可以实现动态报表功能。但是很多时候用户报表的样式不是一成不变的,如某公司2015年的产品报表希望在2014年的产品报表基础上,进行一些报表文本颜色、数据显示位置等方面的调整,2014年报表模板中“合计”数据原来位于单元格:A50,调整后,2015年报表模板中的“合计”数据单元格位于:A80。由于生成报表的程序代码是针对报表模板中的每一个具体的单元格编程的,模板中数据项所在单元格的位置发生了改变,就需要同步修改填充数据的程序代码,原来给A50单元格填充数据的代码需要修改为操作A80单元格。若是每次Excel模板的调整都需要开发人员重新修改代码来实现的话,那就是一项永远不会完成的工作了。

编辑Excel模板:定义名称


定义名称:Excel中有一个特别好的工具就是“定义名称”,顾名思义,就是为一个单元格或者区域定义一个名称,这样的话,我们在之后的程序控制时可以很方便的用所定义的名称进行代码编写。

下面以给一个区域定义名称为例介绍一下Excel定义名称的操作步骤:

  1. 在本地磁盘上打开一个Excel文件模板,选中需要填充数据的单元格区域,如B4:F13,如下图所示;
    :-: 5.4

  2. 在选中的单元格区域上,“右击→定义名称”(或者点击Office工具栏上的“公式→定义名称“),在名称输入框中输入该区域的名称,如命名为“report”,点击“确定”按钮即可。如下图所示。
    :-: 5.5
    :-: 5.6

  3. 若是需要删除、修改定义好的单元格区域,可点击Office工具栏上的“公式→名称管理器“来对名称进行管理,如下图所示。
    :-: 5.7

PageOffice操作Excel模板中定义了名称的单元格和区域


在PageOffice开发平台下,为了更好的在Excel模板中动态的、灵活的填充数据,专门开发了相应的程序接口,提供了完美解决上述问题的方法——openCellByDefinedName()和openTableByDefinedName()。在代码实现过程中,通过灵活的运用这两个方法,即可完美的实现在不修改代码的情况下,满足最终用户自定义修改Excel模板的需求。

一、openCellByDefinedName和openTableByDefinedName的定义说明

这两个方法用来实现操作用户自定义Excel模板中的。其中openCellByDefinedName()方法用来打开Excel中具有指定名称的单元格,并返回 Cell 对象。openTableByDefinedName()方法用来打开具有指定名称的单元格区域(一般为连续的多个单元格,在PageOffice的概念里称这块区域为一个Table),并返回 Table 对象。

Java方法:

    openCellByDefinedName(String definedName);
    openTableByDefinedName(String definedName, int rowCount, int colCount, boolean autoIncrease);

ASP.NET方法:

    public Cell OpenCellByDefinedName(
	    string DefinedName
    )
    public Table OpenTableByDefinedName(
	    string DefinedName,
	    int RowCount,
    	int ColCount,
	    bool AutoIncrease
    )

二、编写代码给Excel模板中的表格填充数据

Java部分代码如下:

	Workbook workBook = new Workbook();
	Sheet sheet = workBook.openSheet("Sheet1");
	//定义Table对象,参数“report”就是Excel模板中定义的单元格区域的名称
	Table table = sheet.openTableByDefinedName("report", 10, 5, false);
	//给区域中的单元格赋值
    table.getDataFields().get(0).setValue("轮胎");
    table.getDataFields().get(1).setValue("100");
    table.getDataFields().get(2).setValue("120");
    table.getDataFields().get(3).setValue("500");
    table.getDataFields().get(4).setValue("120%");
    table.nextRow(); //如果循环填充数据的话,执行下一行
   	table.close();
    
    //定义单元格对象,参数“year”就是Excel模板中定义的单元格的名称
    Cell cellYear = sheet.openCellByDefinedName("year");
    Calendar c=new GregorianCalendar();
	int year=c.get(Calendar.YEAR);//获取年份 
    cellYear.setValue(year + "年");
    Cell cellName = sheet.openCellByDefinedName("name");
    cellName.setValue("张三");
	
	poCtrl1.setWriter(workBook);
    ……

ASP.NET部分代码如下:

    PageOffice.ExcelWriter.Workbook wk = new PageOffice.ExcelWriter.Workbook();
    PageOffice.ExcelWriter.Sheet sheet = wk.OpenSheet("Sheet1");
    //定义Table对象,参数“report”就是Excel模板中定义的单元格区域的名称
    PageOffice.ExcelWriter.Table table = sheet.OpenTableByDefinedName("report", 10, 5, false);
    //给区域中的单元格赋值
    table.DataFields[0].Value = "轮胎";
    table.DataFields[1].Value = "100";
    table.DataFields[2].Value = "120";
    table.DataFields[3].Value = "500";
    table.DataFields[4].Value = "120%";
    table.NextRow();//如果循环填充数据的话,执行下一行
    table.Close();
    
    //定义单元格对象,参数“year”就是Excel模板中定义的单元格的名称
    PageOffice.ExcelWriter.Cell cellYear = sheet.OpenCellByDefinedName("year");
    cellYear.Value="2015年";
    PageOffice.ExcelWriter.Cell cellName = sheet.OpenCellByDefinedName("name");
    cellName.Value = "张三";
    
    PageOfficeCtrl1.SetWriter(wk);// 注意不要忘记此代码,如果缺少此句代码,不会赋值成功。
    ……

在填充数据的代码不做任何修改的情况下,打开两个不同的Excel模板并填充数据的效果:

  1. 打开模板一并填充数据,实现的效果如图所示
    :-: 5.8

  2. 打开模板二并填充数据,实现的效果如图10所示:
    :-: 5.9

可以看出在不需修改代码的情况下,用户可以根据实际需求自行定义Excel模板。只要Excel模板中有代码中所涉及到的定义名称(如“report”、“year”、“name”),那么无论定义了该名称的单元格区域的位置、大小怎么变化,程序都会自动在变化后的位置填充数据。而如果程序代码中涉及到的定义名称在Excel模板中不存在的话,那么对该对象的所有操作将被自动忽略,打开的Excel文档中也不会再显示相应的信息。

优势总结


openCellByDefinedName()和openTableByDefinedName()方法相比于openCell()和openTable()方法的具体优势在于:

  1. 可以避免同一个Excel工作薄中有多个表格时,上面的表格数据行增长后与下面的表格数据出现互相覆盖的问题。
    假如在一个Excel模板的同一个工作薄中,使用openTable(rangeAddress)方法打开两个不同的Table,分别为Table1(数据填充范围:第4-7行,行数:4行)、Table2(数据填充范围:第13-16行)。而要动态填充到Table1里的实际数据行数为12行,超过了指定的单元格区域行数,且Table1设置了默认自动扩展单元格行数到实际大小,并且给新的单元格数据行应用 RangeAddress 指定的单元格区域的格式,那么数据填充完后,Table1的实际填充范围应该是第4-15行;然而由于Table2的起始填充位置是不变的,还是从第13行开始填充,这样一来,Table2填充的数据就会覆盖Table1第13-15行的数据,即发生数据重叠覆盖的现象。
    :-: 5.1
    :-: 5.2

而如果使用openTableByDefinedName()来分别打开这两个Table,且设置表格也会按实际数据行数自动扩展,当Table1自动扩展后数据行数为12行,填充范围为第4-15行时,Table2的起始位置将不再是固定不变的,Table2的起始位置由原来的第13行变成了第21行,填充范围为第21-24行。这样一来,前后两个Table的数据就不会发生重叠覆盖的现象了,填充数据后的效果如图3所示。
:-: 5.3

  1. 当Excel模板数据内容不变,样式(数据的位置、大小等)改变时, openCell()和openTable()必须要修改其方法中的参数,即操作的单元格和Table对象,否则显示或提交的数据时就可能发生错乱;而openCellByDefinedName()和openTableByDefinedName()方法只要提前在模板中定义好要填充数据的单元格区域的名称,那么无论数据的位置、大小怎么变化,都不需修改代码就能将数据准确填充到相应的位置,并准确获取到提交的数据。

  2. 还可以实现用户可根据实际情况和实际需求自行便捷、简单地定义Excel模板,而无需每次更改模板时都要联系程序的开发者更改代码。PageOffice开发平台以其更好的灵活性和适应性,充分的满足了最终用户对系统功能的要求,极大的减少了程序开发者对系统后期的维护量。

详细请参考PageOffice开发包中Samples4示例:
二、33、给Excel模板中定义了名称的一块区域赋值(专业版、企业版)

分享到:
评论

相关推荐

    用PageOffice实现批量转换导出Word文档.pdf

    除了批量转换Word文档,PageOffice还支持其他Office文档格式的处理,如Excel和PowerPoint。这使得它适用于多种场景,包括报表自动化生成、在线编辑和协作,以及自定义的业务流程自动化。 综上所述,PageOffice提供...

    PageOffice 基础教程.pdf

    在Excel篇中,教程介绍了Workbook类、Sheet类、Table类和Cell类等常用接口对象,并指导如何动态填充Excel文档、实现单元格点击事件、用户自定义Excel模板、读取数据以及隐藏行号和列标的高级操作。 Java篇中,主要...

    PageOffice

    PageOffice是一款专业的Java办公软件开发组件,主要用于在Web环境下实现文档的在线编辑、查看和管理功能。这款组件能够帮助企业或开发者构建自己的Web办公系统,让用户无需安装任何客户端软件,即可在浏览器中处理...

    PageOffice_4.3.0.3_PHP

    这个压缩包包含了PHP版本的PageOffice组件,允许开发者在网页上直接编辑、创建、预览和保存Word、Excel、PowerPoint等Office文档,而无需借助Microsoft Office软件本身。 在Web应用中,PageOffice的核心功能包括: ...

    pageoffice控件demo

    PageOffice控件是一款用于在网页中实现文档在线编辑和处理的专业控件,它允许用户无需离开浏览器即可创建、编辑和保存各种格式的文档,如Word、Excel、PowerPoint等。这款控件通常被广泛应用于企业信息化系统、在线...

    基于Java的源码-PageOffice专业的集成微软OFFICE功能的Java控件平台.zip

    开发者可以通过学习和掌握PageOffice的API,实现与后台数据库的交互,完成诸如数据导入导出、模板编辑、在线协作等功能。 为了使用PageOffice,你需要在Java项目中引入相关的jar包,并根据官方提供的教程配置服务器...

    PageOffice C# 动态填充Word模版生成正式Word文件

    PageOffice是一款专业的在线文档编辑与控件开发工具,尤其在C#编程环境下,它提供了强大的功能,使得开发者能够轻松地实现在Web应用中创建、编辑和处理各类Office文档,包括Word、Excel、PowerPoint等。在本项目中,...

    Aspose.Cells写入一个excel多个活页内容进行导出

    Aspose.Cells是一款强大的.NET库,专门用于处理Microsoft Excel文件,无需依赖Microsoft Office。在这个特定的场景中,“Aspose.Cells写入一个excel多个活页内容进行导出”指的是使用Aspose.Cells来创建或修改一个...

    中职计算机应用基础office2010文字处理软件应用教材知识点整理归纳.doc

    - Office 2010是微软的办公软件套件,包括Word 2010、Excel 2010和PowerPoint 2010等组件。 3. **Word 2010的功能** - Word 2010提供文字输入、编辑、格式化、图形处理、图文混排和表格处理等功能。 - 可用于...

    Word、Excel、PPT使用技巧与实战方法大全(2010完整版

    通过“工具”>“选项”>“保存”中的“保存用户个性化设置”选项,可以在安装新版本Office时保留个性化设置。 22. **在Word中快速“粘贴”** 快速粘贴的快捷键是`Ctrl+V`,如果想要快速粘贴最近使用的格式,可以...

    导出数据到Exel模板

    总结起来,这个例子展示了如何在ASP.NET Web应用程序中结合使用`System.Office.Interop.Excel`库来动态生成和填充Excel模板,以及如何利用ASP.NET的Web Forms特性、Session状态管理、数据访问和分页等技术来实现这一...

    Word、Excel、PPT三大办公软件的使用教程大全.ppt

    Word、Excel、PPT是微软Office套装中的三大核心组件,广泛应用于日常工作和学习中的文档处理、数据管理和演示文稿制作。下面将详细讲解这些软件的一些实用技巧。 首先,关于Word的使用技巧: 1. **文字方向设置**...

    LotusDomino学习笔记.doc

    - **分页代码**: 可以使用LotusScript或Java编写自定义代理来实现分页功能,或者使用内置的分页功能。 #### 21. 同一用户重复登录 - **解决方法**: 使用会话管理和身份验证机制来防止重复登录,例如通过设置会话...

    office tricks

    - **模板与样式管理**:自定义文档模板,提高工作效率。 - **长文档排版技巧**:包括目录生成、索引编排等功能,适用于撰写论文或报告。 #### 4. Page Layout Tricks (第89页至106页) - **页面设置**:掌握不同的...

    计算机二级考试大纲

    通过以上详细的讲解, 可以看出, 计算机二级考试大纲涵盖了Office2010的主要组件, 包括Word、Excel、PowerPoint和Outlook。每个部分都有具体的操作要求和技术要点, 考生需要掌握这些知识才能顺利通过考试。

    OneNote教程

    - **内容导入**:展示如何直接从Word、Excel等Office应用中发送内容到OneNote。 **2. 利用屏幕剪切工具从网站剪切内容** - **网页捕捉**:教授如何使用屏幕剪切工具从网页上捕捉感兴趣的部分。 **3. 插入图片或...

    二级办公自动化考试大纲.doc

    【二级办公自动化考试大纲】是针对计算机二级考试中办公软件应用部分的一个详细指南,主要涵盖了Microsoft Office 2010的三大组件——Word2010、Excel2010和PowerPoint2010的高级应用技术。考生需要深入理解和熟练...

    计算机水平考试复习试题.doc

    - **解析**: 除了鼠标单击外,还可以使用键盘上的“Page Up/Page Down”键、“空格键”等来控制幻灯片的切换。因此,此题答案是“×”。 #### 21. 设计模板 - **知识点**: 设计模板包含的内容。 - **解析**: 设计...

    计算机二级考试辅助资料

    - **插入页码**:正确,可以通过插入域代码{page}实现,但按下"Shift" + "F9"显示的是域代码本身,而不是页码。 - **分节符**:删除分节符会合并节内容,格式会继承后面的节。 - **保留原格式更新域**:删除域...

Global site tag (gtag.js) - Google Analytics