报表开发之批量导入导出excel

在日常使用报表过程中,会有这样一种情况,你将Excel表分发给各个员工,员工填完后,统一整理成多个Excel,你需要将这些数据,用报表的填报功能,提交录入到数据库中,这样一来可避免到服务器机房录数据的繁琐步骤,但是无论是批量导入和还是导出Excel,这对诸多报表软件或称集成报表功能的系统来说都是不容易的。

解决Excel导入的性能问题,可以利用FineReport开发的op=excel_submit功能,来实现不预览报表即可对填报表导入Excel。

根据报表工程的使用方式不同,批量导入Excel中权限控制方式有所不同。

报表工程一般有以下两种方式:

1、使用FineReport自主开发的数据决策系统op=fs使用报表工程;

2、将报表工程集成到自己的系统中。

1.1 直接使用op=fs

用户使用数据决策系统op=fs查看报表,那么所有的权限都是通过op=fs进行认证,用户也都是添加在op=fs中。

1.2 集成FR报表工程

用户将FR报表工程集成到自己的系统中,通过自己的系统查看报表,那么FR所有的权限都是通过报表平台管理op=fr_platform进行认证,详细请查权限管理。

除了批量导入,还有批量导出。一张报表可以根据不同的条件统计出不同的数据结果,有时希望将每一种条件下的结果都保存下来如导出成Excel文件至磁盘,可以在后台调用FineReport的导出接口ExcelExporter将每种情况下的结果批量保存起来。

实现的原理是遍历读取para.txt中的每组参数值,将该参数值组合传入模板进行计算,然后将结果导出excel,循环直至最后一条参数组合。

例如:

由于我们需要对模板输入参数对应的值才能够计算得到最终的结果,因此我们需要所有可能的参数值组合,可以来源于数据库中某个表,或者某个文件。这里我们假设所需的参数值组合保存在WebReport\WEB-INF\para.txt中。如下图新建para.txt

如果模板有两个参数格式如下:

批量导出程序,完整代码如下:

package com.fr.io;      

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.Arrays;
import com.fr.base.FRContext;
import com.fr.general.ModuleContext;
import com.fr.dav.LocalEnv;  

import com.fr.io.exporter.ExcelExporter;
import com.fr.main.TemplateWorkBook;
import com.fr.main.workbook.ResultWorkBook;
import com.fr.report.module.EngineModule;
import com.fr.stable.StableUtils;
import com.fr.stable.WriteActor;

 public class ExportBatch {
     public static void main(String[] args) {
         try {
             // 定义报表运行环境,用于执行报表
             String envpath = "D:\\FineReport_7.1\\WebReport\\WEB-INF";
             FRContext.setCurrentEnv(new LocalEnv(envpath));
     ModuleContext.startModule(EngineModule.class.getName());
    // 读取环境下的模板文件
    TemplateWorkBook workbook = TemplateWorkBookIO.readTemplateWorkBook(FRContext.getCurrentEnv(),
        "doc\\Primary\\DetailReport\\Details.cpt");
    // 读取用于保存的参数值的txt文件
    File parafile = new File(envpath + "\\para.txt");
    FileInputStream fileinputstream;
    fileinputstream = new FileInputStream(parafile);
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileinputstream));
    // 定义保存参数的map,用于执行报表
    java.util.Map paramap = new java.util.HashMap();
    /*
     * 遍历参数值所在txt文件,txt文件中参数保存形式为 para1,para2 江苏,陈羽 江苏,安娜 首先取出第一行保存参数名称
     * 遍历每个参数组合,如para1=江苏、para2=陈羽,根据参数执行模板,并将结果导出excel excel文件名为名称+导出编号
     */
    // 读第一行,保存参数名称
    String lineText = bufferedReader.readLine();
    lineText = lineText.trim();
    String[] paraname = StableUtils.splitString(lineText, ",");
    System.out.println(Arrays.toString(paraname));
    // 遍历每个参数组合,执行模板,导出结果
    int number = 0;
    while ((lineText = bufferedReader.readLine()) != null) {
        lineText = lineText.trim();
        String[] paravalue = StableUtils.splitString(lineText, ",");
        for (int j = 0; j < paravalue.length; j++) {
            paramap.put(paraname[j], paravalue[j]);
        }
        ResultWorkBook result = workbook.execute(paramap,new WriteActor());
        OutputStream outputstream = new FileOutputStream(new File("E:\\ExportEg" + number + ".xls"));
        ExcelExporter excelexporter = new ExcelExporter();
        excelexporter.export(outputstream, result);
        // 最后要清空一下参数map,用于下次计算
        paramap.clear();
        number++;
        outputstream.close();
        }
    ModuleContext.stopModules();
    } catch (Exception e) {
        e.printStackTrace();
    }
          }
}  

上述为示例程序,其中报表运行环境与模板名称等需要根据您实际环境进行修改。编译运行该程序您便可以得到结果,在E盘根目录下将生成3个Excel文件,如下

内容分别为

这样批量导出便成功了。

