html5自定义报表工具,利用javascript和jxl实现自定义报表的输出

因为之前有项目需要做大量报表,编写报表,花费大量时间,为了减少时间,所以研究下自定义报表实现方式。在很多报表工具,它们实现自定义报表的方式:基本都是数据集和数据显示格式这部分提取出来,实现自定义。本文也主要是数据集和数据显示格式两部分的自定义,选用技术:利用javascript定义数据集,jxl定义报表的格式。

在jdk6开始,java可以执行javascript脚本语言了,而jxl可以先定义好模板,再把数据集的内容填充模板中。本来考虑数据集的定义是做成类似sqlmap的xml配置,但是在测试时,发现灵活性欠缺。记起java可以执行javascript,如果使用javascript来定义数据集,这样就可以利用javascript的语法,数据集的定义更灵活,可配置性更高。

本文的测试代码,是用了上一篇的介绍spring mvc的例子http://www.blogjava.net/pengo/archive/2010/11/28/339229.html开发的,下面开始贴代码,以一个简单的学生成绩报表为例

测试的实体类:

学生类

1

4f1150b881333f12a311ae9ef34da474.png@Entity24f1150b881333f12a311ae9ef34da474.png@Table(name="student")31fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassStudentimplementsSerializable9b8a8a44dd1c74ae49c20a7cd451974e.png{4d18c02628675d0a2c816449d98bda930.pngprivatestaticfinallongserialVersionUID=1L;5d18c02628675d0a2c816449d98bda930.png    @Id6d18c02628675d0a2c816449d98bda930.png    @Basic(optional=false)7d18c02628675d0a2c816449d98bda930.png    @GeneratedValue(strategy=GenerationType.IDENTITY)8d18c02628675d0a2c816449d98bda930.png    @Column(name="id", nullable=false)9d18c02628675d0a2c816449d98bda930.pngprivateInteger id;10d18c02628675d0a2c816449d98bda930.png    @Column(name="name")11d18c02628675d0a2c816449d98bda930.pngprivateString user;12d18c02628675d0a2c816449d98bda930.png    @Column(name="psw")13d18c02628675d0a2c816449d98bda930.pngprivateString psw;1497e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicInteger getId()9b8a8a44dd1c74ae49c20a7cd451974e.png{15d18c02628675d0a2c816449d98bda930.pngreturnid;16ecedf933ec37d714bd4c2545da43add2.png    }1797e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidsetId(Integer id)9b8a8a44dd1c74ae49c20a7cd451974e.png{18d18c02628675d0a2c816449d98bda930.pngthis.id=id;19ecedf933ec37d714bd4c2545da43add2.png    }20d18c02628675d0a2c816449d98bda930.png2197e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicString getUser()9b8a8a44dd1c74ae49c20a7cd451974e.png{22d18c02628675d0a2c816449d98bda930.pngreturnuser;23ecedf933ec37d714bd4c2545da43add2.png    }2497e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidsetUser(String user)9b8a8a44dd1c74ae49c20a7cd451974e.png{25d18c02628675d0a2c816449d98bda930.pngthis.user=user;26ecedf933ec37d714bd4c2545da43add2.png    }2797e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicString getPsw()9b8a8a44dd1c74ae49c20a7cd451974e.png{28d18c02628675d0a2c816449d98bda930.pngreturnpsw;29ecedf933ec37d714bd4c2545da43add2.png    }3097e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidsetPsw(String psw)9b8a8a44dd1c74ae49c20a7cd451974e.png{31d18c02628675d0a2c816449d98bda930.pngthis.psw=psw;32ecedf933ec37d714bd4c2545da43add2.png    }338f1ba5b45633e9678d1db480c16cae3f.png}344f1150b881333f12a311ae9ef34da474.png

课程类

1

