报表导出ExcelUtil2

 

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.HSSFFont;
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 org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;

import com.sinovatech.shop.order.model.dto.TOrderDTO;


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

 
abstract public class ExcelUtil2 {
private   Log log = LogFactory.getLog(ExcelUtil2.class);

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

private   HSSFCellStyle style = null;
private HSSFWorkbook  wb;
public ExcelUtil2(){
}
public   void exportBySql(HttpServletResponse response,Session session, String querySql,String countSql,
String fileName, String sheetName, String[] colTitle, int rowPerPage)  {

if (rowPerPage <= 10000 && rowPerPage >= 1) {
rpp = rowPerPage;
}
if (!"".equals(sheetName) && null != sheetName) {
shtName = sheetName;
} else {
shtName = "sheet";
}
 
this.cLabels=colTitle;
 wb = new HSSFWorkbook();
style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//--
SQLQuery query=session.createSQLQuery(querySql);
int curPage=1;
int count =getCount(session,countSql);
int totalPage = ((count + rpp) - 1) / rpp;
for(int i=0;i<totalPage;i++){
curPage=i+1;
int firstResult=(curPage - 1) * rpp;
query.setFirstResult(firstResult);
query.setMaxResults(rpp);
List list= query.list();
HSSFSheet sheet = createSheet(wb, curPage,count);
setSheetColumnTitle(sheet);
for(int rowCnt=0;rowCnt<list.size();rowCnt++){
Object entity=list.get(rowCnt);
HSSFRow row = sheet.createRow(rowCnt + 1);
setCelValue(rowCnt + 1,entity,row,  wb,   sheet); 
}
}
 
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());
}
}
public   void exportBySql(HttpServletResponse response,Session session,Class cls, String querySql,String countSql,
String fileName, String sheetName, String[] colTitle, int rowPerPage)  {

if (rowPerPage <= 10000 && rowPerPage >= 1) {
rpp = rowPerPage;
}
if (!"".equals(sheetName) && null != sheetName) {
shtName = sheetName;
} else {
shtName = "sheet";
}
 
this.cLabels=colTitle;
 wb = new HSSFWorkbook();
style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//--
SQLQuery query=session.createSQLQuery(querySql).addEntity("order1",cls);
int curPage=1;
int count =getCount(session,countSql);
int totalPage = ((count + rpp) - 1) / rpp;
for(int i=0;i<totalPage;i++){
curPage=i+1;
int firstResult=(curPage - 1) * rpp;
query.setFirstResult(firstResult);
query.setMaxResults(rpp);
List list= query.list();
HSSFSheet sheet = createSheet(wb, curPage,count);
setSheetColumnTitle(sheet);
for(int rowCnt=0;rowCnt<list.size();rowCnt++){
Object entity=list.get(rowCnt);
HSSFRow row = sheet.createRow(rowCnt + 1);
setCelValue(rowCnt + 1,entity,row,wb,sheet); 
}
}
 
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());
}
}
public   List<HSSFRow> insertRow(HSSFWorkbook wb, HSSFSheet sheet,
   int starRow, int rows) {
List<HSSFRow> list=new ArrayList<HSSFRow>();
  sheet.shiftRows(starRow + 1, sheet.getLastRowNum(), rows);

  starRow = starRow - 1;
  
  for (int i = 0; i < rows; i++) {

   HSSFRow sourceRow = null;
   HSSFRow targetRow = null;
   HSSFCell sourceCell = null;
   HSSFCell targetCell = null;
   short m;
   
   starRow = starRow + 1;
   sourceRow = sheet.getRow(starRow);
   targetRow = sheet.createRow(starRow + 1);
   targetRow.setHeight(sourceRow.getHeight());

   for (m = sourceRow.getFirstCellNum(); m < sourceRow.getPhysicalNumberOfCells(); m++) {
    
    sourceCell = sourceRow.getCell(m);
    targetCell = targetRow.createCell(m);
    
    targetCell.setEncoding(sourceCell.getEncoding());
    targetCell.setCellStyle(sourceCell.getCellStyle());
    targetCell.setCellType(sourceCell.getCellType());

   }
   list.add(targetRow);
 }
return list;

}
public int getCount(Session session,String countSql){
 return      ((Long)session.createSQLQuery( countSql )
.addScalar( "count" , Hibernate.LONG)
.uniqueResult()).intValue(); 
}
public   void export(HttpServletResponse response,Session session, String hql,
String fileName, String sheetName, String[] colTitle, int rowPerPage)  {

if (rowPerPage <= 10000 && rowPerPage >= 1) {
rpp = rowPerPage;
}
if (!"".equals(sheetName) && null != sheetName) {
shtName = sheetName;
} else {
shtName = "sheet";
}
 
this.cLabels=colTitle;
 wb = new HSSFWorkbook();
style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//--
Query query = session.createQuery("select count(*) "
+ hql);
int curPage=1;
int count =Integer.parseInt(String.valueOf(query.uniqueResult()));
int totalPage = ((count + rpp) - 1) / rpp;
for(int i=0;i<totalPage;i++){
curPage=i+1;
int firstResult=(curPage - 1) * rpp;
query = session.createQuery(hql);
query.setFirstResult(firstResult);
query.setMaxResults(rpp);
List list= query.list();
HSSFSheet sheet = createSheet(wb, curPage,count);
setSheetColumnTitle(sheet);
for(int rowCnt=0;rowCnt<list.size();rowCnt++){
Object entity=list.get(rowCnt);
HSSFRow row = sheet.createRow(rowCnt + 1);
setCelValue(rowCnt + 1,entity,row, wb,   sheet); 
}
}
 
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());
}
}
abstract public void setCelValue(int rowIndex,Object entity,HSSFRow row,HSSFWorkbook wb, HSSFSheet sheet);
 
 

