使用XLSTransformer生成XLS报表的步骤和流程:
需要引入的jar包:
jxls-core-0.9.7.jar
jxls-reader-0.9.7.jar
poi-3.6.jar
commons-jexl-1.1.jar
commons-digester-2.0.jar
commons-beanutil-core-1.8.3.jar
commons-collection.jar
示例代码:
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.jxls.exception.ParsePropertyException;
import net.sf.jxls.transformer.XLSTransformer;
1,查询数据库记录,获得需要导出到execl中的数据;
2,把数据封装到List中;
通常我们是这样做的:List<Object> business = new ArrayList<Object>();
3,将List放到HashMap中;
通常我们是这样做的:
Map<String, Object> beans = new HashMap<String, Object>();
business.add(businessCharge);
4,xls模板文件路径; //这个需要开发者提供,放在项目的某个目录下
我们如果需要生成execl报表文件,需要先设置好一个报表模板,如下图所示:
说明:
a,<jx:forEach items="$Entity" var="entity"></jx:forEach>,迭代标签,迭代输出所有的记录;
b,Entity = 封装记录的对象,如果是单表查询,就是实体类;如果是多表查询,就是封装查询结果的对象,可以看作是一个新的实体类。
c,entity = 别名
d,entity.id = 实体类中的id字段
5,生成的目标文件路径; //目标文件路径:可以是本地的E盘上等等
6,创建目标文件夹;FileUtil.makeDir(“生成的目标报表的路径,注意,这里没有文件名”);
if(!FileUtil.isFileExists("目标文件路径 + 目标文件名称")){FileUtil.makeDir("目标文件路径");
}
7,创建XLSTransformer 对象,调用transformer.transformXLS(templatePath, beans, reportPath),生成报表。
以上就是使用XLSTransformer生成报表的大概流程。难点在于数据的获取,例如些SQL语句,检查获得的报表的数据的完整性,准确性,安全性等。生成报表使用的最多的就是存储过程了,所以掌握生成报表的技术,我们需要先掌握存储过程的知识。
如果需要生成TXT报表,则可以这样进行:
/*** 生成txt报表/txt报表 */
public void generateTxtReport() {String reportDate = "2016-03-05";Map<String, Object> map = new HashMap<String, Object>();map.put("reportDate", reportDate);BigDecimal payAmtCount = new BigDecimal(0);String reportPath = "report.txt";PrintWriter printWriter = null;try {printWriter = new PrintWriter(reportPath, "GBK");printWriter.printf("%-32s\r\n", "XXX明细报表(TXT)");// 查询报表数据List<Map<String, Object>> Entitylist = null; //从数据库查询出来的数据可以直接封装在这个list中 EntitylistList<Map<String, Object>> listNew;BigDecimal payAmtVendorCount;for (Map<String, Object> EntityInfo : Entitylist) {map.put("Id", EntityInfo.get("ID"));listNew = null; //从数据库中查询出来的数据// 输出数据到TXT报表if (!listNew.isEmpty()) {printWriter.printf("%-50s\r\n", EntityInfo.get("ID"));printWriter.printf("%-100s\r\n", EntityInfo.get("NAME"));printWriter.printf("总金额");// 表头printWriter.printf("%-150s\r\n","-----------------------------------------------------------");payAmtCount = new BigDecimal(0);for (Map<String, Object> value : listNew) {payAmtCount = payAmtVendorCount.add((BigDecimal) value.get(AMT));// 循环统计商户数据payAmtCount = payAmtCount.add((BigDecimal) value.get(AMT));// 打印数据printWriter.printf("XXXX");}// 单个商户合计打印printWriter.printf("%-150s\r\n","-----------------------------------------------------------");printWriter.printf("%-20s%\r\n", "合计:", "交易笔数:" + listNew.size(), "", payAmtCount);printWriter.printf("%1s\r\n", " ");// 空行try {printWriter.flush();} catch (Exception e) {}}}printWriter.printf("%-50s\r\n", "总合计:");printWriter.printf("%-15s\r\n", "-----------------------------------------------------------");printWriter.printf("%-10s%\r\n", "总交易笔数");printWriter.printf("%-15s%\r\n", payAmtCount);printWriter.printf("%-15s\r\n", "-----------------------------------------------------------");} catch (Exception e) {log.error("Export txt fail", e);} finally {try {printWriter.flush();printWriter.close();} catch (Exception e) {log.error("IO txt fail", e);}}
}
接着会继续分享报表方面的经验。












