在传统行业中,很多需求在我们看来似乎是一下伪需求,但是我们很多必须要开发。
比喻EXCEL,必须要导出来,必须要和他们要求一致。
大量数据导入
根据SQL语句生成路劲的文件。
/**
* 根据sql生成zip文件 * * @param sql * @param size * @param reportName * @return * @throws Exception */ public List<String> export(String sql, Integer size, String reportName, String basePath) throws Exception { if (StringUtils.isBlank(sql)) { throw new Exception(sql + "is null"); } BossPreparedStatementCreator bossPreparedStatementCreator = new BossPreparedStatementCreator(); bossPreparedStatementCreator.setSql(sql); BossRowCallbackHandler bossRowCallbackHandler = new BossRowCallbackHandler(); bossRowCallbackHandler.setSize(size); bossRowCallbackHandler.setReportName(reportName); bossRowCallbackHandler.setBasePath(basePath); // 这里为了处理没有数据返回为空的情况 BossResultSetExtractor<ResultSetMetaData> resultSetExtractor = new BossResultSetExtractor<ResultSetMetaData>( bossRowCallbackHandler); dao.queryDate(bossPreparedStatementCreator, resultSetExtractor); List<String> fileNames = bossRowCallbackHandler.getFiles(); if (bossRowCallbackHandler.getOut() != null) { bossRowCallbackHandler.getOut().flush(); bossRowCallbackHandler.getOut().close(); } if (fileNames.isEmpty()) { BossRowCallbackHandler bossRowCallbackHandler1 = new BossRowCallbackHandler(); bossRowCallbackHandler1.setSize(size); bossRowCallbackHandler1.setReportName(reportName); bossRowCallbackHandler1.setBasePath(basePath); bossRowCallbackHandler1.setSbColumn(resultSetExtractor .getSbColumn()); bossRowCallbackHandler1.createWriter(1); if (null != bossRowCallbackHandler1.getOut()) { bossRowCallbackHandler1.getOut().flush(); bossRowCallbackHandler1.getOut().close(); } fileNames = bossRowCallbackHandler1.getFiles(); } return fileNames; }
public class BossPreparedStatementCreator implements PreparedStatementCreator { private String sql; public PreparedStatement createPreparedStatement(Connection conn) throws SQLException { /*System.out.println(conn.getMetaData().getURL()+"--"+conn.getMetaData().getUserName());*/ return conn.prepareCall(sql); /* return conn.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);*/ } public String getSql() { return sql; } public void setSql(String sql) { this.sql = sql; } }
public class BossRowCallbackHandler implements RowCallbackHandler { private Integer size; private OutputStream out; // 字段str private String sbColumn; // 字段列表 private List<ColumnData> columnList = new ArrayList<ColumnData>(); // 每个csv最大数量 // 报表名称 private String reportName; // 基本路径 private String basePath; // 文件列表 private List<String> files = new ArrayList<String>(); // 文件后缀 private String FileType = ".csv"; @Override public void processRow(ResultSet rs) throws SQLException { if (null == columnList || columnList.isEmpty()) { createColumnList(rs.getMetaData()); } if (null == columnList || columnList.isEmpty()) return; try { createWriter(rs.getRow()); } catch (IOException e) { throw new SQLException(e); } try { StringBuffer sbData = new StringBuffer(); String columnName=null; for (ColumnData data : columnList) { columnName = data.getColumnName(); // 字段类型 String dataType = data.getDataType(); if (null != sbData && 0 != sbData.length()) { sbData.append(","); } Object columnValue = rs.getObject(columnName) == null ? "" : rs .getObject(columnName).toString(); getValueByType(sbData,dataType, columnValue); columnValue=null; } sbData.append("\r\n"); FileUtil.writeToCsv(sbData.toString(), out); sbData=null; } catch (Exception e) { throw new SQLException(e); } /* if (rs.isLast()) { try { if (null != out) out.close(); } catch (IOException e) { throw new SQLException(e); } }*/ } /** * 得到数据 * * @param data * @return */ void getValueByType(StringBuffer sb, String dataType, Object columnValue) { // 数字不进行处理 if ("NUMBER".equalsIgnoreCase(dataType) || "BINARY_FLOAT".equalsIgnoreCase(dataType) || "BINARY_DOUBLE".equalsIgnoreCase(dataType)) { sb.append(columnValue); } else { sb.append("\"\t").append(columnValue).append("\t\""); } } /** * 得到字段名称 * * @param rsmd * @throws SQLException */ public void createColumnList(ResultSetMetaData rsmd) throws SQLException { if (rsmd != null) { StringBuffer sb = new StringBuffer(); int count = rsmd.getColumnCount(); for (int i = 1; i <= count; i++) { ColumnData columnData = new ColumnData(); String columnName = rsmd.getColumnName(i); String dataType = rsmd.getColumnTypeName(i); columnData.setColumnName(columnName); columnData.setDataType(dataType); columnList.add(columnData); if (null != sb && 0 != sb.length()) { sb.append(","); } sb.append(columnName).append("\t"); } if (null != sb && 0 != sb.length()) { sb.append("\r\n"); } this.sbColumn = sb.toString(); } } /** * 创建新的file * * @param rowNum * @throws IOException */ public void createWriter(int rowNum) throws IOException { if (rowNum % size == 1) { if (out != null) { out.flush(); out.close(); } File file = null; String fileNameNew = basePath + File.separator + reportName + "_" + (rowNum / size) + FileType; file = FileUtil.createCsvFile(fileNameNew); out = new BufferedOutputStream(new FileOutputStream(file, true), 1024 * 1024); files.add(fileNameNew); FileUtil.writeToCsv(getSbColumn(), out); } } public List<ColumnData> getColumnList() { return columnList; } public void setColumnList(List<ColumnData> columnList) { this.columnList = columnList; } public Integer getSize() { return size; } public void setSize(Integer size) { this.size = size; } public String getReportName() { return reportName; } public void setReportName(String reportName) { this.reportName = reportName; } public List<String> getFiles() { return files; } public void setFiles(List<String> files) { this.files = files; } public String getFileType() { return FileType; } public void setFileType(String fileType) { FileType = fileType; } public String getSbColumn() { return sbColumn; } public void setSbColumn(String sbColumn) { this.sbColumn = sbColumn; } public String getBasePath() { return basePath; } public void setBasePath(String basePath) { this.basePath = basePath; } public OutputStream getOut() { return out; } public void setOut(OutputStream out) { this.out = out; } }
public class BossResultSetExtractor<T> implements ResultSetExtractor { RowCallbackHandler rch; public BossResultSetExtractor(RowCallbackHandler rch) { this.rch = rch; } private String sbColumn; /* * public ResultSetMetaData extractData(ResultSet rs) throws SQLException { * * while (rs.next()) { this.rch.processRow(rs); } rsmd = rs.getMetaData(); * * return rsmd; } */ public ResultSetMetaData extractData(ResultSet rs) throws SQLException { while (rs.next()) { this.rch.processRow(rs); } ResultSetMetaData rsmd = rs.getMetaData(); StringBuffer sb = new StringBuffer(); int count = rsmd.getColumnCount(); for (int i = 1; i <= count; i++) { String columnName = rsmd.getColumnName(i); if (null != sb && 0 != sb.length()) { sb.append(","); } sb.append(columnName).append("\t"); sbColumn = sb.toString(); } return rsmd; } public String getSbColumn() { return sbColumn; } public void setSbColumn(String sbColumn) { this.sbColumn = sbColumn; } }
public interface Dao { public List<String> queryPermissionCode(String sql); /** * 查询sql,生成文件 * * @param preparedStatementCreator * @param rowCallbackHandler * @throws Exception */ void queryDate(PreparedStatementCreator preparedStatementCreator, RowCallbackHandler rowCallbackHandler) throws Exception; /** * 如果返回数据为空处理 * * @param preparedStatementCreator * @param resultSetExtractor * @return * @throws Exception */ public ResultSetMetaData queryDate( PreparedStatementCreator preparedStatementCreator, ResultSetExtractor<ResultSetMetaData> resultSetExtractor) throws Exception; }
@Repository("dao") public class DaoImpl implements Dao { @Autowired private JdbcTemplate jdbcTemplate; public List<String> queryPermissionCode(String sql) { List<String> list = jdbcTemplate.queryForList(sql, String.class); return list; } public void queryDate(PreparedStatementCreator preparedStatementCreator, RowCallbackHandler rowCallbackHandler) throws Exception { /* * System.err.println(jdbcTemplate.getDataSource().getConnection() * .getMetaData().getURL()); */ jdbcTemplate.query(preparedStatementCreator, rowCallbackHandler); } /** * 如果返回数据为空处理 * * @param preparedStatementCreator * @param resultSetExtractor * @return * @throws Exception */ public ResultSetMetaData queryDate( PreparedStatementCreator preparedStatementCreator, ResultSetExtractor<ResultSetMetaData> resultSetExtractor) throws Exception { /* * System.err.println(jdbcTemplate.getDataSource().getConnection() * .getMetaData().getURL()); */ return jdbcTemplate.query(preparedStatementCreator, resultSetExtractor); } }
相关推荐
java 发邮件带excel附件,以流的形式发送附件,不生成excel文件
java写入excel图片操作 包含需要的类库和相应的代码
当有需求,需要把当天的报表文件发送给指定邮箱又不小生成多余的...实现过程是先将数据库里的数据,导出excel文件输出流中(注:不是直接生成文件),发送邮件时附件内容直接从前面excel文件输出流中获取,然后发送邮件
后端(如 springboot)直接返回excel的输出流到前端,前端使用 该方法(js原生ajax)进行接收并实现页面的下载
在Spring Boot中实现Excel的导入导出可以通过POI库来实现,POI是一个开源的Java库,用于处理Microsoft Office格式文件,包括Excel。一个简单的示例,演示如何在Spring Boot项目中使用POI来实现Excel的导入导出功能。...
利用jxl包结合java反射机制和注释,直接把list生成对应的Excel文件,即只需传入list、对应生成的对象、标题就可以生成excel文件write(String title, List list,Class c),实现一个简单生成excel工具类
相信大家在开发的过程中都会遇到在线预览功能,有没有想过如何通过java来实现excel、word、txt、ppt等办公文件在线预览功能?今天我们就来解决这一疑问! 其实,网上还是有些公司对这一功能提供了收费服务。那么,...
Java是一种流行的编程语言,可以用于操作多种类型的文档,包括Word、Excel、PDF等。本文将对Java操作Word、Excel、PDF等文档的知识点进行总结和分析。 一、Java操作Word文档 Java可以使用 Jacob 库来操作 Word ...
利用纯struts2.0+poi插件 实现导出excel
* 这是一个通用的方法,利用了JAVA的反射机制, * 可以将放置在JAVA集合中并且符合一定条件的数据以EXCEL的形式输 出到指定IO设备上 * @param title 表格标题名 * @param headers 表格属性列名数组 * @...
通过对邮件协议的理解,将数据和文件转化为普通的java流进行传输到邮箱。可以发送普通文件,也可以是各式各样的附件。
用开源 Apache POI 技术导出Excel,解决导出大数据出现OOM、栈溢出问题,此资源可实现百万级数据多线程分批导出Excel文件,不会内存溢出,生产环境已很稳定的使用者,所以用到的技术很核心、值得参考
主要介绍了java实现在线预览--poi实现word、excel、ppt转html的方法,本文需要引入poi的jar包给大家介绍的非常详细,需要的朋友可以参考下
目前java框架中能够生成excel文件的的确不少,但是,能够生成大数据量的excel框架,我倒是没发现,一般数据量大了都会出现内存溢出,所以,生成大数据量的excel文件要返璞归真,用java的基础技术,IO流来实现。...
java实现Excel压缩成Zip导出-附件资源
项目中有一个导出功能的实现,用博客来记录一下。因为需求对导出表格的数据格式和样式有要求,所以这个导出功能放到后端来做,而且后端返回的是数据流,所以需要处理成想要的表格并导出来。 先看下效果图: 页面效果...
读的时候是这样的一个思路,先用一个输入流(InputStream)得到Excel文件,然后用jxl中的Workbook得到工作薄,用Sheet从工作薄中得到工作表,用Cell得到工作表中得某个单元格。 InputStream->Workbook->Sheet->Cell,就...
亲测,完美解决excel转换成html后图片无法显示的问题。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
POI和JFreeChart框架实现生成Excel文件(生成 统计图)
利用注解实现excel导出。PubCloudFrmAgrmController是controller层,ResponseEntity是返回给前端的excel下载流。调用下载只需new ExportExcel("框架协议数据", FrmAgrmExcelOutVo.class).setDataList(list)....