4f1150b881333f12a311ae9ef34da474.png@Entity24f1150b881333f12a311ae9ef34da474.png@Table(name="course")31fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassCourse9b8a8a44dd1c74ae49c20a7cd451974e.png{4d18c02628675d0a2c816449d98bda930.png    @Id5d18c02628675d0a2c816449d98bda930.png    @Basic(optional=false)6d18c02628675d0a2c816449d98bda930.png    @GeneratedValue(strategy=GenerationType.IDENTITY)7d18c02628675d0a2c816449d98bda930.png    @Column(name="id", nullable=false)8d18c02628675d0a2c816449d98bda930.pngprivateInteger id;9d18c02628675d0a2c816449d98bda930.png    @Column(name="name")10d18c02628675d0a2c816449d98bda930.pngprivateString name;1197e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicInteger getId()9b8a8a44dd1c74ae49c20a7cd451974e.png{12d18c02628675d0a2c816449d98bda930.pngreturnid;13ecedf933ec37d714bd4c2545da43add2.png    }1497e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidsetId(Integer id)9b8a8a44dd1c74ae49c20a7cd451974e.png{15d18c02628675d0a2c816449d98bda930.pngthis.id=id;16ecedf933ec37d714bd4c2545da43add2.png    }1797e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicString getName()9b8a8a44dd1c74ae49c20a7cd451974e.png{18d18c02628675d0a2c816449d98bda930.pngreturnname;19ecedf933ec37d714bd4c2545da43add2.png    }2097e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidsetName(String name)9b8a8a44dd1c74ae49c20a7cd451974e.png{21d18c02628675d0a2c816449d98bda930.pngthis.name=name;22ecedf933ec37d714bd4c2545da43add2.png    }238f1ba5b45633e9678d1db480c16cae3f.png}

成绩类

1

4f1150b881333f12a311ae9ef34da474.png@Entity24f1150b881333f12a311ae9ef34da474.png@Table(name="score")31fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassScore9b8a8a44dd1c74ae49c20a7cd451974e.png{4d18c02628675d0a2c816449d98bda930.pngprivatestaticfinallongserialVersionUID=1L;5d18c02628675d0a2c816449d98bda930.png    @Id6d18c02628675d0a2c816449d98bda930.png    @Basic(optional=false)7d18c02628675d0a2c816449d98bda930.png    @GeneratedValue(strategy=GenerationType.IDENTITY)8d18c02628675d0a2c816449d98bda930.png    @Column(name="id", nullable=false)9d18c02628675d0a2c816449d98bda930.pngprivateInteger id;10d18c02628675d0a2c816449d98bda930.png    @Column(name="studentId")11d18c02628675d0a2c816449d98bda930.pngprivateInteger studentId;12d18c02628675d0a2c816449d98bda930.png    @Column(name="courseId")13d18c02628675d0a2c816449d98bda930.pngprivateInteger courseId;14d18c02628675d0a2c816449d98bda930.png    @Column(name="result")15d18c02628675d0a2c816449d98bda930.pngprivateDouble result;1697e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicInteger getId()9b8a8a44dd1c74ae49c20a7cd451974e.png{17d18c02628675d0a2c816449d98bda930.pngreturnid;18ecedf933ec37d714bd4c2545da43add2.png    }1997e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidsetId(Integer id)9b8a8a44dd1c74ae49c20a7cd451974e.png{20d18c02628675d0a2c816449d98bda930.pngthis.id=id;21ecedf933ec37d714bd4c2545da43add2.png    }2297e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicInteger getStudentId()9b8a8a44dd1c74ae49c20a7cd451974e.png{23d18c02628675d0a2c816449d98bda930.pngreturnstudentId;24ecedf933ec37d714bd4c2545da43add2.png    }2597e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidsetStudentId(Integer studentId)9b8a8a44dd1c74ae49c20a7cd451974e.png{26d18c02628675d0a2c816449d98bda930.pngthis.studentId=studentId;27ecedf933ec37d714bd4c2545da43add2.png    }2897e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicInteger getCourseId()9b8a8a44dd1c74ae49c20a7cd451974e.png{29d18c02628675d0a2c816449d98bda930.pngreturncourseId;30ecedf933ec37d714bd4c2545da43add2.png    }3197e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidsetCourseId(Integer courseId)9b8a8a44dd1c74ae49c20a7cd451974e.png{32d18c02628675d0a2c816449d98bda930.pngthis.courseId=courseId;33ecedf933ec37d714bd4c2545da43add2.png    }3497e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicDouble getResult()9b8a8a44dd1c74ae49c20a7cd451974e.png{35d18c02628675d0a2c816449d98bda930.pngreturnresult;36ecedf933ec37d714bd4c2545da43add2.png    }3797e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidsetResult(Double result)9b8a8a44dd1c74ae49c20a7cd451974e.png{38d18c02628675d0a2c816449d98bda930.pngthis.result=result;39ecedf933ec37d714bd4c2545da43add2.png    }408f1ba5b45633e9678d1db480c16cae3f.png}

