Excel导入行式报表
1. 描述
对于行式填报表的在线导入Excel,在6.5.5之前版本前需要和Excel数据复制到填报单元格一样,在导入Excel前手动增加足够的行数才能进行导入;
从7.0版本开始,FR对此功能进行了改进,在导入Excel时,会根据Excel中的记录数自动扩展出需要的行数。
1.1 必要条件
导入固定行:Excel中的第一行导入数据的位置必须是可编辑的即需要设置对应单元格的控件属性; 导入不定行:除了需要为单元格添加控件之外,且还要设置扩展属性从上到下扩展或者从左到右扩展(只需要给左父格或者上父格设置扩展方向即可)。
1.2 是否按控件导入
如果不想为单元格添加控件就直接导入Excel,即可通过修改配置文件控制是否按控件导入,默认按照控件导入。如果设置不按照控件导入,那么导入固定行报表无需其他设置,只要位置对应,直接导入即可,导入不定行报表只需要给单元格设置扩展属性,无需添加控件。
打开%FR_HOME%\\WebReport\\WEB-INF\\resources下面的customconfig.xml文件,如果没有该文件,则复制config.xml至该文件夹中,并重命名为customconfig.xml,如下图:
在xml文件最后前面插入一句 保存文件,重启服务器,Excel导入行式报表的时候就可以不添加控件了。 2. 导入逻辑 随着Excel导入功能的逐渐完善,至当前版本为止,导入Excel有两种逻辑,最大程度上满足了用户对Excel导入填报的需求。 2.1 根据标题匹配 模板从首列标题名开始,逐一到excel中去匹配,发现列名相同的导入数据,列名不同或不存在则不导入数据,如下图: 注:根据标题匹配必须要匹配2列或者2列以上的标题才可以。 详细请查看根据标题匹配 2.2 根据位置匹配 即在设计器中设计报表样式时,需要导入数据的单元格的位置与excel中数据所在位置保持一致,标题名不需要一样,如下图所示: 详细请查看根据位置匹配 3. 分类 根据Excel到行式报表的报表的扩展性不同,我们按照一下几个分类来分别讲述。 Excel导入行式报表包括固定行导入、不定行导入和双向导入 3.1 Excel导入固定行 FineReport模板中的单元格不可扩展,在模板中手动添加固定的行数,单元格无需设置扩展性,用来导入Excel中相同行数的数据,Excel导入固定行的执行逻辑是按照位置匹配,详细清查Excel导入固定行。 3.2 Excel导入不定行 Excel导入不定行是指需要导入的Excel数据行数不确定,通过设置FineReport模板中单元格的扩展性来导入不定行,单元格必须设置可扩展才可以导入。 Excel导入不定行根据实际情况的不同其执行逻辑会有所不同,首先根绝标题匹配,如果标题匹配不成功则按照位置匹配。 详细请查看Excel导入不定行之标题匹配和Excel导入不定行之位置匹配 3.3 双向导入 双向导入就是指标题行列是从单元格扩展得到的,并将导入的数据也是可扩展的,详细请查看Excel导入之双向导入 若在报表环境中可以正确导入Excel,而在您自己的项目中导入Excel时提示“正在加载”最后无法导入数据,请查看您项目中的过滤器是否对请求设置了拦截。 一、根据标题匹配 1. 描述 Excel导入不定行行式填报报表根据标题匹配是指是根据列标题(纵向扩展,横向扩展则是行标题)自动匹配,标题不相同,则显示空白,即必须保持标题一致,无关于位置,列的位置可以互换。 注:在进行不定行导入的时候首先进行标题匹配,标题匹配不成功再根据位置匹配 2. 示例 2.1 模板准备 打 开 模 板%FR_HOME%\\WebReport\\WEB-INF\\reportlets\\doc\\SpecialSubject|\\ExcelImport\\ExcelImport_1.cpt,修改如下图,删除左方和下方的空白行,将产品名称和类别列名称修改为产品和类别ID,与excel不一样,同时更换类别和供应商列的位置,再为每个单元格添加控件,这里添加文本控件: 注:如果不想添加控件,可以设置不按照控件导入,但是这里是导入不定行,不论是否根据控件导入,必须保证左父格是可扩展的。 2.2 报表填报属性修改 修改报表填报属性中列和数据库中列的对应,这里只需要修改类别ID对应的值,修改为map(C2, \"ds2\1)。 2.3 配置文件准备 打开%FR_HOME%\\WebReport\\WEB-INF\\resources下面的customconfig.xml文件,如果没有该文件,则复制config.xml至该文件夹中,并重命名为customconfig.xml,如下图: 2.4 修改配置文件 打开该文件,在如下位置处添加一行 2.5 效果查看 点击填报预览,在web端单击工具栏上的导入Excel按钮,选择excelimport.xls,可看到如下图效果: 已cpt。 在线查看示例效果请点击ExcelImport_2.cpt 完 成 模 板 请 参 照%FR_HOME%\\WebReport\\WEB-INF\\reportlets\\doc\\SpecialSubject\\ExcelImport\\ExcelImport_2. 3. 不根据标题匹配 FineReport Excel导入不定行默认首先要根据标题匹配,如果标题能够匹配2个或2个以上,则无需再执行根据位置匹配,但是如果在导入数据的时候希望根据位置匹配,但是标题又能匹配2个或2个以上,此时,如果使用默认设置,将无法根据位置匹配。 那么,我们可以通过修改配置文件,关闭使用标题匹配这个功能,即直接使用位置匹配。 3.1 配置文件准备 打开%FR_HOME%\\WebReport\\WEB-INF\\resources下面的customconfig.xml文件,如果没有该文件,则复制config.xml至该文件夹中,并重命名为customconfig.xml,如下图: 3.2 修改配置文件 打开该文件,在如下位置处添加一行 二、根据位置匹配 1. 描述 Excel导入行式报表根据位置匹配是指,Excel导入进来的时候需要导入数据的单元格从第几行第几列开始,那么Excel中数据就从第几行第几列开始,无关于标题名称,只跟位置有关系。 如下图,可以看到Excel中的列标题与FineReport模板的列标题完全不一致,但是位置却保持一致,FineReport模板中导入数据的单元格从B3开始,那么导入Excel中,从B3开始的数据就被导进来了: 注:行式报表根据位置匹配的前提是标题完全匹配不上,如果有2个或2个以上标题能匹配得上,那么就会使用根据标题匹配,但是如果通过配置文件设置了不执行根据标题匹配,那么就会直接执行根据位置匹配。 另:若要导入的是Excel2007需要将poi2007_fat.jar拷贝至%FR_HOME%\\WebReport\\WEB-INF\\lib 下。 2. 示例 2.1 模板准备 上图中我们可以看到,Excel中第一行数据(不包括标题)在B3~K3中,在填报模板中,导入数据的单元格也要在B3~K3,单元格从上到下扩展,并添加控件: 注:若导入的报表中不是空白的填报表,而是有取数的功能,则需要将报表的最左父格设置为列表显示。 2.2 报表填报属性设置 在报表填报属性中,只需要将第一行单元格与数据表的数据列进行绑定即可。 该例中,Excel中的原始数据供应商和类别都是具体的名字,若用户希望Excel导入的是名字,但实际入库的是ID怎么办呢? 此时可以在报表填报属性中使用map函数转换,以下具体介绍。 定义map函数需要的数据集 增加数据集ds1,SQL语句为:SELECT * FROM [供应商],查询出供应商ID与供应商名字的对应关系; 再增加数据集ds2,SQL语句为:SELECT * FROM [产品类别],查询出产品类别ID与类别名字的对应关系。 报表填报属性中使用map函数 Excel导入的是名字,使用map函数转换,如下图: 2.3 填报工具栏设置 默认填报工具栏是没有导入Excel按钮的,点击模板>模板web属性>填报页面设置,为该模板单独设置,勾选使用工具栏,为该报表单独设置工具栏,清空工具栏,然后在按钮面板中双击提交按钮和导入excel按钮,将这两个按钮添加到顶部工具栏中,如下图: 已.cpt。 在线查看模板效果请点击ExcelImport_1.cpt 注:在线查看模板需要用到示例中的excel,点击excelimport.xls下载。 另:如果模板中导入数据的单元格(设置了扩展属性并添加控件的单元格)从第6行开始,那么根据位置匹配导入的时候,Excel中数据就从第6行开始导入。 完 成 模 板 可 参 考%FR_HOME%\\WebReport\\WEB-INF\\reportlets\\doc\\SpecialSubject|\\ExcelImport\\ExcelImport_1 三、Excel导入固定行 1. 描述 Excel导入固定行就是指FineReport模板导入数据单元格是不可扩展的,导入的Excel行数与模板中设置的导入数据的单元格行数一致,如下图: 2. 示例 2.1 模板准备 打 开 模 板%FR_HOME%\\WebReport\\WEB-INF\\reportlets\\doc\\SpecialSubject|\\ExcelImport\\ExcelImport_1.cpt,修改如下图,设置B3单元格不可扩展,并复制第3行,粘贴四遍,使第4行至第7行与第3行一模一样: 2.2 填报工具栏设置 默认填报工具栏是没有导入Excel按钮的,点击模板>模板web属性>填报页面设置,为该模板单独设置,勾选使用工具栏,为该报表单独设置工具栏,清空工具栏,然后在按钮面板中双击提交按钮和导入excel按钮,将这两个按钮添加到顶部工具栏中,如下图: 2.3 导入Excel 保存模板,点击填报预览,在web端打开模板,点击导入Excel,选择excelimport.xls,可以看到只导入了5行数据,如下图: 注:导入固定行只能根据位置匹配 四、Excel双向导入 1. 描述 Excel双向导入是指标题行列是从单元格扩展得到的,并将导入数据的单元格也是可扩展的,如下图所示效果,标题字段通过横向扩展得到,导入数据的单元格纵向扩展,导入不定行数据: Excel双向导入模板在web端填报预览打开之后,其展示效果与固定标题行导入不定行是一样的,那么双向导入的逻辑仍然是首先根据标题匹配,如果标题匹配不上或者只有一个可以匹配上或者设置了不执行根据标题匹配,则执行根据位置匹配。 2. 示例 2.1 模板准备 新建一个模板,添加内置数据集,该数据集中只有一列数据,存储的是产品表中的字段名称,如下图: 内置数据集准备好之后,将字段名称数据列拖曳到A2单元格中,设置为横向扩展,并将A3单元格设置为纵向扩展,如下图: 2.2 工具栏设置 默认填报工具栏是没有导入Excel按钮的,点击模板>模板web属性>填报页面设置,为该模板单独设置,勾选使用工具栏,为该报表单独设置工具栏,清空工具栏,然后在按钮面板中双击提交按钮和导入excel按钮,将这两个按钮添加到顶部工具栏中,与根据位置匹配示例中的设置相同。 2.3 配置文件修改 FineReport默认不开启双向导入,故,如果要使用双向导入,首先要先修改配置文件,使其开启双向导入。 打开%FR_HOME%\\WebReport\\WEB-INF\\resources下面的customconfig.xml文件,如果没有该文件,则复制config.xml至该文件夹中,并重命名为customconfig.xml,如下图: 在customconfig.xml文件最后面的标签之前插入 2.4 Excel导入 点击填报预览按钮,在web端预览报表,可以看到标题字段是扩展出来的,点击工具栏上的导入Excel按钮,选择excelimport.xls,可以看到如下图所示效果: 已.cpt。 完 成 模 板 请 参 照%FR_HOME%\\WebReport\\WEB-INF\\reportlets\\doc\\SpecialSubject|\\ExcelImport\\ExcelImport_5 五、Excel导入错位 1. 问题描述 同一张模板,通过原样导出至Excel中,再刷新模板导入该Excel的时候,发现导入错位的问题,如下图所示: 2. 解决思路 这是因为FineReport新增了一个双向导入的功能,即Excel双向导入,其处理逻辑发生了变化,并对模板中合并的单元格进行了处理,导致导入错乱的情况出现,那么此时只需要在模板中导出隐藏行列,并使在导入Excel的时候,在配置文件中关闭双向导入即可。(双向导入默认关闭的,如果开启了需要关闭) 3. 操作步骤 3.1 模板准备 如上效果图所示,准备如下图所示的模板: 参数面板中有2个参数:starttime和endtime,其中开始日期的默认值为:DATEDELTA(today(), if(tointeger(WEEKDAY($Date)) == 0, -6, 1 - WEEKDAY($Date))),结束日期的默认值为:DATEDELTA(today(), if(tointeger(WEEKDAY($Date)) == 0, 0, 7 - WEEKDAY($Date)))。 DATEDELTA()等函数的具体含义请查看日期常用处理函数。 合并B3和C3单元格,其值为:=range($starttime, $endtime),合并D3和E3单元格,其值为WEEKDAY(B3),合并F3和G3单元格,设置其控件类型为文本控件。 注:模板中要出现合并的单元格。 3.2 导出Excel 保存模板,点击填报预览,在web端打开该模板,并输入值班人字段值,如下图,输入完成之后,点击工具栏上的输出>Excel>原样导出,如下图: 此时,就会导出如上图所示的Excel。 3.3 导入Excel 回到设计器界面,根据导入行式报表中的操作步骤,为该模板的工具栏添加导入Excel按钮,添加完成之后,重新填报预览该模板,点击导入Excel,选择刚刚导出的Excel文件,即可看到如下图所示效果,位置错乱: 3.4 导出隐藏行列 回到设计器,点击模板导出属性,勾选导出隐藏行和导出隐藏列,如下图: 3.5 结果查看 此时再重新导出Excel,导入Excel,就可以看到位置不会发生错乱了。 因篇幅问题不能全部显示,请点此查看更多更全内容