用prepareStatement、resultSet写的excel实例分析

/**    Map map=writeToExl( sql,path, filename, originalPath);

        file=(File) map.get("file");
* 生成EXCLE 文件

* @param sql
*          数据查询sql

 * @param path
 *            文件生成路径
* @param filename
*            文件名
* @param originalPath
*            原始excle模版路径
* @return
*/

   @SuppressWarnings("deprecation")
        public Map writeToExl( String sql,
           String path, String filename, String originalPath) {
       if (StringUtils.isBlank(path)) {
           path = SettingService.tempFilePath();//SettingService类的tempFilePath()方法主要是用来获取生成excel存档的文件夹

           File f = new File(path);

                //如果没有该文件夹,则重新生成

           if (!f.exists()) {
               f.mkdirs();
           }

       }

              //excel文件名如果没有指定的,则随机生成一个为文件名

       if (StringUtils.isBlank(filename)) {
           filename = UUID.randomUUID().toString();
       }


       PreparedStatement st = null;//PreparedStatement 可以达到预处理
       ResultSet rs = null;/* 结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个存储查询结果的对象,但是结果集并不仅仅具有存储的功能,他同时还具有操纵数据的功能,可能完成对数据的更新等.*/
       File file = null;
       Map returnMap = new HashMap();
       try {
           // 总记录数
           Long count = null;
           String countSql = "SELECT COUNT(*) FROM ("
               + sql+")";
           if (!StringUtils.isBlank(countSql)) {
               count = Utils.converToLong(getSession()
                       .createSQLQuery(countSql).uniqueResult());//求数据数目
           } else {
               count = 1000L;
           }
         //  returnMap.put("count", count);


           // 执行 PrepareStatement
           st = ((SessionImpl) getSession()).getBatcher()
                   .prepareStatement(sql);
           rs = st.executeQuery();
   


           // 头行汉字
           ResultSetMetaData metadata = rs.getMetaData();
           int columnCount = metadata.getColumnCount();
           List columns = new ArrayList(columnCount);
           List columnNames = new ArrayList(columnCount);
           int col = 0;



                  //数据列
           for (int i = 0; i < columnCount; i++) {
               // nextLine[i] = metadata.getColumnName(i + 1);
               String n = metadata.getColumnName(i + 1);
               String cn = n;
             
               if (!StringUtils.isBlank(cn)) {
                   columns.add(i);
                   columnNames.add(cn);
                   // nmap.put(cn, i);
               }
           }
           HSSFWorkbook wb=null;
           FileOutputStream fileOut=null;
           String tmpFileDir = null;
           boolean merge = false;
           // 计算是否需要拆分成几个文件
           if (count >= Report.MAX_SHEET_NUMBER) {
               merge = true;
               tmpFileDir = FilenameUtils.normalize(path + "/"
                       + UUID.randomUUID().toString());
               new File(tmpFileDir).mkdirs();
               file = new File(FilenameUtils.normalize(path + "/"
                       + StringUtils.substringBefore(filename, ".") + ".zip"));
               returnMap.put("suffix", "zip");
           } else {
               file = new File(FilenameUtils.normalize(path + "/"
                       + StringUtils.substringBefore(filename, ".") + ".xls"));
               returnMap.put("suffix", "xls");
           }
           returnMap.put("file", file);


           int pageIndex = 1;
           int rowIndex = 2;
           HSSFSheet sheet=null;
           HSSFRow row =null;
           POIFSFileSystem fs=null;


           boolean isBlank = true;
           boolean writeFlag = false;
           wb = new HSSFWorkbook(); 
           FileUtils.copyFile(
                        new File(FilenameUtils.normalize(SimpleFileUtils
                                .getRootPath()+ originalPath)),file, true);
                fs = new POIFSFileSystem(new FileInputStream(file.getPath())); 
                wb = new HSSFWorkbook(fs);
           while (rs.next()) {
               if (rowIndex == 2) {


                   File _file = file;
//                    fileWriter = new OutputStreamWriter(new FileOutputStream(
//                            _file), "GBK");
                   if (merge) {
                       isBlank = false;
                       _file = new File(tmpFileDir + "/" + pageIndex + ".xls"); 
                   }
                   FileUtils.copyFile(
                                new File(FilenameUtils.normalize(SimpleFileUtils
                                        .getRootPath()+ originalPath)),_file, true);//复制模版到目标excel
                        fs = new POIFSFileSystem(new FileInputStream(_file.getPath())); 
                        wb = new HSSFWorkbook(fs); 
                        while (wb.getSheetAt(0).getRow(1).getCell(col) != null) {
                            columns.add(col);
                            col++;
                        }        
               }
               row =  wb.getSheetAt(0).createRow(rowIndex);
              // String[] nextLine = new String[columns.size()];
                int j = 0;
               for (int i = 0; i < columnCount; i++) {
                   if (columns.contains(i)) {
                       HSSFCell cell = row.createCell(j++);
                       String value = HibernateHelper.getColumnStrValue(rs,
                               metadata.getColumnType(i + 1), i + 1);
                       cell.setCellValue(value);
                   }
               }
               rowIndex = rowIndex + 1;
               if (rowIndex >= Report.MAX_SHEET_NUMBER) {
                   fileOut = new FileOutputStream(tmpFileDir + "/" + pageIndex + ".xls");
                   wb.write(fileOut);
                   fileOut.close();
                   rowIndex = 2;
                   pageIndex = pageIndex + 1;
                   writeFlag = true;
               }
           }
           if(writeFlag) {
            fileOut = new FileOutputStream(tmpFileDir + "/" + pageIndex + ".xls");
                    wb.write(fileOut);
                    fileOut.close();
           }
           if (isBlank) {
                    
                   
               fileOut = new FileOutputStream(file.getPath());
                    wb.write(fileOut);
                    fileOut.close();
           } 


           // 合并文件
           if (merge) {
               Attachment.compressed(tmpFileDir, file);
               // 删除临时目录
               FileUtils.deleteDirectory(new File(tmpFileDir));
           }
       } catch (IOException e) {
           e.printStackTrace();
           throw new BusinessException(e.toString());
       } catch (HibernateException e) {
           e.printStackTrace();
           throw new BusinessException(e.toString());
       } catch (SQLException e) {
           e.printStackTrace();
           throw new BusinessException(e.toString());
       } finally {
           if (rs != null) {
               try {
                   rs.close();
               } catch (SQLException e) {
                   e.printStackTrace();
               }
           }
           if (st != null) {
               try {
                   st.close();
               } catch (SQLException e) {
                   e.printStackTrace();
               }
           }
       }


       return returnMap;
   }

你可能感兴趣的:(java)