学生student类数据

id     psw     name

1     111     李明

2     111     张明

课程course类数据

id   name

1   数学

2   语文

3   英语

成绩score类数据

id  courseId  result  studentId

1      1             70          1

2      2             71          1

3      3             73          1

4     1              80          2

5     2              81           2

6     3              88          2

Viw只做了一个简单的jsp,页面只放了一个按钮,点击按钮时,生成一个excel文件,并返回给客户。

1

4f1150b881333f12a311ae9ef34da474.pngreport.jsp24f1150b881333f12a311ae9ef34da474.png    pageEncoding="UTF-8"%>44f1150b881333f12a311ae9ef34da474.png54f1150b881333f12a311ae9ef34da474.pnghtml PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">64f1150b881333f12a311ae9ef34da474.png74f1150b881333f12a311ae9ef34da474.png

8 4f1150b881333f12a311ae9ef34da474.png9 4f1150b881333f12a311ae9ef34da474.pngInsert title here10 4f1150b881333f12a311ae9ef34da474.png11 4f1150b881333f12a311ae9ef34da474.png17 4f1150b881333f12a311ae9ef34da474.png18 4f1150b881333f12a311ae9ef34da474.png19 4f1150b881333f12a311ae9ef34da474.pngreport eeeee
20 4f1150b881333f12a311ae9ef34da474.png21 4f1150b881333f12a311ae9ef34da474.png22 4f1150b881333f12a311ae9ef34da474.png23 4f1150b881333f12a311ae9ef34da474.png

Controller实现

1

