poi导出excel直接打包的方法

来源:互联网 发布:兰蔻网络推广方案 编辑:程序博客网 时间:2024/04/30 15:05

1、调用工具类的方法继承了HttpServlet,类中的方法为service()或其他。

service()方法有代码如下:

  1. resp.setContentType("application/zip;charset=ISO8859-1");
  2.                 resp.setHeader("Content-Disposition", "attachment;filename="
  3.                         + new String(excelName.getBytes(), "ISO8859-1")
  4.                         + ".zip");
  5.                 OutputStream outputStream = resp.getOutputStream();// 取得输出流
  6.                 ExportExcelUtil exportExcelUtil = new ExportExcelUtil();
  7.                 exportExcelUtil.exportExcel(sql, outputStream, excelName);


2、工具类如下

  1. package com.isoftstone.runbat.util;
  2. import java.io.OutputStream;
  3. import java.math.BigDecimal;
  4. import java.nio.charset.Charset;
  5. import java.sql.Date;
  6. import java.sql.ResultSetMetaData;
  7. import java.util.zip.ZipEntry;
  8. import java.util.zip.ZipOutputStream;
  9. import javax.sql.RowSet;
  10. import org.apache.poi.hssf.usermodel.HSSFCell;
  11. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  12. import org.apache.poi.hssf.usermodel.HSSFFont;
  13. import org.apache.poi.hssf.usermodel.HSSFRow;
  14. import org.apache.poi.hssf.usermodel.HSSFSheet;
  15. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  16. import org.slf4j.Logger;
  17. import org.slf4j.LoggerFactory;
  18. import oracle.sql.TIMESTAMP;
  19. import com.isoftstone.fwk.util.SpringUtils;
  20. public class ExportExcelUtil {
  21.     private static Logger logger = LoggerFactory.getLogger(ExportExcelUtil.class);
  22.     /**
  23.      * @param sql
  24.      *            查询数据的sql
  25.      * @param outputStream
  26.      *            输出流
  27.      * @param sheetName
  28.      *            工作薄中工作表的名字
  29.      */
  30.     public void exportExcel(String sql, OutputStream outputStream,String sheetName) {
  31.         HSSFWorkbook wb = new HSSFWorkbook();// 声明一个工作薄
  32.         HSSFCellStyle style = wb.createCellStyle(); // 一个样式
  33.         style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 设置垂直居中
  34.         style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平居中
  35.         HSSFFont headerFont = (HSSFFont) wb.createFont(); // 创建字体样式
  36.         headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 字体加粗
  37.         headerFont.setFontName("Times New Roman"); // 设置字体类型
  38.         headerFont.setFontHeightInPoints((short) 8); // 设置字体大小
  39.         style.setFont(headerFont); // 为标题样式设置字体样式
  40.         /*
  41.          * style.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框
  42.          * style.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框
  43.          * style.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
  44.          * style.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
  45.          */
  46.         style.setWrapText(true);
  47.         HSSFSheet sheet = wb.createSheet(sheetName);// 声明工作薄里中一个工作表的名字
  48.         sheet.setDefaultColumnWidth(30);// 给工作一个默认长度
  49.         HSSFRow row = sheet.createRow(0); // 创建第一行(也可以称为表头)
  50.         try {
  51.             // 通过传过来的sql获得数据
  52.             RowSet rowSet = SpringUtils.getCommonDao().queryNativeSQL(sql,null, false);
  53.             ResultSetMetaData columnNames = rowSet.getMetaData();
  54.             int columnValues = columnNames.getColumnCount();
  55.             for (int i = 0; i < columnValues; i++) {
  56.                 HSSFCell cell = row.createCell(i);
  57.                 cell.setCellStyle(style);
  58.                 cell.setCellValue(columnNames.getColumnName(i + 1));
  59.             }
  60.             int rowNo = 1;
  61.             int m = 1;
  62.             /*
  63.              * HSSFFont contextFont = (HSSFFont) wb.createFont(); //创建字体样式
  64.              * contextFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//字体加粗
  65.              * style.setFont(contextFont);
  66.              */
  67.             while (rowSet.next()) {
  68.                 row = sheet.createRow(rowNo);
  69.                 for (int columnNo = 0; columnNo < columnValues; columnNo++) {
  70.                     HSSFCell cell = row.createCell(columnNo);
  71.                     // cell.setCellStyle(style);
  72.                     Object columnValue = rowSet.getObject(columnNo + 1);
  73.                     if (columnValue == null) {
  74.                         continue;
  75.                     }
  76.                     if (columnValue instanceof String) {
  77.                         cell.setCellValue(rowSet.getString(columnNo + 1));
  78.                     } else if (columnValue instanceof Integer) {
  79.                         cell.setCellValue(rowSet.getInt(columnNo + 1));
  80.                     } else if (columnValue instanceof Double) {
  81.                         cell.setCellValue(rowSet.getDouble(columnNo + 1));
  82.                     } else if (columnValue instanceof Date) {
  83.                         cell.setCellValue(rowSet.getDate(columnNo + 1));
  84.                     } else if (columnValue instanceof TIMESTAMP) {
  85.                         cell.setCellValue(rowSet.getTimestamp(columnNo + 1));
  86.                     } else if (columnValue instanceof BigDecimal) {
  87.                         cell.setCellValue(rowSet.getBigDecimal(columnNo + 1).doubleValue());
  88.                     }
  89.                 }
  90.                 if (rowNo % 60000 == 0) {
  91.                     m++;
  92.                     sheet = wb.createSheet(sheetName + m);// 声明工作薄里中一个工作表的名字
  93.                     sheet.setDefaultColumnWidth(30);// 给工作一个默认长度
  94.                     row = sheet.createRow(0); // 创建第一行(也可以称为表头)
  95.                     for (int i = 0; i < columnValues; i++) {
  96.                         HSSFCell cell = row.createCell(i);
  97.                         cell.setCellStyle(style);
  98.                         cell.setCellValue(columnNames.getColumnName(i + 1));
  99.                     }
  100.                     rowNo = 0;
  101.                 }
  102.                 rowNo++;
  103.             }
  104.             //解决中文乱码:1、使用apache的ant.jar中的ZipOutputStream方法setEncoding
  105.             //2.使用JDK1.7 tomcat的JDK改为1.7
  106.             ZipOutputStream zip = new ZipOutputStream(outputStream,Charset.forName("GBK"));
  107.             ZipEntry entry = new ZipEntry(sheetName+".xls");//设置压缩包中文件的名字
  108.             zip.putNextEntry(entry);
  109.             wb.write(zip);//将创建的excel写入压缩包中
  110.             zip.flush();
  111.             zip.close();
  112.             logger.info("导出"+sheetName+"成功");
  113.         } catch (Exception e) {
  114.             e.printStackTrace();
  115.             logger.error("导出"+sheetName+"失败");
  116.         }
  117.     }
  118. }
0 0