/**
 * 创建一个Sheet页并返回该对象
 * 
 * @param wb
 *            HSSFWorkbook
 * @param seq
 *            int
 * @return HSSFSheet
 */
private   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;
}
/**
 * 设置Sheet页的列属性 123. *
 * 
 * @param sht
 *            HSSFSheet 124.
 */
private   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   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 void setCellValue(HSSFCell cell, Object value) {
setCellValue(cell, value, null, (short) -1);
}
public void setCellRichTextString(HSSFCell cell, Object valueObj,
Object specialValueObj, short fontColor) {
if (valueObj == null) {
return;
}
String value = String.valueOf(valueObj);
String specialValue = String.valueOf(specialValueObj);
HSSFRichTextString richString = new HSSFRichTextString(String
.valueOf(value));
if (specialValue != null && value.contains(specialValue)) {
HSSFCellStyle cellStyle = cell.getCellStyle();
HSSFFont font = wb.createFont();
font.setColor(fontColor);
richString.applyFont(value.indexOf(specialValue), value
.indexOf(specialValue)
+ specialValue.length(), font);
}

cell.setCellValue(richString.getString());
// System.out.println("我执行了---");
}
public void setCellRichTextString(HSSFCell cell, Object valueObj,short fontColor) {

if (valueObj != null) {
String value = String.valueOf(valueObj);
HSSFRichTextString richString = new HSSFRichTextString(String
.valueOf(value));
HSSFFont font = wb.createFont();
font.setColor(fontColor);
richString.applyFont(font);
cell.setCellValue(richString.getString());
}

}

public void setCellValue(HSSFCell cell, Object value, Object specialValue,
short fontColor) {
// 设置页编码格式,可选.
// targetCell.set(sourceCell.ENCODING_COMPRESSED_UNICODE);
// System.out.println("cell===="+cell);
int cType = cell.getCellType();

switch (cType) {
case HSSFCell.CELL_TYPE_BOOLEAN:
cell.setCellValue(Boolean.valueOf(String.valueOf(value)));
break;
case HSSFCell.CELL_TYPE_ERROR:
cell.setCellErrorValue(Byte.valueOf(value.toString()));

break;
case HSSFCell.CELL_TYPE_FORMULA:
cell.setCellFormula(parseFormula(String.valueOf(value.toString())));

// parseFormula这个函数的用途在后面说明
break;
case HSSFCell.CELL_TYPE_NUMERIC:
cell.setCellValue(Double.valueOf(value.toString()));

break;
case HSSFCell.CELL_TYPE_STRING:
setCellRichTextString(cell, value, specialValue, fontColor);
// cell.setCellValue(new HSSFRichTextString(String.valueOf(value)));
break;
case HSSFCell.CELL_TYPE_BLANK:
if (value != null)
cell.setCellValue(value.toString());
break;
default:
System.out.println("cType=" + cType + "  setCellValue 没有匹配项");
break;
}
}

public Object getCellValue(HSSFCell cell) {

int cType = cell.getCellType();

switch (cType) {
case HSSFCell.CELL_TYPE_BOOLEAN:

return cell.getBooleanCellValue();

case HSSFCell.CELL_TYPE_ERROR:

return cell.getErrorCellValue();

case HSSFCell.CELL_TYPE_FORMULA:
return parseFormula(cell.getCellFormula());
// parseFormula这个函数的用途在后面说明

case HSSFCell.CELL_TYPE_NUMERIC:

return cell.getNumericCellValue();

case HSSFCell.CELL_TYPE_STRING:

//return cell.getRichStringCellValue();
return cell.getStringCellValue();
case HSSFCell.CELL_TYPE_BLANK:
return cell.getStringCellValue();
default:
System.out.println("cType=" + cType + "  getCellValue 没有匹配项");
return null;

}

}