时间: 2024-09-30 06:09:07

报表开发之批量导入导出excel的相关文章

基于SSM的POI导入导出Excel实战尾篇-其余功能实战(mvc三层开发模式体验)

业务需求:前几篇基本已经介绍完毕项目的核心功能,即POI导入导出Excel,为了整个项目的完整性,并让诸位童鞋体验体验企业级javaweb应用mvc三层模式的开发流程,本文将介绍一下项目的其余功能,包括搜索,新增,修改,删除 需求分析:作为程序员,在项目中经常接触的就是CRUD了,本篇博文将整合jquery-easyui框架(版本采用1.5.5.4)异步实现上述几个功能,给项目画上一个完整的句号!当然啦,在刚开始开发时,对于自己开发好的后端接口完全可以用Postman进行模拟(我就是这样做的),

使用CSVDE命令批量导入/导出AD用户

使用CSVDE命令批量导入/导出AD用户 CSVDE命令行工具可以将带有用户信息的CSV文件,批量导入/导出AD中. 导入的基本语法命令是这样的: csvde -i -f c:\filename.csv -k 输入以下命令查看具体参数: csvde /? 首先在Excel中设置好用户信息,然后将文件保存为csv格式. 在cmd中执行导入命令. 可以看到,导入成功.在AD中查看: 可以看到新增加的两个用户,但它们与其余三个不同,有个向下的箭头.这是因为CSVDE命令是无法导入密码的,所以导入的用户

PowerShell 批量导入/导出Active Directory

PowerShell 批量导入/导出Active Directory 最近因为公司要求,需要导入20个供应商.20个客户到AD域中,刚开始手动加入了2个供应商,2个客户.但是感觉费时费力.如果能够找到一个命令,批量导入AD该多好呀. 因为之前有师兄在AD方面留下的有文档,发现AD域用户导出的命令是这样的: csvde -f E:\20131015.csv -r "(objectClass=user)" -d "OU=XXX,DC=XXX,DC=com" -u 这里对

.NET 导入导出Excel

第一种方式:OleDb 需要安装office,且读数据慢,而且有数据格式的Cell读出数据不正确等问题.放弃. 第二种方式:NPOI开源库 使用NPOI导入导出Excel应该是.NET开发很常用的手段. 代码如下: 1 public ExcelHelper(string fileName) 2 { 3 this.fileName = fileName; 4 disposed = false; 5 } 6 7 /// <summary> 8 /// 将DataTable数据导入到excel中 9

NPOI导入导出Excel

.net mvc利用NPOI导入导出excel 1.导出Excel :首先引用NPOI包,从这里下载>download(Action一定要用FileResult) /// <summary> /// 批量导出需要导出的列表 /// </summary> /// <returns></returns> public FileResult ExportStu2() { //获取list数据 var checkList = (from oc in db.Or

基于SSM的POI导入导出Excel实战第二篇-导出EXCEL

业务需求:这里我以产品信息为例,用于POI导入导出Excel实战的操作对象 需求分析:我们要导出的数据格式比较简单,其实就是待导出的表(视图)的数据,如下图所示: 实现思路:A.会发现待导出的数据列表是一个矩阵式的格式,即二维的形式 B.其中的头部id name unit price stock 等字段field是固定不变的,将会充当excel的头部 C.以数据行的角度观察数据列表,会发现每一行每一列的值都是B所指的那些字段一一对应的取值value D.由此可以得出这些数据组织是由每一行数据组成

基于SSM的POI导入导出Excel实战第一篇-SSM框架的整合

业务背景:在JavaWeb应用开发中,经常需要将应用系统中某些业务数据导出到Excel中,又或者需要将这些业务数据先收集到Excel然后一键导入到系统 业务需求:如何用Java实现导入导出Excel 需求分析:目前流行的Java导入导出Excel的框架有POI跟JXL,这两者的优缺点在这里我就不作比较了,感兴趣的童鞋可以自行搜索了解一下; 技术选型:从本文开始,我将分享一下如何基于SSM框架+POI实现Java应用导入导出Excel,数据库采用mysql5.6,应用服务器采用tomcat7 工具

Java利用POI导入导出Excel中的数据

     首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地址http://poi.apache.org/download.html,有兴趣的朋友也可以去看看其中的API.      下面分享一下在对POI进行基本操作时觉得需要注意的两点:       1.POI中针对xlsx/xls是需要create different Workbook instance

导入导出Excel的Java工具类ExcelUtil

在编写ExcelUtil之前,在网上查了一些资料.java中用来处理Excel的第三方开源项目主要就是POI和JXL.poi功能强大,但是比较耗资源,对于大数据量的导入导出性能不是太好:jxl功能简单,但是性能比较好. 由于本项目的导入导出更多关注性能问题,而且jxl提供的功能基本也都够用了,于是选择了jxl作为支持. 实战 导出就是将List转化为Excel(listToExcel) 导入就是将Excel转化为List(excelToList) 导入导出中会出现各种各样的问题,比如:数据源为空