4f1150b881333f12a311ae9ef34da474.png@Controller24f1150b881333f12a311ae9ef34da474.png@RequestMapping("/report.do")31fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassReportController9b8a8a44dd1c74ae49c20a7cd451974e.png{4d18c02628675d0a2c816449d98bda930.pngprotectedfinaltransientLog log=LogFactory5d18c02628675d0a2c816449d98bda930.png            .getLog(ReportController.class);6d18c02628675d0a2c816449d98bda930.png    @Autowired7d18c02628675d0a2c816449d98bda930.pngprivateReportService reportService;8d18c02628675d0a2c816449d98bda930.png9d18c02628675d0a2c816449d98bda930.png    @RequestMapping1097e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicString load(ModelMap modelMap)9b8a8a44dd1c74ae49c20a7cd451974e.png{11d18c02628675d0a2c816449d98bda930.pngreturn"report";12ecedf933ec37d714bd4c2545da43add2.png    }13d18c02628675d0a2c816449d98bda930.png14d18c02628675d0a2c816449d98bda930.png    @RequestMapping(params="method=export")15d18c02628675d0a2c816449d98bda930.pngpublicvoidexport(HttpServletRequest request,1697e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif            HttpServletResponse response, ModelMap modelMap)throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{17d18c02628675d0a2c816449d98bda930.png        Map beans=newHashMap();18d18c02628675d0a2c816449d98bda930.png        String jsFile=request.getParameter("js");19d18c02628675d0a2c816449d98bda930.png        String path=request.getSession().getServletContext().getRealPath("")20d18c02628675d0a2c816449d98bda930.png+"/WEB-INF";21d18c02628675d0a2c816449d98bda930.png        ScriptEngineManager factory=newScriptEngineManager();22d18c02628675d0a2c816449d98bda930.png        ScriptEngine engine=factory.getEngineByName("JavaScript");23d18c02628675d0a2c816449d98bda930.png//加载js脚本24d18c02628675d0a2c816449d98bda930.pngInputStreamReader in=newInputStreamReader(newFileInputStream(path25d18c02628675d0a2c816449d98bda930.png+"/config/"+jsFile+".js"));26d18c02628675d0a2c816449d98bda930.png        engine.eval(in);27d18c02628675d0a2c816449d98bda930.png        Invocable inv=(Invocable) engine;28d18c02628675d0a2c816449d98bda930.png        String excel=engine.get("excel").toString();29d18c02628675d0a2c816449d98bda930.png//获取js文件中配置的sql,取得数据集,并将数据集传给jxl30d18c02628675d0a2c816449d98bda930.pngObject reObj=inv.invokeFunction("init");31d18c02628675d0a2c816449d98bda930.png        NativeArray myArray=(NativeArray) reObj;32d18c02628675d0a2c816449d98bda930.png        Object[] array=newObject[(int) myArray.getLength()];3397e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giffor(Object o : myArray.getIds())9b8a8a44dd1c74ae49c20a7cd451974e.png{34d18c02628675d0a2c816449d98bda930.pngintindex=(Integer) o;35d18c02628675d0a2c816449d98bda930.png            array[index]=myArray.get(index,null);36d18c02628675d0a2c816449d98bda930.png            NativeObject aObj=(NativeObject) array[index];37d18c02628675d0a2c816449d98bda930.png            String name=aObj.get("name",null).toString();38d18c02628675d0a2c816449d98bda930.png            String method=aObj.get("method",null).toString();39d18c02628675d0a2c816449d98bda930.png            String hql=inv.invokeFunction(method).toString();40d18c02628675d0a2c816449d98bda930.png            List list=reportService.getList(hql);41d18c02628675d0a2c816449d98bda930.png            beans.put(name, list);42ecedf933ec37d714bd4c2545da43add2.png        }43d18c02628675d0a2c816449d98bda930.png        Connection conn=reportService.getConnection();44d18c02628675d0a2c816449d98bda930.png        String templateFileName=path+excel;45d18c02628675d0a2c816449d98bda930.png        ReportManager rm=newReportManagerImpl(conn, beans);46d18c02628675d0a2c816449d98bda930.png        beans.put("rm", rm);47d18c02628675d0a2c816449d98bda930.png        InputStream is=newBufferedInputStream(newFileInputStream(48d18c02628675d0a2c816449d98bda930.png                templateFileName));49d18c02628675d0a2c816449d98bda930.png//jxl根据数据集,生成excel报表50d18c02628675d0a2c816449d98bda930.pngXLSTransformer transformer=newXLSTransformer();51d18c02628675d0a2c816449d98bda930.png        Workbook resultWorkbook=transformer.transformXLS(is, beans);52d18c02628675d0a2c816449d98bda930.png        response.setHeader("Content-Transfer-Encoding","base64");53d18c02628675d0a2c816449d98bda930.png        response.setContentType("application/octet-stream");54d18c02628675d0a2c816449d98bda930.png        String contentDisposition="attachment;filename=\"score.xls\"";55d18c02628675d0a2c816449d98bda930.png        response.setHeader("Content-Disposition", contentDisposition);56d18c02628675d0a2c816449d98bda930.png        java.io.OutputStream outputStream=response.getOutputStream();57d18c02628675d0a2c816449d98bda930.png        resultWorkbook.write(outputStream);58d18c02628675d0a2c816449d98bda930.png        outputStream.flush();59d18c02628675d0a2c816449d98bda930.png        outputStream.close();60d18c02628675d0a2c816449d98bda930.png        outputStream=null;61d18c02628675d0a2c816449d98bda930.png        resultWorkbook=null;62ecedf933ec37d714bd4c2545da43add2.png    }638f1ba5b45633e9678d1db480c16cae3f.png}

Service类实现

1

4f1150b881333f12a311ae9ef34da474.png@Service21fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassReportService9b8a8a44dd1c74ae49c20a7cd451974e.png{3d18c02628675d0a2c816449d98bda930.pngprotectedfinaltransientLog log=LogFactory4d18c02628675d0a2c816449d98bda930.png    .getLog(ReportService.class);5d18c02628675d0a2c816449d98bda930.png    @Autowired6d18c02628675d0a2c816449d98bda930.pngprivateEntityDao entityDao;7d18c02628675d0a2c816449d98bda930.png8d18c02628675d0a2c816449d98bda930.png    @Transactional997e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicList getList(String hql)9b8a8a44dd1c74ae49c20a7cd451974e.png{10d18c02628675d0a2c816449d98bda930.png        StringBuffer sff=newStringBuffer();11d18c02628675d0a2c816449d98bda930.png        sff.append(hql);12d18c02628675d0a2c816449d98bda930.pngreturnentityDao.createQuery(sff.toString());13ecedf933ec37d714bd4c2545da43add2.png    }14d18c02628675d0a2c816449d98bda930.png1597e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicConnection getConnection()9b8a8a44dd1c74ae49c20a7cd451974e.png{16d18c02628675d0a2c816449d98bda930.pngreturnentityDao.getConnection();17ecedf933ec37d714bd4c2545da43add2.png    }188f1ba5b45633e9678d1db480c16cae3f.png}

studentScore.js配置数据集的获取

1

4f1150b881333f12a311ae9ef34da474.pngfunction HqlObject(name, method)21fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif9b8a8a44dd1c74ae49c20a7cd451974e.png{3d18c02628675d0a2c816449d98bda930.pngthis.name=name;4d18c02628675d0a2c816449d98bda930.pngthis.method=method;5d18c02628675d0a2c816449d98bda930.pngthis.state=0;68f1ba5b45633e9678d1db480c16cae3f.png}74f1150b881333f12a311ae9ef34da474.pngvar excel="/temple/studentscore.xls";81fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.giffunction init()9b8a8a44dd1c74ae49c20a7cd451974e.png{9d18c02628675d0a2c816449d98bda930.png    var hql1=newHqlObject("students","getStudents");10d18c02628675d0a2c816449d98bda930.png    var hql2=newHqlObject("courses","getCourses");11d18c02628675d0a2c816449d98bda930.png    var myArray=newArray(2);12d18c02628675d0a2c816449d98bda930.png    myArray[0]=hql1;13d18c02628675d0a2c816449d98bda930.png    myArray[1]=hql2;14d18c02628675d0a2c816449d98bda930.pngreturnmyArray;158f1ba5b45633e9678d1db480c16cae3f.png}164f1150b881333f12a311ae9ef34da474.png171fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.giffunction getStudents(parame)9b8a8a44dd1c74ae49c20a7cd451974e.png{18d18c02628675d0a2c816449d98bda930.png    var sql="select a from Student a where a.id = 1";19d18c02628675d0a2c816449d98bda930.pngreturnsql;208f1ba5b45633e9678d1db480c16cae3f.png}214f1150b881333f12a311ae9ef34da474.png221fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.giffunction getCourses(parame)9b8a8a44dd1c74ae49c20a7cd451974e.png{23d18c02628675d0a2c816449d98bda930.png    var sql="select a from Course a";24d18c02628675d0a2c816449d98bda930.pngreturnsql;258f1ba5b45633e9678d1db480c16cae3f.png}

jxl的excel模板

f3f1c5f541c2ced0718bd905d199d770.png

表达式内容:

学生 | | ${c.name} |

${st.user} | | ${sc.result} |

下面看测试运行效果

620a2afffcead3c73d77792b5f36c308.png

079232358a4e79be121c4fefe8378a21.png

如果有兴趣的,欢迎交流学习。

源码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值