对于行式填报表的在线导入Excel,在6.5.5之前版本前需要和Excel数据复制到填报单元格一样,在导入Excel前手动增加足够的行数才能进行导入;从7.0版本开始,FR对此功能进行了改进,在导入Excel时,会根据Excel中的记录数自动扩展出需要的行数,下面就通过web表格控件FineReport来介绍一下。
工具/原料
web表格控件FineReport7.1.1
大小:148.2M 适用平台:windows/linux
根据标题匹配
1、模板沼敫裣秤准备打开模板%FR_HOME%\WebReport\WEB-INF\reportlets\doc\Spec足毂忍珩ialSubject|\ExcelImport\ExcelImport_1.cpt,修改如下图,删除左方和下方的空白行,将产品名称和类别列名称修改为产品和类别ID,与excel不一样,同时更换类别和供应商列的位置,再为每个单元格添加控件,这里添加文本控件:注:如果不想添加控件,可以设置不按照控件导入,但是这里是导入不定行,不论是否根据控件导入,必须保证左父格是可扩展的。
2、报表填报属性修改修改报表填报属性中列和数据库中列的对应,这里只需要修改类别ID对应的值,修改为map(C2, "ds2", 2, 1)。
3、效果查看点击填报预览,在web端单击工具栏上的导入Excel按钮,选择excelimport.xls,可看到如下图效果:
4、不根据标题匹配FineReport Excel导入不定行默认首先要根据标题匹配,如果标题能够匹配2个或2个以上,则无需再执行根据醐蛑臀谁位置匹配,但是如果在导入数据的时候希望根据位置匹配,但是标题又能匹配2个或2个以上,此时,如果使用默认设置,将无法根据位置匹配。那么,我们可以通过修改配置文件,关闭使用标题匹配这个功能,即直接使用位置匹配。
5、配置文件准备打开%FR_HOME%\WebReport\WEB-INF\resources下面的customconfig.xml文件,如果没有该文件,则复制config.xml至该文件夹中,并重命名为customconfig.xml,如下图:
6、修改配置文件打开该文件,在如下位置处添加一行<ExcelMatchTitle match = 'true'/>:
根据位置匹配
1、描述Excel导入行式报表根据位醅呓择锗置匹配是指,Excel导入进来的时候需要导入数据的单元格从第几行第几列开始,那么Excel中数据就从第几行第几列开始,无关于标烙疋艘烯题名称,只跟位置有关系。如下图,可以看到Excel中的列标题与FineReport模板的列标题完全不一致,但是位置却保持一致,FineReport模板中导入数据的单元格从B3开始,那么导入Excel中,从B3开始的数据就被导进来了:
2、注:行式报表根据位置匹配的前提是标题完全匹配不上,如果有2个或2个以上标题能匹配得上,那么就会使用根据标题匹配,但是如果通过配置文件设置了不执行根据标题匹配,那么就会直接执行根据位置匹配。
3、模板准备上图中我们可以看到,Excel中第一行数据(不包括标题)在B3~K3中,在填报模板中,导入数据的单元格也要在B3~K3,单元格从上到下扩展,并添加控件:注:若导入的报表中不是空白的填报表,而是有取数的功能,则需要将报表的最左父格设置为列表显示。
4、报表填报属性豹肉钕舞设置在报表填报属性中,只需要将第一行单元格与数据表的数据列进行绑定即可。该例中,Excel中的原始数据供应商和类别拎枋辏话都是具体的名字,若用户希望Excel导入的是名字,但实际入库的是ID怎么办呢?此时可以在报表填报属性中使用map函数转换,以下具体介绍。定义map函数需要的数据集增加数据集ds1,SQL语句为:SELECT * FROM [供应商],查询出供应商ID与供应商名字的对应关系;再增加数据集ds2,SQL语句为:SELECT * FROM [产品类别],查询出产品类别ID与类别名字的对应关系。报表填报属性中使用map函数Excel导入的是名字,使用map函数转换,如下图
5、填报工具栏设置默认填报工具栏是没有导入Excel按钮的,点击模板>模板web属性>填报页面设置,为该模板单独设置,勾选使用工具栏,为该报表单独设置工具栏,清空工具栏,然后在按钮面板中双击提交按钮和导入excel按钮,将这两个按钮添加到顶部工具栏中,如下图:
Excel导入固定行
1、描述Excel导入固定行就是指FineReport模板导入数据单元格是不可扩展的,导入的Excel行数与模板中设置的导入数据的单元格行数一致,如下图:
2、模板准备打开模板%FR_HOME%\WebReport\WEB-INF\reportlets\doc\SpecialSubject|\ExcelImport\ExcelImport_1.cpt,修改如下图,设置B3单元格不可扩展,并复制第3行,粘贴四遍,使第4行至第7行与第3行一模一样:
3、填报工具栏设置默认填报工具栏是没有导入Excel按钮的,点击模板>模板web属性>填报页面设置,为该模板单独设置,勾选使用工具栏,为该报表单独设置工具栏,清空工具栏,然后在按钮面板中双击提交按钮和导入excel按钮,将这两个按钮添加到顶部工具栏中,如下图:
4、导入Excel保存模板,点击填报预览,在web端打开模板,点击导入Excel,选择excelimport.xls,可以看到只导入了5行数据,如下图:
Excel双向导入
1、描述Excel双向导入是指标题行列是从单元格扩展得到的,并将导入数据的单元格也是可扩展的,如下图所示效果,标题字段通过横向扩展得到,导入数据的单元格纵向扩展,导入不定行数据:
2、Excel双向导入模板在web端填报预览打开之后,其展示效果与固定标题行导入不定行是一样的,那么双向导入的逻辑仍然是首先根据标题匹配,如果标题匹配不上或者只有一个可以匹配上或者设置了不执行根据标题匹配,则执行根据位置匹配。
3、模板准备新建一个模板,添加内置数据集,该数据集中只有一列数据,存储的是产品表中的字段名称,如下图:
4、内置数据集准备好之后,将字段名称数据列拖曳到A2单元格中,设置为横向扩展,并将A3单元格设置为纵向扩展,如下图:
5、工具栏设置默认填报工具栏是没有导入Excel按钮的,点击模板>模板web属性>填报页面设置,为该模板单独设置,勾选使用工具栏,为该报表单独设置工具栏,清空工具栏,然后在按钮面板中双击提交按钮和导入excel按钮,将这两个按钮添加到顶部工具栏中,与根据位置匹配示例中的设置相同。
6、配置文件修改FineReport默认不开启双向导入,故,如果要使用双向导入,首先要先修改配置文件,使其开启双向导入。打开%FR_HOME%\We芟鲠阻缒bReport\WEB-INF\resources下面的customconfig.xml文件,如果没有该文件,则复制config.xml至该文件夹中,并重命名为customconfig.xml,如下图:
7、在customconfig.xml文件最后面的</ReportServerParameter>标签之前插入<ImportDoubleDir doubledir = "true"/>,表示开启双向导入,如下图:
8、Excel导入点击填报预览按钮,在web端预览报表,可以看到标题字段是扩展出来的,点击工具栏上的导入Excel按钮,选择excelimport.xls,可以看到如下图所示效果:
Excel导入错位
1、问题描述同一张模板,通过原样导出至Excel中,再刷新模板导入该Excel的时候,发现导入错位的问题,如下图所示:
2、解决思路这是因为FineReport在7.1版本中新增了一个双向导入的功能,即Excel双向导入,其处理逻辑发生了变化,并对模板中合并的单元格进行了处理,导致导入错乱的情况出现,那么此时只需要在模板中导出隐藏行列,并使在导入Excel的时候,不使用双向导入,即在配置文件中关闭双向导入(双向导入默认关闭的,如果开启了需要关闭)即可。
3、模板准备如上效果图所示,准备如下图所示的模板:
4、参数面板中有2个参数:starttime和endtime,其中开始日期的默认值为:DATEDELTA(to颊俄岿髭day(), 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单元格,设置其控件类型为文本控件。注:模板中要出现合并的单元格。
5、导出Excel保存模板,点击填报预览,在web端打开该模板,并输入值班人字段值,如下图,输入完成之后,点击工具栏上的输出>Excel>原样导出,如下图:
6、此时,就会导出如上图所示的Excel。
7、导入Excel回到设计器界面,根据导入行式报表中的操作步骤,为该模板的工具栏添加导入Excel按钮,添加完成之后,重新填报预览该模板,点击导入Excel,选择刚刚导出的Excel文件,即可看到如下图所示效果,位置错乱:
8、导出隐藏行列回到设计器,点击模板导出属性,勾选导出隐藏行和导出隐藏列,如下图:
9、结果查看此时再重新导出Excel,导入Excel,就可以看到位置不会发生错乱了。