`

POI导出报表 ExcelUtil

    博客分类:
  • java
 
阅读更多

import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URLEncoder;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.*;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.awt.Font;
import java.beans.*;

//import com.yxhc.util.dbUtil.ConnectionUtil ;  

/**
 * 23. *
 * 
 * @author Great nomandia 24.
 */
public class ExcelUtil {

 private static Log log = LogFactory.getLog(ExcelUtil.class);

 private static String shtName = "";
 //列属性名
 private static String[] cNames = null;
 //列显示名
 private static String[] cLabels = null;
 //列
 private static List cColumns=null;
 //每页显示行数
 private static int rpp = 5000;

 private static HSSFCellStyle style = null;

 /**
  * 通过给定的Sql导出Excel文件到Response输出流,需要指定Connection
  * 
  * @param response
  *            HttpServletResponse Response
  * @param conn
  *            Connection 指定的数据库连接
  * @param sqlStr
  *            String 查询的Sql语句
  * @param sheetName
  *            String 导出的Excel Sheet名称
  * @param columnNames
  *            String[] 导出的 Excel 列名称
  * @param rowPerPage
  *            int 每一个Sheet页的行数
  * @throws SQLException
  */
 public static void export(HttpServletResponse response, Connection conn,
   String sqlStr, String sheetName, String columnNames[],
   int rowPerPage) throws SQLException {
  PreparedStatement ps = null;
  ResultSet rs = null;
  ps = conn.prepareStatement(sqlStr);
  rs = ps.executeQuery();

  ResultSetMetaData rsmd = rs.getMetaData();
  if (rowPerPage <= 10000 && rowPerPage >= 1) {
   rpp = rowPerPage;
  }
  if (!"".equals(sheetName) && null != sheetName) {
   shtName = sheetName;
  } else {
   shtName = rsmd.getTableName(0);
  }
  cNames = getColumnNames(rsmd);
  if (null != columnNames) {
   cLabels = columnNames; // compare( columnNames ) ;
  } else {
   cLabels = cNames;
  }

  HSSFWorkbook wb = new HSSFWorkbook();
  style = wb.createCellStyle();
  style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

  HSSFSheet sheet = createSheet(wb, 1);
  setSheetColumnTitle(sheet);
  int rowCnt = 0;
  int sheetNum = 2;

  while (rs.next()) {
   if (rowCnt == rpp) {
    sheet = createSheet(wb, sheetNum);
    setSheetColumnTitle(sheet);
    rowCnt = 0;
    sheetNum++;
   }
   HSSFRow row = sheet.createRow(rowCnt + 1);
   for (int i = 0; i < cNames.length; i++) {

    HSSFCell cell = row.createCell((short) i);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    String val = rs.getString(cNames[i]);
    if (null == val) {
     val = "";
    }
    cell.setCellValue(val.toUpperCase());
   }
   rowCnt++;
  }
  try {
   OutputStream os = response.getOutputStream();
   response.reset();
   response.setContentType("application/vnd.ms-excel");
   response.setHeader("Content-disposition", "attachment; filename="
     + getFileName(shtName));
   wb.write(os);
   if (conn != null) {
    conn.close();
   }
  } catch (IOException ex) {
   log.info("Export Excel file error ! " + ex.getMessage());
  }
 }
 
 
 public static void export(HttpServletResponse response, List list,
    String sheetName, Class cls,Map columnNames,
   int rowPerPage)  {

  if (rowPerPage <= 10000 && rowPerPage >= 1) {
   rpp = rowPerPage;
  }
  if (!"".equals(sheetName) && null != sheetName) {
   shtName = sheetName;
  } else {
   shtName = "sheet";
  }
  

  HSSFWorkbook wb = new HSSFWorkbook();
  style = wb.createCellStyle();
  style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

  HSSFSheet sheet = createSheet(wb, 1);
  
  int rowCnt = 0;
  int sheetNum = 2;
  Iterator it=list.iterator();
  Iterator columnNamesKey= columnNames.keySet().iterator();
  cLabels=new String[columnNames.size()];
  cNames=new String[columnNames.size()];
  int i=0;
  while(columnNamesKey.hasNext()){
   String columnName=String.valueOf(columnNamesKey.next());
   System.out.println("columnName="+columnName);
   cNames[i]=columnName;
   cLabels[i]=(String)columnNames.get(columnName);
   i++;
  }
  setSheetColumnTitle(sheet);
  while (it.hasNext()) {
   if (rowCnt == rpp) {
    sheet = createSheet(wb, sheetNum);
    setSheetColumnTitle(sheet);
    rowCnt = 0;
    sheetNum++;
   }
   HSSFRow row = sheet.createRow(rowCnt + 1);
   Object entity=it.next();
    
   for(int j=0;j<cNames.length;j++) {
    //String propertyName=(String)columnNamesKey.next();
    HSSFCell cell = row.createCell((short) j);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    String val = (String)getPropertyValue(entity,cNames[j]);
    if (null == val) {
     val = "";
    }
    cell.setCellValue(val.toUpperCase());
   }
   rowCnt++;
  }
  try {
   OutputStream os = response.getOutputStream();
   response.reset();
   response.setContentType("application/vnd.ms-excel");
   response.setHeader("Content-disposition", "attachment; filename="
     + getFileName(shtName));
   wb.write(os);
    
  } catch (IOException ex) {
   log.info("Export Excel file error ! " + ex.getMessage());
  }
 }
 
 
// 3
 public static void export(HttpServletResponse response, List list,
   String fileName, String sheetName, String[] columnNames, Map columnLabels,
   int rowPerPage)  {

  if (rowPerPage <= 10000 && rowPerPage >= 1) {
   rpp = rowPerPage;
  }
  if (!"".equals(sheetName) && null != sheetName) {
   shtName = sheetName;
  } else {
   shtName = "sheet";
  }
   
  cNames=columnNames;
  cLabels=new String[columnNames.length];
  
  for(int i=0;i< columnNames.length;i++){
    
   cLabels[i]=String.valueOf(columnLabels.get(columnNames[i]));
    
  }
  
  HSSFWorkbook wb = new HSSFWorkbook();
  style = wb.createCellStyle();
  style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

  HSSFSheet sheet = createSheet(wb, 1);
  
  int rowCnt = 0;
  int sheetNum = 2;
  Iterator it=list.iterator();
  //Iterator columnNamesKey= columnNames.keySet().iterator();
  
  setSheetColumnTitle(sheet);
  while (it.hasNext()) {
   if (rowCnt == rpp) {
    sheet = createSheet(wb, sheetNum);
    setSheetColumnTitle(sheet);
    rowCnt = 0;
    sheetNum++;
   }
   HSSFRow row = sheet.createRow(rowCnt + 1);
   Map entity=(Map)it.next();
   for(int j=0;j<cNames.length;j++) {
    //String propertyName=(String)columnNamesKey.next();
    HSSFCell cell = row.createCell((short) j);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    String val = (String)entity.get(cNames[j]);
    if (null == val) {
     val = "";
    }
    cell.setCellValue(val);
   }
   rowCnt++;
  }
  try {
   OutputStream os = response.getOutputStream();
   response.reset();
   response.setContentType("application/vnd.ms-excel");
   response.setHeader("Content-disposition", "attachment; filename="
     + getFileName(fileName));
   wb.write(os);
    
  } catch (IOException ex) {
   log.info("Export Excel file error ! " + ex.getMessage());
  }
 }
 

 /**4
  * @param response
  *            HttpServletResponse Response
  * @param list 数据集
  * @param 
  *      String fileName 导出的Excel 文件名称
  * @param sheetName
  *            String 导出的Excel Sheet名称
  * @param columns
  *            List<Column> 导出的 Excel列
  * @param rowPerPage
  *            int 每一个Sheet页的行数
  */
 public static void export(HttpServletResponse response, List list,
   String fileName, String sheetName, List columns, int rowPerPage)  {

  if (rowPerPage <= 10000 && rowPerPage >= 1) {
   rpp = rowPerPage;
  }
  if (!"".equals(sheetName) && null != sheetName) {
   shtName = sheetName;
  } else {
   shtName = "sheet";
  }
  cColumns=columns;
  cNames=new String[columns.size()];
  cLabels=new String[columns.size()];
  for(int i=0;i<cColumns.size();i++){
   Column column=(Column)columns.get(i);
   cNames[i]=column.getName();
   cLabels[i]=column.getLabel();
  }
  HSSFWorkbook wb = new HSSFWorkbook();
  style = wb.createCellStyle();
  style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

  HSSFSheet sheet = createSheet(wb, 1,list.size());
  
  int rowCnt = 0;
  int sheetNum = 2;
  Iterator it=list.iterator();
  //Iterator columnNamesKey= columnNames.keySet().iterator();
  setSheetColumnTitle2(sheet);
  while (it.hasNext()) {
   if (rowCnt == rpp) {
    sheet = createSheet(wb, sheetNum,list.size());
    setSheetColumnTitle2(sheet);
    rowCnt = 0;
    sheetNum++;
   }
   HSSFRow row = sheet.createRow(rowCnt + 1);
   Map entity=(Map)it.next();
   for(int j=0;j<cNames.length;j++) {
    //String propertyName=(String)columnNamesKey.next();
    HSSFCell cell = row.createCell((short) j);
    cell.setEncoding(HSSFCell.ENCODING_UTF_16);
    String val = (String)entity.get(cNames[j]);
    if (null == val) {
     val = "";
    }
    cell.setCellValue(val);
   }
   rowCnt++;
  }
  try {
   OutputStream os = response.getOutputStream();
   response.reset();
   response.setContentType("application/vnd.ms-excel");
   response.setHeader("Content-disposition", "attachment; filename="
     + getFileName(fileName));
   wb.write(os);
    
  } catch (IOException ex) {
   log.info("Export Excel file error ! " + ex.getMessage());
  }
 }
  
 /**
  * 设置Sheet页的列属性 123. *
  * 
  * @param sht
  *            HSSFSheet 124.
  */
 private static void setSheetColumnTitle(HSSFSheet sht) {
  
  HSSFRow row = sht.createRow(0);
  for (int i = 0; i < cLabels.length; i++) {
   HSSFCell cell = row.createCell((short) (i));
   cell.setEncoding(HSSFCell.ENCODING_UTF_16);
   cell.setCellValue(cLabels[i]);
   cell.setCellStyle(style);
   //sht.autoSizeColumn(i,true);
   
  }
 }
 private static void setSheetColumnTitle2(HSSFSheet sht) {
  
  HSSFRow row = sht.createRow(0);
  for (int i = 0; i < cColumns.size(); i++) {
   Column column=(Column)cColumns.get(i);
   HSSFCell cell = row.createCell((short) (i));
   cell.setEncoding(HSSFCell.ENCODING_UTF_16);
   cell.setCellValue(cLabels[i]);
   cell.setCellStyle(style);
   //sht.autoSizeColumn(i,true);
   sht.setColumnWidth((short) i,  column.getWidth());
   
  }
 }

 /**
  * 获得源数据中的列名称
  * 
  * @param rsmd
  *            ResultSetMetaData
  * @return String[]
  */
 private static String[] getColumnNames(ResultSetMetaData rsmd) {
  try {
   StringBuffer result = new StringBuffer("");
   for (int i = 1; i <= rsmd.getColumnCount(); i++) {
    result.append(rsmd.getColumnLabel(i)).append(",");
   }
   if (result.length() > 0) {
    return result.substring(0, result.length() - 1).toString()
      .split(",");
   }
  } catch (Exception e) {
   return null;
  }
  return null;
 }

 /**
  * 创建一个Sheet页并返回该对象
  * 
  * @param wb
  *            HSSFWorkbook
  * @param seq
  *            int
  * @return HSSFSheet
  */
 private static HSSFSheet createSheet(HSSFWorkbook wb, int seq) {
  
  int sup = seq * rpp;
  int sub = (seq - 1) * rpp + 1;
  if (sub < 1) {
   sub = 1;
  }
  HSSFSheet sheet=wb.createSheet( );
  shtName=shtName + "(" + sub + "-" + sup + ")";
   
  wb.setSheetName(seq-1,shtName,HSSFWorkbook.ENCODING_UTF_16);   
   
  return sheet;
 }
 
 private static HSSFSheet createSheet(HSSFWorkbook wb, int seq,int totalSize) {
  
  int sup = seq * rpp < totalSize ? seq * rpp : totalSize;
  int sub = (seq - 1) * rpp + 1;
  if (sub < 1) {
   sub = 1;
  }
  HSSFSheet sheet=wb.createSheet( );
   
  wb.setSheetName(seq-1,shtName + "(" + sub + "-" + sup + ")",HSSFWorkbook.ENCODING_UTF_16);   
   
  return sheet;
 }

 /**
  * 获得导出的文件全名
  * 
  * @param tableName
  *            String
  * @return String
  */
 private static String getFileName(String fileName) {
   fileName+= new Date().getTime() + ".xls";
  try {
   return URLEncoder.encode(fileName, "UTF-8");
  } catch (UnsupportedEncodingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return null;
   
 }
 
 public static Object getPropertyValue(Object entity,String propertyName){
  Object result=null;
  if(methods==null){
   try {
    methods=dumMethod(entity.getClass());
   } catch (IntrospectionException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
  Method method=(Method)methods.get(propertyName);
  try {
     result= method.invoke(entity, null);
  } catch (IllegalArgumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (InvocationTargetException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return result;
  
 }
 
 public static Map dumMethod(Class cls) throws IntrospectionException{
  BeanInfo bean=Introspector.getBeanInfo(cls ,cls.getSuperclass());
  PropertyDescriptor[] propertyDescriptors= bean.getPropertyDescriptors();
  Map map=new HashMap();
  for(int i=0;i<propertyDescriptors.length;i++){
   PropertyDescriptor pd=propertyDescriptors[i];
   System.out.println("属性名="+pd.getName());
   map.put(pd.getName(), pd.getReadMethod());
  }
  return map;
  
 }
 
 static Map methods=null;
 
 
  
 

}

Column.java

package com.sinovatech.bms.common.excel;

public class Column {
 
 private String name;
 private String label;
 private short width=5000;
 
 public Column(){}
 
 public Column(String name,String label,short width){
  this.name=name;
  this.label=label;
  this.width=width;
 }
 public Column(String name,String label ){
  this.name=name;
  this.label=label;
  this.width=5000;
 }
 public String getLabel() {
  return label;
 }
 public void setLabel(String label) {
  this.label = label;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public short getWidth() {
  return width;
 }
 public void setWidth(short width) {
  this.width = width;
 }

}

分享到:
评论

相关推荐

    poi导出数据到excel里

    在这个场景中,"poi导出数据到excel里"指的是使用Apache POI库在Java项目中将数据写入Excel文件的过程。这个功能在数据分析、报表生成或者数据导出等场景中非常常见。以下是对Apache POI导出数据到Excel的详细解释:...

    excelUtil导入导出

    3. **模板化导出**:ExcelUtil可能提供了一种模板机制,允许开发者定义一个Excel模板,然后填充数据生成报告或报表。这种方式在处理批量生成类似格式的Excel文件时非常高效。 4. **错误处理**:在导入数据时,...

    poi导出下拉列表

    这种功能在数据录入、报表制作和数据分析中非常有用,可以提高数据的一致性和准确性。 Apache POI 提供了 `DVConstraint` 和 `DataValidation` 类,用于在Excel中创建数据有效性规则。要创建一个下拉列表,我们首先...

    导出 excelUtil

    在实际项目中,"导出excelUtil"常用于报表生成、数据导出功能,例如用户可以在Web应用中下载包含他们数据的定制报告。此外,它也常用于数据导入,允许用户上传Excel文件以批量插入或更新数据库中的数据。 总的来说...

    POI通用导出Excel(.xls,.xlsx)的方法

    在使用POI导出Excel时,需要注意以下几点: * 文件流的关闭:在导出EXCEL文件时,需要确保文件流的关闭,以免导致内存溢出和连接阻塞。 * 内存占用:在使用XSSF生成Excel 2007 OOXML (.xlsx)格式的文件时,需要注意...

    easyuiPoi导出Excel工具类封装(支持合并单元格)

    这个库主要适用于那些需要在Web应用中生成Excel报告或导出数据的场景,比如数据分析、报表生成等。EasyUIPoI的名字可能来源于流行的前端框架EasyUI,但其核心功能是后端的Excel处理。 Apache POI是Apache软件基金会...

    Excel导出数据(根据Excel模板定义)

    "Excel导出数据(根据Excel模板定义)"这个主题涉及到的核心技术是如何根据预设的Excel模板生成和导出数据,通常用于批量生成报表或者进行复杂的数据呈现。下面将详细解释这一过程及其相关知识点。 1. **Excel模板...

    Java根据模板导出Excel报表并复制模板生成多个Sheet页

    本文提供了一个工具类ExcelUtil,用于根据模板导出Excel报表并复制模板生成多个Sheet页。该工具类使用POI技术来读取模板文件,并将数据写入到Excel文件中。 知识点七:模板路径的使用 模板路径是指Excel模板文件的...

    导出excel错误处理

    ### 导出Excel错误处理及解决方案 #### 异常详情解析 在进行Web请求处理过程中,遇到一个未处理的异常情况。根据提供的异常详细信息,我们可以了解到具体的异常类型及其原因。异常类型为`System....

    操作Excel的工具ExcelUtil源码

    ExcelUtil常被用于数据导入导出、报表生成、数据分析等领域。例如,Web应用中,用户上传Excel文件后,系统可以利用ExcelUtil读取数据并进行处理,或者将处理结果导出为Excel。 8. **学习与实践** 通过阅读和理解...

    poi ExcelUtils demo下载

    5. **使用场景**: ExcelUtils常用于Web应用中的报表生成、数据导入导出、数据分析等场景。例如,它可以用于将数据库中的数据导出为Excel文件供用户下载,或者接收用户上传的Excel文件并将数据导入到数据库。 6. **...

    excelUtil.zip

    在Java编程领域,Excel处理是一项常见的任务,尤其在数据导入导出、报表生成等场景中。本压缩包"excelUtil.zip"提供了两个关键类:`ExcelUtils`和`ExcelData`,它们是针对Excel操作的工具类,方便我们进行Excel文件...

    Excel导出工具类

    在IT行业中,Excel作为一种强大的电子表格工具,常用于数据分析、报表制作等场景。为了方便开发者将程序中的数据快速导出到Excel文件,自定义Excel导出工具类是常见的做法。本篇文章将深入探讨如何利用Java的Apache ...

    ExcelUtil便捷读取工具 v3.1.6.zip

    ExcelUtil便捷读取工具是一款高效且易用的Java库,专为处理Excel数据而设计,适用于各种开发场景,如数据分析、报表生成、数据导入导出等。在v3.1.6版本中,它提供了更稳定的功能和优化的性能,让开发者能够更便捷地...

    Java通过POI和JXL给Excel动态添加水印

    package zp.ExcelUtil; import java.text.SimpleDateFormat; import java.util.Date; public class Model { private String ip; private String user; private Date date; public Model() {} public Model...

    Excel工具类ExcelUtil

    在Java编程中,处理Excel数据是常见的需求,特别是在数据分析、报表生成或者数据导入导出场景下。ExcelUtil作为一个便捷的工具类,可以帮助开发者更高效地完成这些任务。 描述中提到的“NULL”表明没有提供具体的...

    poi解析excel2003、2007

    这个知识点的掌握对于进行数据导入导出、报表生成或者自动化测试等工作非常重要。 **1. POI基本概念** - HSSF(Horrible Spreadsheet Format):是POI项目中处理.xls文件(Excel 97-2003)的部分,基于低级记录类型...

    poi Excel写操作帮助类

    - **报表导出**: 快速生成批量报表文件。 - **数据备份**: 定期备份数据库中的数据到 Excel 文件。 - **数据分析**: 从数据库或其他来源获取数据后,将其整理成 Excel 格式进行分析。 #### 五、总结 通过本文对 `...

    ExcelUtil,Excel的应用程序列表.zip

    在实际应用中,ExcelUtil常用于报表生成、数据导入导出、批量处理数据等场景。例如,你可以用它来生成销售报告,从数据库中提取数据并格式化为Excel,或者将用户填写的Excel表格内容导入到系统中进行分析。 压缩包...

Global site tag (gtag.js) - Google Analytics