private String parseFormula(String pPOIFormula) {
final String cstReplaceString = "ATTR(semiVolatile)";
StringBuffer result = null;
int index;
result = new StringBuffer();
index = pPOIFormula.indexOf(cstReplaceString);
if (index >= 0) {
result.append(pPOIFormula.substring(0, index));
result.append(pPOIFormula.substring(index
+ cstReplaceString.length()));
} else {
result.append(pPOIFormula);
}
return result.toString();
}
}



---调用方式
//导出号码订单
public void exportExcelNum(HttpServletResponse response,  String querySql,String countSql,
String fileName, String sheetName, final String[] colTitle, int rowPerPage,final String AccMoney,final String ty){
ExcelUtil2 excelUtil=new ExcelUtil2(){
@Override
public void setCelValue(int rowIndex,Object entity,HSSFRow row,HSSFWorkbook wb, HSSFSheet sheet) {
// TODO Auto-generated method stub
TOrderDTO dto=(TOrderDTO) entity;
List<TItemDTO> items=dto.getItems();
int i=0;
for(TItemDTO item:items){
if(item==null)
continue;
if(!(item.getSubType()).equals(ty))
continue;
System.out.println("--------"+i);
if(i>0){
  row=this.insertRow(wb, sheet, rowIndex+i-1, 1).get(0);
}
for(int col=0;col<colTitle.length;col++){
HSSFCell cell = row.createCell((short) col);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
String title=colTitle[col].trim();
sheet.setColumnWidth((short) col,  (short )5000);
if(title.equals("下单日期")||title.equals("下单时间")){
cell.setCellValue(dto.getOrderTime()==null?"":DateUtil.getFormatDate(dto.getOrderTime(),"yyyy-MM-dd hh:mm:ss"));
continue;
}
else if(title.equals("持有人")){
cell.setCellValue(dto.getConsignee()==null?"":item.getItemInfo().getOwnerName());
continue;
}
else if(title.equals("支付状态") ){
cell.setCellValue(dto.getPayStateChar()  );
continue;
}
else if(title.equals("子订单")||title.equals("子订单编号")||title.equals("子订单号")){
cell.setCellValue(item.getId());
continue;
}
else if(title.equals("状态")||title.equals("物流状态")){
cell.setCellValue( item.getWlstatusChar() );
continue;
}
else if(title.equals("金额(/元)") ){
cell.setCellValue( item.getSubtotal()+"" );
continue;
}
else if(title.equals("订单状态") ){
if("0".equals(dto.getState())){
cell.setCellValue("生成订单");
}else if("1".equals(dto.getState())){
cell.setCellValue("已结单");
}else if("2".equals(dto.getState())){
cell.setCellValue("作废");
}else{
cell.setCellValue("");
}
continue;
}
else if(title.equals("商品名称") ){
cell.setCellValue( item.getProduct()==null?"":item.getProduct().getName()+"" );
continue;
}
else if(title.equals("所在地") ){
Map<String, String> cityMap = OrderUtil.putAreaToMap();
cell.setCellValue(cityMap.get(item.getProduct().getUndefine1())+"");
continue;
}
else if(title.equals("截止日期")||title.equals("截止时间")){
cell.setCellValue(dto.getOrderEndTime()==null?"":DateUtil.getFormatDate(dto.getOrderEndTime(),"yyyy-MM-dd hh:mm:ss"));
continue;
}
else if(title.equals("营业厅")){
cell.setCellValue(item.getItemInfo()==null?"":item.getItemInfo().getOFFICENAME()+"");
continue;
}
else{
cell.setCellValue( title+" ,没有对应的列" );
}
 
}
i++;
}
row=this.insertRow(wb, sheet, rowIndex+i-1, 1).get(0);
for(int col=0;col<colTitle.length;col++){
if(col==colTitle.length-1){
 HSSFCell cell = row.createCell((short) col);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
 sheet.setColumnWidth((short) col,  (short )5000);
 cell.setCellValue("已收金额:"+AccMoney);
}else{
HSSFCell cell = row.createCell((short) col);
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
sheet.setColumnWidth((short) col,  (short )5000);
cell.setCellValue("");
}
}
 
}
};
 
excelUtil.exportBySql(    response,  this.getSession(),  TOrderDTO.class,   querySql,  countSql,fileName,   sheetName,   colTitle,   rowPerPage);
  
}

你可能感兴趣的:(导出Excel)