`

JAVA实现EXCEL方法一 流的方式

 
阅读更多

    在传统行业中,很多需求在我们看来似乎是一下伪需求,但是我们很多必须要开发。

    比喻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导入导出.pdf

    在 Java 中,实现 Excel 导入导出可以使用多种方式,本文将介绍使用 JXL 和 POI 两个库实现 Excel 导入导出的方法。 使用 JXL 库实现 Excel 导入导出 JXL(Java Excel API)是一个开源的 Java 库,用于读写 Excel ...

    java实现Excel导入(POI)

    在Java编程环境中,实现Excel数据的导入是一项常见的任务,尤其在数据处理、报表生成或数据分析等领域。Apache POI是一个流行的库,它允许开发者读写Microsoft Office格式的文件,包括Excel(.xls和.xlsx)。本篇...

    Java实现Excel导入导出操作详解.pptx.pptx

    Java实现Excel导入导出是Java开发中常见的任务,主要用于数据的批量处理和分析,尤其在数据分析、报表生成和数据备份等方面具有广泛应用。要熟练掌握这一技术,开发者需要了解Excel文件的结构,熟悉Java的文件操作,...

    java实现Excel导出

    这里我们将深入探讨如何使用Java来实现Excel的导出功能。 首先,我们需要了解Java中用于处理Excel的主要库,Apache POI是一个非常流行的选择。Apache POI是一个开源项目,它提供了API来读写Microsoft Office格式的...

    java_poi实现excel导入导出

    要使用 Java POI 实现 Excel 导出,需要首先创建一个 HSSFWorkbook 或 XSSFWorkbook 对象,然后使用该对象创建一个工作表。下面是一个简单的示例: ```java import org.apache.poi.hssf.usermodel.HSSFWorkbook; ...

    java实现在Excel中插入图片

    总结起来,Java实现Excel中插入图片的核心步骤包括:导入Apache POI库,创建并操作工作簿和工作表,读取和创建图片对象,创建绘图工作表,设置图片位置,最后保存工作簿。在实际开发中,可能还需要处理图片格式转换...

    java实现Excel数据导入到数据库

    本篇文章将深入探讨如何使用Java实现这两个功能,主要涉及的技术栈包括Apache POI库用于操作Excel,以及JDBC(Java Database Connectivity)用于与MySQL数据库进行交互。 首先,我们需要了解Apache POI库。这是一个...

    java实现excel转csv

    在压缩包文件"excelToCsv"中,通常会包含一个示例Java程序,该程序实现了上述步骤,你可以参考它来理解和实践这个过程。通过这个程序,你可以将任意的Excel文件转换为CSV格式,方便后续的数据处理和分析。

    Java实现excel文档数据导入数据库、导出excel

    本文将详细介绍如何使用Java实现Excel文档数据的导入到数据库以及从数据库导出到Excel。 一、导入Excel数据到数据库 1. **库的选择**: 为了在Java中处理Excel文件,我们需要依赖第三方库,如Apache POI。Apache ...

    java实现excel导入数据库

    在Java编程中,将Excel数据导入到MySQL数据库是一项常见的任务,尤其在数据处理和分析的场景下。要完成这个过程,我们需要使用特定的库来读取Excel文件,并使用JDBC(Java Database Connectivity)来与MySQL数据库...

    java实现 html转Excel

    本主题主要探讨如何利用Java技术实现这一功能。HTML作为一种网页标记语言,可以方便地展示复杂的数据结构,而Excel则提供了良好的表格展示和数据分析能力。通过Java,我们可以将HTML内容解析并转换为Excel格式,以便...

    java实现自定义excel模板导出excel并可保存客户端和在线打开

    本文将深入探讨如何使用Java和jxl库来实现这一功能,让开发者能够创建任意复杂格式的Excel文件,并允许用户在客户端保存或在线打开。 首先,我们要了解jxl库。jxl是Java Excel API的缩写,它是一个开源的Java库,...

    Java实现Excel导入导出功能

    首先,Java实现Excel导入功能通常涉及解析Excel文件,这主要依赖于Apache POI库。Apache POI是一个开源项目,提供了API来处理Microsoft Office格式的文件,包括Excel(.xls和.xlsx)。使用POI,你可以创建工作簿...

    java 导出excel(方法二)

    jxl是一个流行且强大的Java库,能够读写Microsoft Excel文件。这里我们将介绍如何利用jxl库从数据库(如MySQL)中获取数据并将其导出到Excel。 首先,你需要在项目中添加jxl库和JDBC驱动,例如用于MySQL的`mysql-...

    java实现excel

    标题:Java实现Excel导出功能 描述:本文将详细介绍如何使用Java进行Excel文件的创建与导出,特别针对初学者,提供易于理解的代码示例和详细的解释。 ### Java实现Excel知识点详解 #### 1. 引入依赖库 在Java中...

    Java语言实现Excel的导出

    在Java编程中,导出Excel是一项常见的任务,特别是在数据处理和报表生成的场景下。本项目利用了Apache POI库,这是一个强大的API,允许开发者创建、修改和展示Microsoft Office格式的文件,包括Excel(.xlsx和.xls)...

    java实现生成下载Excel

    要实现这一功能,通常会用到Apache POI库,这是一个强大的API,允许Java程序员创建、修改和显示Microsoft Office格式的文件,包括Excel(.xlsx和.xls)。 首先,你需要在项目中引入Apache POI库。如果你使用Maven,...

    java实现Excel导入导出源码

    以上就是Java实现Excel导入导出的基本流程和关键知识点。实际项目中,可能还需要考虑线程安全、并发处理、数据验证、公式计算等复杂情况。通过熟练掌握这些技术,可以高效地在Java应用中处理Excel数据。

    java 创建EXCEL文件,并向EXCEL中写入数据

    总的来说,Java配合`jxl`库可以方便地实现Excel文件的创建和数据写入,这对于数据导出、报告生成等场景非常实用。然而,需要注意的是,`jxl`库只支持旧版的.BIFF8格式(Excel 97-2003),对于新版的.xlsx格式(Excel...

    JAVA实现Excel导入数据库

    以上就是使用Java实现Excel数据导入数据库的主要步骤和关键知识点。通过熟练掌握这些技术,你将能够构建出高效且可靠的Excel到数据库导入系统。在实际应用中,还可能需要根据具体需求进行调整和定制,如错误处理、...

Global site tag (gtag.js) - Google Analytics