最近有个需求是将数据库查询出来的数据,写入到用户提供的指定的模板中。查询一番,java方面的有jxl和poi两种插件,考虑到本次模板有多个页签,只是简单的数据查询,便选择 Aspose.Cells。记录下来实现的过程,方便之后的查看。
知识介绍
Aspose.Cell控件支持多种参数变量的绑定操作,如支持DataSet、Datatable、IList集合,实体类集合、类对象。下面是实现的过程。
第一步、设置引用关系
需要给用户提供的模板文件中的每个字段添加引用,作用是将程序查询出来的结果集,对应到数据列。实现效果如下图所示。
模板中的列名要与数据库查询出来的列对应,绑定两者之间的关系,这里通过**&=**来连接,从而建立两者之间的关系。
知识点
通过&= 来引用对象的结果的集合,如&=a.姓名,即引用a表中的性名列。
模板中不同页签也能根据&= 实现数据的对应关系。
第二步、查询数据集
查询数据库获取结果模板所需字段的数据集,本例子利用jdbcOperations.queryForList来实现查询,将结果放到HashMapDataTable中。
主要实现的步骤:读取模板文件–查询数据–往模板中写数据。程序代码实现:
// 读取模板文件,FilePath为文件的路径
InputStream in=new FileInputStream(new File(FilePath));
//读取工作簿
Workbook wb= new Workbook(in);
//记得关闭输入流
in.close();
//创建Aspose.Cells WorkbookDesigner 的对象
WorkbookDesigner designer = new WorkbookDesigner();
designer.setWorkbook(wb);
//创建StringBuffer 存放查询的SQL
StringBuffer sql = new StringBuffer();
sql.append(“select name as 姓名,sex as 性别,sfzh as 身份证号 FROM a”);
//将查询结果存放到list中
List<Map<String, Object>> dataList = jdbcOperations.queryForList(sql.toString());
//设置DataTable对象
designer.setDataSource("a", new HashMapDataTable(dataList));
//根据数据源处理生成报表内容
designer.process();
//输出流,写入到文件中
OutputStream out = new FileOutputStream(logPath+File.separator+"导出数据.xls");
//将查询数据写入到文件中
wb.save(out, wb.getFileFormat());
知识点
designer.setDataSource 设置对象之间的引用关系。
合并单元格 cells.Merge
如cells.Merge(1, 0, 3, 1) 参数1代表当前行,参数0代表当前行当前列即第一行第一列,参数3合并的行数,参数4合并的列数
模板输出的两种方式:
// 第一种方式:模板数据输出
var filename = HttpUtility.UrlEncode("数据导出", System.Text.Encoding.UTF8) +DateTime.Now.ToString("yyyyMMddhhmmss")+ ".xls"
//第二种方式:模板输出
OutputStream out = new FileOutputStream(logPath+File.separator+"导出数据.xls");
如果输出的是中文的文件名,需要添加 HttpUtility.UrlEncode() 防止出现乱码。若采用http请求直接在浏览器下载生成的文件,则需要获取response.getOutputStream()输出流。
// 浏览器上输出文件
wb.save(response.getOutputStream(), wb.getFileFormat());
第三步、测试导出程序
经过测试,能够将查询出来的结果写入到对应的模板中。
博客参考
【1】https://blog.csdn.net/kongwei521/article/details/41647747
【2】https://www.cnblogs.com/wuhuacong/archive/2011/02/23/1962147.html
【3】https://blog.csdn.net/a363722188/article/details/81202295