上一篇文章http://blog.csdn.net/pspr2/article/details/72843356讲了如何集成到spring MVC中,这次介绍集成到开源框架spring boot中。
1.自建项目,并建立好与数据库的连接以及web项目。
类似以下配置:
1.1 application.yml
# Server settings server: port: 8080 address: localhost # SPRING PROFILES spring: http: encoding.charset: UTF-8 encoding.enable: true encoding.force: true datasource: name: gendb type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/{数据库}?useConfigs=maxPerformance&characterEncoding=utf8 username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver minIdle: 1 maxActive: 2 initialSize: 1 timeBetweenEvictionRunsMillis: 3000 minEvictableIdleTimeMillis: 300000 validationQuery: select 1 testWhileIdle: true testOnBorrow: false testOnReturn: false filters: stat,wall,slf4j 1.2 pom.xml
<dependencies> <!-- 报表 --> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.4.0</version> <!-- 可选用最新的版本 --> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.10.1</version> <!-- 过高版本会出现导出xls格式失败问题 --> </dependency> <dependency> <groupId>com.lowagie</groupId> <artifactId>itextasian</artifactId> <version>2.1.7.js2</version> <!-- 这两个dependency已经无须使用,见我最新的博客 --> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>1.4.3.RELEASE</version> </dependency> </dependencies> 这样,配置方面就完成了。
2.具体代码部分
2.1 先定义ViewResolver
package *.security.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.view.jasperreports.JasperReportsMultiFormatView; import org.springframework.web.servlet.view.jasperreports.JasperReportsViewResolver; /** * jasper report 配置class * Created by X-J on 2017/6/1. */ @Configuration public class JasperConfig extends WebMvcConfigurerAdapter { private final static String REPORT_DATA_KEY = "datasource"; private final static String PATH_KEY = "classpath:jaspertemplate/"; private final static String TYPE_KEY = ".jrxml"; private final static String VIEW_KEY = "Report"; @Override public void configureDefaultServletHandling(final DefaultServletHandlerConfigurer configurer) { configurer.enable(); } @Bean public JasperReportsViewResolver getJasperReportsViewResolver() { JasperReportsViewResolver resolver = new JasperReportsViewResolver(); resolver.setPrefix(PATH_KEY); //resource文件夹下放模板的路径 resolver.setSuffix(TYPE_KEY); //模板文件的类型,这里选用jrxml而不是编译之后的jasper //JasperReportsMultiFormatView定义了ReportDataKey,这里给定key为datasource,后面controller的时候会用到 resolver.setReportDataKey(REPORT_DATA_KEY); resolver.setViewNames("*" + VIEW_KEY + "*"); //视图名称,模板名称需要符合 *你定义的key* 如*Report* resolver.setViewClass(JasperReportsMultiFormatView.class); //视图类 resolver.setOrder(0); //顺序为第一位 return resolver; } } 2.2 controller入口
package *.controller.demo; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; import net.sf.jasperreports.engine.JRDataSource; import net.sf.jasperreports.engine.JRResultSetDataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; /** * Created by X-J on 2017/6/1. */ @Controller @RequestMapping(value = "/reports") public class DemoReportController { private static final String REPORT_NAME = "reportName"; private static final String FILE_FORMAT = "format"; private static final String DATASOURCE = "datasource"; private static final String queryStr = "你的sql语句"; @Autowired private DataSource dbSource; /** * 直接使用模板文件中的sql语句得到报表 * @param modelMap * @param reportName * @param format * @return */ @GetMapping("/{reportName}") public ModelAndView getReportByParam(final ModelMap modelMap, @PathVariable(REPORT_NAME) final String reportName, @RequestParam(FILE_FORMAT) final String format) { modelMap.put(DATASOURCE, dbSource); modelMap.put(FILE_FORMAT, format); ModelAndView modelAndView = new ModelAndView(reportName, modelMap); return modelAndView; } /** * 自定义sql语句并生成报表,要注意一点,select ? from ? where XXX * where前面的语句需要写死,后面的where条件可以灵活传入 * 因为模板中的field需要先定义好并对应select A from中的A,才能出数据 * @param modelMap * @param reportName * @param format * @param modelAndView * @return */ @GetMapping("/query/{reportName}") public ModelAndView getReportByParamAndQuery(final ModelMap modelMap, @PathVariable(REPORT_NAME) final String reportName, @RequestParam(FILE_FORMAT) final String format, ModelAndView modelAndView) { try { ResultSet resultSet = dbSource.getConnection().createStatement().executeQuery(queryStr); JRDataSource jrDataSource = new JRResultSetDataSource(resultSet); modelMap.put(DATASOURCE, jrDataSource); modelMap.put(FILE_FORMAT, format); modelAndView = new ModelAndView(reportName, modelMap); } catch (SQLException e) { e.printStackTrace(); } return modelAndView; } }
如上的controller提供了2中略微不同的报表生成方式,后面一个稍微可定制化一些。
访问
localhost:8080/reports/{模板名称}?format={PDF或者XLS}
localhost:8080/reports/query/{模板名称}?format={PDF或者XLS}
即可。