java 操作Excel文件一些感悟(内存溢出)

java中操作报表很正常:所以Excel很常用到,我介绍几个关于封装类:


 

import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;


public class CommonExcelData implements java.io.Serializable, IsDataBean{
	private String reportName;    //报表的大标题
	private HashMap otherDatas;   //其他数据
	private HashMap queryParams;     //查询条件
	private HashMap queryParamsn;     //查询条件2
	private HashMap totalInfos;    //汇总信息
	private String[][] columnTitles;    //列标题
	private String[][] columnTitlesEn;    //列标题
	private boolean isWarrantReport;
	private Collection datas;    //正文数据
	private HashSet orderNum;
	private Long fileId;
	private ReportCollection  allCollection;
	private String reportImage1;    //图片路径
	private String reportImage2;    //图片路径
	private HashMap NewImage;    //NEW
	private HashMap TimImage;    //TIM
	private HashMap EqtImage;    //EQT
	private HashMap CnlImage;    //CNL
	private HashMap RteImage;    //RTE
	private HashMap AllImage;    //所有报文
	private HashMap ShareImage;    //所占报文
	private String reportNameImage;    //报表提示信息
	
	
    public HashMap getQueryParamsn() {
		return queryParamsn;
	}
	public void setQueryParamsn(HashMap queryParamsn) {
		this.queryParamsn = queryParamsn;
	}
	//    private List<ReportDataByDept> listDataByDept;
	public ReportCollection getAllCollection() {
		return allCollection;
	}
	public void setAllCollection(ReportCollection allCollection) {
		this.allCollection = allCollection;
	}
	public String getReportName() {
		return reportName;
	}
	public void setReportName(String reportName) {
		this.reportName = reportName;
	}
	public HashMap getTotalInfos() {
		return totalInfos;
	}
	public void setTotalInfos(HashMap totalInfos) {
		this.totalInfos = totalInfos;
	}
	public Collection getDatas() {
		return datas;
	}
	public void setDatas(Collection datas) {
		this.datas = datas;
	}
	public String[][] getColumnTitles() {
		return columnTitles;
	}
	public void setColumnTitles(String[][] columnTitles) {
		this.columnTitles = columnTitles;
	}
	public HashMap getOtherDatas() {
		return otherDatas;
	}
	public void setOtherDatas(HashMap otherDatas) {
		this.otherDatas = otherDatas;
	}
	public HashMap getQueryParams() {
		return queryParams;
	}
	public void setQueryParams(HashMap queryParams) {
		this.queryParams = queryParams;
	}
	public HashSet getOrderNum() {
		return orderNum;
	}
	public void setOrderNum(HashSet orderNum) {
		this.orderNum = orderNum;
	}
	public Long getFileId() {
		return fileId;
	}
	public void setFileId(Long fileId) {
		this.fileId = fileId;
	}
//	public List<ReportDataByDept> getListDataByDept() {
//		return listDataByDept;
//	}
//	public void setListDataByDept(List<ReportDataByDept> listDataByDept) {
//		this.listDataByDept = listDataByDept;
//	}
	public String[][] getColumnTitlesEn() {
		return columnTitlesEn;
	}
	public void setColumnTitlesEn(String[][] columnTitlesEn) {
		this.columnTitlesEn = columnTitlesEn;
	}
	public boolean isWarrantReport() {
		return isWarrantReport;
	}
	public void setWarrantReport(boolean isWarrantReport) {
		this.isWarrantReport = isWarrantReport;
	}
	
	public String getReportImage1() {
		return reportImage1;
	}
	public void setReportImage1(String reportImage1) {
		this.reportImage1 = reportImage1;
	}
	public String getReportImage2() {
		return reportImage2;
	}
	public void setReportImage2(String reportImage2) {
		this.reportImage2 = reportImage2;
	}
	public HashMap getNewImage() {
		return NewImage;
	}
	public void setNewImage(HashMap newImage) {
		NewImage = newImage;
	}
	public HashMap getTimImage() {
		return TimImage;
	}
	public void setTimImage(HashMap timImage) {
		TimImage = timImage;
	}
	public HashMap getEqtImage() {
		return EqtImage;
	}
	public void setEqtImage(HashMap eqtImage) {
		EqtImage = eqtImage;
	}
	public HashMap getCnlImage() {
		return CnlImage;
	}
	public void setCnlImage(HashMap cnlImage) {
		CnlImage = cnlImage;
	}
	public HashMap getRteImage() {
		return RteImage;
	}
	public void setRteImage(HashMap rteImage) {
		RteImage = rteImage;
	}
	public HashMap getAllImage() {
		return AllImage;
	}
	public void setAllImage(HashMap allImage) {
		AllImage = allImage;
	}
	public HashMap getShareImage() {
		return ShareImage;
	}
	public void setShareImage(HashMap shareImage) {
		ShareImage = shareImage;
	}
	public String getReportNameImage() {
		return reportNameImage;
	}
	public void setReportNameImage(String reportNameImage) {
		this.reportNameImage = reportNameImage;
	}


}

 


生成报表类:

 

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import jxl.Workbook;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableImage;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

public class ReportGenerate {
	private String fileName;
	private CommonExcelData commonData;
	private DecimalFormat df = new DecimalFormat("0.00"); 
	
	public ReportGenerate(String fileName, CommonExcelData commonData) {
		this.fileName = fileName;
		this.commonData = commonData;
	}
   
	public void generateReport()throws Exception {
        File file = new File(fileName);

        WritableWorkbook workbook = null;

        try {
            workbook = Workbook.createWorkbook(file);

            WritableSheet sheet = workbook.createSheet("sheet0", 0);
            
            //大标题的格式
            WritableFont titleNameFont = new WritableFont(WritableFont.ARIAL, 14, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
            WritableCellFormat titleNameFormat = new WritableCellFormat(titleNameFont);
            titleNameFormat.setAlignment(jxl.format.Alignment.CENTRE);
            titleNameFormat.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);            
            
            //列标题的格式
            WritableFont columnNameFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
            WritableCellFormat columnNameFormat = new WritableCellFormat(columnNameFont);
            columnNameFormat.setAlignment(jxl.format.Alignment.CENTRE);
            columnNameFormat.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);

            //正文数据格式
            WritableFont detFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
            WritableCellFormat detFormat = new WritableCellFormat(detFont);
            detFormat.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);

            Label l = null;
            
            //将大标题写入报表文件
            l = new Label(0, 0, commonData.getReportName(), titleNameFormat);
            sheet.addCell(l);
            sheet.mergeCells(0, 0, 5, 0);   //大标题跨5列显示
            
            //将查询条件写入报表文件
            int column = 0;     //列坐标
            int row = 2;    //行坐标
            
            Map queryParams = commonData.getQueryParams();
            if(queryParams != null) {
            	int num = 0;
            	Set keys = queryParams.keySet();
            	Iterator itor = keys.iterator();
            	while(itor.hasNext()) {
            		num++;
            		
            		String key = (String) itor.next();
            		l = new Label(column, row, key, columnNameFormat);
            		sheet.addCell(l);
            		column++;
            		
            		Object value = queryParams.get(key);
            		String content = getContent(value);
            		l = new Label(column, row, content, detFormat);
            		sheet.addCell(l);
            		column++;
            		
            		if(num % 2 == 1) {   //增加空格
            			l = new Label(column, row, " ", columnNameFormat);
            			sheet.addCell(l);
            			column++;
            		} else {   //换行
            			row++;
            			column = 0;
            		}
            	}

            	row+=2;
            }
            
            
            //将其他数据写入报表文件
            column = 0;
            Map otherDatas = commonData.getOtherDatas();
            if(otherDatas != null) {
            	int num = 0;
            	Set keys = otherDatas.keySet();
            	Iterator itor = keys.iterator();
            	while(itor.hasNext()) {
            		num++;
            		
            		String key = (String) itor.next();
            		l = new Label(column, row, key, columnNameFormat);
            		sheet.addCell(l);
            		column++;
            		
            		Object value = otherDatas.get(key);
            		String content = getContent(value);
            		l = new Label(column, row, content, detFormat);
            		sheet.addCell(l);
            		column++;
            		
            		if(num % 2 == 1) {   //增加空格
            			l = new Label(column, row, " ", columnNameFormat);
            			sheet.addCell(l);
            			column++;
            		} else {   //换行
            			row++;
            			column = 0;
            		}
            	}

            	row+=2;
            }
            
            column = 0;
            //将列标题写入报表文件
              String[][] titles = commonData.getColumnTitles();
            for (int i = 0; i < titles.length; i++) {
                l = new Label(column++, row, titles[i][1], columnNameFormat);
                sheet.addCell(l);
            }

            row++;
            if(commonData.isWarrantReport()){
            	 column = 0;
                 //将列英文标题写入报表文件
                   String[][] titles1 = commonData.getColumnTitlesEn();
                 for (int i = 0; i < titles.length; i++) {
                     l = new Label(column++, row, titles1[i][1], columnNameFormat);
                     sheet.addCell(l);
                 }
                 row++;
            }
            
            //写正文数据
           Collection datas = commonData.getDatas();
            if(datas != null) {
	            Iterator iter = datas.iterator();
	            while(iter.hasNext()) {
	                column = 0;
	
	                Object obj = iter.next();
	                Class thisClass = obj.getClass();
	                
	                for(int j = 0; j < titles.length; j++) {
	                	String fieldName = titles[j][0];
	                	Field field = thisClass.getDeclaredField(fieldName);
	                	
	                	Class fieldType = field.getType();     //取属性数据类型
	
	/*
	                Field[] fields = thisClass.getDeclaredFields();
	                for(int j = 0; j < fields.length; j++) {
	                    String fieldName = fields[j].getName();    //取属性名
	                    Class fieldType = fields[j].getType();     //取属性数据类型
	*/
	                    String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
	                    if(fieldType.getName().equals("java.lang.Boolean")) {     //布尔数据类型的属性获得方法以is开头
	                        getMethodName = "is" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
	                    }
	
	                    Method getMethod = thisClass.getMethod(getMethodName, new Class[]{});
	                    Object fieldValue = getMethod.invoke(obj, new Object[]{});
	
	                    String content = getContent(fieldValue);
	
	                    l = new Label(column++, row, content, detFormat);
	                    sheet.addCell(l);                    
	                }
	                
	                row++;
	            }
            }

            //将汇总信息写入报表文件
            HashMap totalInfos = commonData.getTotalInfos();
            
            //Object totalInfos = commonData.getTotalInfos();
            if(totalInfos != null) {
            	
	            Class thisClass = totalInfos.getClass();
	            
	            l = new Label(0, row, "合计:", columnNameFormat);
	            sheet.addCell(l);
	            
            	Set keys = totalInfos.keySet();
            	Iterator itor = keys.iterator();
            	while(itor.hasNext()) {
            		String key = ((String) itor.next()).trim();
            		
            		int index = 1;
            		for(int i = 1; i < titles.length; i++) {
            			if(key.equals(titles[i][0].trim())) {
            				index = i;
            				break;
            			}
            		}
//            		int index = 0;
//            		for(int i = 0; i < titles.length; i++) {
//            			if(key.equals(titles[i][0].trim())) {
//            				index = i;
//            				break;
//            			}
//            		}
            		
            		Object value = totalInfos.get(key);
            		String content = getContent(value);
            		
	                l = new Label(index, row, content, detFormat);
	                sheet.addCell(l);                    
            	}
/*
            	Field[] fields = thisClass.getDeclaredFields();
	            column = 1;
	            for(int j = 1; j < fields.length; j++) {
	                String fieldName = fields[j].getName();    //取属性名
	                Class fieldType = fields[j].getType();     //取属性数据类型
	
	                String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
	                if(fieldType.getName().equals("java.lang.Boolean")) {     //布尔数据类型的属性获得方法以is开头
	                    getMethodName = "is" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
	                }
	
	                Method getMethod = thisClass.getMethod(getMethodName, new Class[]{});
	                Object fieldValue = getMethod.invoke(totalInfos, new Object[]{});
	
	                String content = getContent(fieldValue);
	
	                l = new Label(column++, row, content, detFormat);
	                sheet.addCell(l);                    
	            }   
*/
            }
            
          //将图片信息写入报表文件
//            String reportImage = commonData.getReportImage();
//            sheet.addCell(new Label(0, 3, "展示图片 jxl只支持png格式的", columnNameFormat)); // 展示图片标题
//            sheet.mergeCells(0, 3, 3, 3); // 合并图片标题单元格
//
//            File fileImage = new File(reportImage); // 获得图片
//            WritableImage image = new WritableImage(0, 4, 3, 3, fileImage); // 设置图片显示位置
//            // 4,4代表图片的高和宽占4个单元格
//
//            sheet.addImage(image); // 加载图片
            
          
            workbook.write();
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        	if(workbook!=null){
        		try {
					workbook.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
        	}
        }
    }
	public void generateReportImage()throws Exception {
        File file = new File(fileName);

        WritableWorkbook workbook = null;

        try {
            workbook = Workbook.createWorkbook(file);

            WritableSheet sheet = workbook.createSheet("sheet0", 0);
            
            //大标题的格式
            WritableFont titleNameFont = new WritableFont(WritableFont.ARIAL, 14, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
            WritableCellFormat titleNameFormat = new WritableCellFormat(titleNameFont);
            titleNameFormat.setAlignment(jxl.format.Alignment.CENTRE);
            titleNameFormat.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);            
            
            //列标题的格式
            WritableFont columnNameFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
            WritableCellFormat columnNameFormat = new WritableCellFormat(columnNameFont);
            columnNameFormat.setAlignment(jxl.format.Alignment.CENTRE);
            columnNameFormat.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);

            //正文数据格式
            WritableFont detFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
            WritableCellFormat detFormat = new WritableCellFormat(detFont);
            detFormat.setBorder(Border.ALL, BorderLineStyle.THIN, Colour.BLACK);

            Label l = null;
            //将大标题写入报表文件
            l = new Label(0, 0, commonData.getReportName(), titleNameFormat);
            sheet.addCell(l);
            sheet.mergeCells(0, 0, 5, 0);   //大标题跨5列显示
            sheet.addCell(new Label(0, 1, commonData.getReportNameImage(), columnNameFormat)); 
            sheet.mergeCells(0, 1, 5, 0); 
            
            
            //将查询条件写入报表文件
            int column = 0;     //列坐标
            int row = 2;    //行坐标
            
            Map queryParams = commonData.getQueryParams();
            if(queryParams != null) {
            	int num = 0;
            	Set keys = queryParams.keySet();
            	Iterator itor = keys.iterator();
            	while(itor.hasNext()) {
            		num++;
            		
            		String key = (String) itor.next();
            		l = new Label(column, row, key, columnNameFormat);
            		sheet.addCell(l);
            		column++;
            		
            		Object value = queryParams.get(key);
            		String content = getContent(value);
            		l = new Label(column, row, content, detFormat);
            		sheet.addCell(l);
            		column++;
            		
            		if(num % 2 == 1) {   //增加空格
            			l = new Label(column, row, " ", columnNameFormat);
            			sheet.addCell(l);
            			column++;
            		} else {   //换行
            			row++;
            			column = 0;
            		}
            	}

            	row+=2;
            }

            //将查询条件2写入报表文件
            int columnn = 0;     //列坐标
            int rown = 3;    //行坐标
            
            Map queryParamsn = commonData.getQueryParamsn();
            if(queryParams != null) {
            	int num = 0;
            	Set keys = queryParamsn.keySet();
            	Iterator itor = keys.iterator();
            	while(itor.hasNext()) {
            		num++;
            		
            		String key = (String) itor.next();
            		l = new Label(columnn, rown, key, columnNameFormat);
            		sheet.addCell(l);
            		columnn++;
            		
            		Object value2 = queryParamsn.get(key);
            		String content = getContent(value2);
            		l = new Label(columnn, rown, content, detFormat);
            		sheet.addCell(l);
            		columnn++;
            		
            		if(num % 2 == 1) {   //增加空格
            			l = new Label(columnn, rown, " ", columnNameFormat);
            			sheet.addCell(l);
            			columnn++;
            		} else {   //换行
            			row++;
            			columnn = 0;
            		}
            	}

            	rown+=2;
            }
            
            //将其他数据写入报表文件
            column = 0;
            Map otherDatas = commonData.getOtherDatas();
            if(otherDatas != null) {
            	int num = 0;
            	Set keys = otherDatas.keySet();
            	Iterator itor = keys.iterator();
            	while(itor.hasNext()) {
            		num++;
            		
            		String key = (String) itor.next();
            		l = new Label(column, row, key, columnNameFormat);
            		sheet.addCell(l);
            		column++;
            		
            		Object value = otherDatas.get(key);
            		String content = getContent(value);
            		l = new Label(column, row, content, detFormat);
            		sheet.addCell(l);
            		column++;
            		
            		if(num % 2 == 1) {   //增加空格
            			l = new Label(column, row, " ", columnNameFormat);
            			sheet.addCell(l);
            			column++;
            		} else {   //换行
            			row++;
            			column = 0;
            		}
            	}

            	row+=2;
            }
            
            column = 0;
            //将列标题写入报表文件
              String[][] titles = commonData.getColumnTitles();
            for (int i = 0; i < titles.length; i++) {
                l = new Label(column++, 4, titles[i][1], columnNameFormat);
                sheet.addCell(l);
            }

            row++;
            if(commonData.isWarrantReport()){
            	 column = 0;
                 //将列英文标题写入报表文件
                   String[][] titles1 = commonData.getColumnTitlesEn();
                 for (int i = 0; i < titles.length; i++) {
                     l = new Label(column++, row, titles1[i][1], columnNameFormat);
                     sheet.addCell(l);
                 }
                 row++;
            }
            
            //写正文数据
           Collection datas = commonData.getDatas();
            if(datas != null) {
	            Iterator iter = datas.iterator();
	            while(iter.hasNext()) {
	                column = 0;
	
	                Object obj = iter.next();
	                Class thisClass = obj.getClass();
	                
	                for(int j = 0; j < titles.length; j++) {
	                	String fieldName = titles[j][0];
	                	Field field = thisClass.getDeclaredField(fieldName);
	                	
	                	Class fieldType = field.getType();     //取属性数据类型
	
	/*
	                Field[] fields = thisClass.getDeclaredFields();
	                for(int j = 0; j < fields.length; j++) {
	                    String fieldName = fields[j].getName();    //取属性名
	                    Class fieldType = fields[j].getType();     //取属性数据类型
	*/
	                    String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
	                    if(fieldType.getName().equals("java.lang.Boolean")) {     //布尔数据类型的属性获得方法以is开头
	                        getMethodName = "is" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
	                    }
	
	                    Method getMethod = thisClass.getMethod(getMethodName, new Class[]{});
	                    Object fieldValue = getMethod.invoke(obj, new Object[]{});
	
	                    String content = getContent(fieldValue);
	
	                    l = new Label(column++, row, content, detFormat);
	                    sheet.addCell(l);                    
	                }
	                
	                row++;
	            }
            }

            //将NEW报文信息写入报表文件
            HashMap NewImage = commonData.getNewImage();
            
            //Object totalInfos = commonData.getTotalInfos();
            if(NewImage != null) {
            	
	            Class thisClass = NewImage.getClass();
	            
	            l = new Label(0, 5, "NEW:", columnNameFormat);
	            sheet.addCell(l);
	            
            	Set keys = NewImage.keySet();
            	Iterator itor = keys.iterator();
            	while(itor.hasNext()) {
            		String key = ((String) itor.next()).trim();
            		
            		int index = 1;
            		for(int i = 1; i < titles.length; i++) {
            			if(key.equals(titles[i][0].trim())) {
            				index = i;
            				break;
            			}
            		}            		
            		Object value = NewImage.get(key);
            		String content = getContent(value);
            		
	                l = new Label(index, 5, content, detFormat);
	                sheet.addCell(l);                    
            	}
            }
          //将TIM报文信息写入报表文件
            HashMap TimImage = commonData.getTimImage();
            
            //Object totalInfos = commonData.getTotalInfos();
            if(TimImage != null) {
            	
	            Class thisClass = TimImage.getClass();
	            
	            l = new Label(0, 6, "TIM:", columnNameFormat);
	            sheet.addCell(l);
	            
            	Set keys = TimImage.keySet();
            	Iterator itor = keys.iterator();
            	while(itor.hasNext()) {
            		String key = ((String) itor.next()).trim();
            		
            		int index = 1;
            		for(int i = 1; i < titles.length; i++) {
            			if(key.equals(titles[i][0].trim())) {
            				index = i;
            				break;
            			}
            		}            		
            		Object value = TimImage.get(key);
            		String content = getContent(value);
            		
	                l = new Label(index, 6, content, detFormat);
	                sheet.addCell(l);                    
            	}
            }
            //将EQT报文信息写入报表文件
            HashMap EqtImage = commonData.getEqtImage();
            
            //Object totalInfos = commonData.getTotalInfos();
            if(EqtImage != null) {
            	
	            Class thisClass = EqtImage.getClass();
	            
	            l = new Label(0, 7, "EQT:", columnNameFormat);
	            sheet.addCell(l);
	            
            	Set keys = EqtImage.keySet();
            	Iterator itor = keys.iterator();
            	while(itor.hasNext()) {
            		String key = ((String) itor.next()).trim();
            		
            		int index = 1;
            		for(int i = 1; i < titles.length; i++) {
            			if(key.equals(titles[i][0].trim())) {
            				index = i;
            				break;
            			}
            		}            		
            		Object value = EqtImage.get(key);
            		String content = getContent(value);
            		
	                l = new Label(index, 7, content, detFormat);
	                sheet.addCell(l);                    
            	}
            }
          //将CNL报文信息写入报表文件
            HashMap CnlImage = commonData.getCnlImage();
            
            //Object totalInfos = commonData.getTotalInfos();
            if(CnlImage != null) {
            	
	            Class thisClass = CnlImage.getClass();
	            
	            l = new Label(0, 8, "CNL:", columnNameFormat);
	            sheet.addCell(l);
	            
            	Set keys = CnlImage.keySet();
            	Iterator itor = keys.iterator();
            	while(itor.hasNext()) {
            		String key = ((String) itor.next()).trim();
            		
            		int index = 1;
            		for(int i = 1; i < titles.length; i++) {
            			if(key.equals(titles[i][0].trim())) {
            				index = i;
            				break;
            			}
            		}            		
            		Object value = CnlImage.get(key);
            		String content = getContent(value);
            		
	                l = new Label(index, 8, content, detFormat);
	                sheet.addCell(l);                    
            	}
            }
          //将RTE报文信息写入报表文件
            HashMap RteImage = commonData.getRteImage();
            
            //Object totalInfos = commonData.getTotalInfos();
            if(RteImage != null) {
            	
	            Class thisClass = RteImage.getClass();
	            
	            l = new Label(0, 9, "RTE:", columnNameFormat);
	            sheet.addCell(l);
	            
            	Set keys = RteImage.keySet();
            	Iterator itor = keys.iterator();
            	while(itor.hasNext()) {
            		String key = ((String) itor.next()).trim();
            		
            		int index = 1;
            		for(int i = 1; i < titles.length; i++) {
            			if(key.equals(titles[i][0].trim())) {
            				index = i;
            				break;
            			}
            		}            		
            		Object value = RteImage.get(key);
            		String content = getContent(value);
            		
	                l = new Label(index, 9, content, detFormat);
	                sheet.addCell(l);                    
            	}
            }
          //将所有报文信息写入报表文件
            HashMap AllImage = commonData.getAllImage();
            
            //Object totalInfos = commonData.getTotalInfos();
            if(AllImage != null) {
            	
	            Class thisClass = AllImage.getClass();
	            
	            l = new Label(0, 10, "所有报文:", columnNameFormat);
	            sheet.addCell(l);
	            
            	Set keys = AllImage.keySet();
            	Iterator itor = keys.iterator();
            	while(itor.hasNext()) {
            		String key = ((String) itor.next()).trim();
            		
            		int index = 1;
            		for(int i = 1; i < titles.length; i++) {
            			if(key.equals(titles[i][0].trim())) {
            				index = i;
            				break;
            			}
            		}            		
            		Object value = AllImage.get(key);
            		String content = getContent(value);
            		
	                l = new Label(index, 10, content, detFormat);
	                sheet.addCell(l);                    
            	}
            }
            
          //将所占比例信息写入报表文件
            HashMap ShareImage = commonData.getShareImage();
            
            if(ShareImage != null) {
            	
	            Class thisClass = ShareImage.getClass();
	            
	            l = new Label(0, 11, "所占比例:", columnNameFormat);
	            sheet.addCell(l);
	            
            	Set keys = ShareImage.keySet();
            	Iterator itor = keys.iterator();
            	while(itor.hasNext()) {
            		String key = ((String) itor.next()).trim();
            		
            		int index = 1;
            		for(int i = 1; i < titles.length; i++) {
            			if(key.equals(titles[i][0].trim())) {
            				index = i;
            				break;
            			}
            		}            		
            		Object value = ShareImage.get(key);
            		String content = getContent(value);
            		
	                l = new Label(index, 11, content, detFormat);
	                sheet.addCell(l);                    
            	}
            }
            
          //将图片1信息写入报表文件
            String reportImage = commonData.getReportImage1();
//            sheet.addCell(new Label(0, 12, "报文处理结果", columnNameFormat)); // 展示图片标题
//            sheet.mergeCells(0, 12, 5, 12); // 合并图片标题单元格
            File fileImage = new File(reportImage); // 获得图片
            WritableImage image = new WritableImage(0, 13, 6, 22, fileImage); // 设置图片显示位置
            sheet.addImage(image); // 加载图片
           
          //将图片2信息写入报表文件
            String reportImage2 = commonData.getReportImage2();
//            sheet.addCell(new Label(8, 12, "报文数量", columnNameFormat)); // 展示图片标题
//            sheet.mergeCells(8, 12, 7, 0); // 合并图片标题单元格
            File fileImage2 = new File(reportImage2); // 获得图片
            WritableImage image2 = new WritableImage(6, 13, 6, 22, fileImage2); // 设置图片显示位置
            sheet.addImage(image2); // 加载图片
          
            workbook.write();
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        	if(workbook!=null){
        		try {
					workbook.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
        	}
        }
    }
    private String getContent(Object fieldValue) {
    	String content = "";
    	
    	SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    	
    	if(fieldValue == null) {
    		content = "";
    	} else if(fieldValue instanceof String) {
            content = (String) fieldValue;
        } else if(fieldValue instanceof Integer) {
            content = fieldValue.toString();
        } else if(fieldValue instanceof Double) {   //需要消除科学计数法
        	Double value = (Double) fieldValue;
        	value = ArithUtil.round(value, 2);
        	content = df.format(value);
            //content = fieldValue.toString();
        } else if(fieldValue instanceof Float) {    //需要消除科学计数法
        	Float value = (Float) fieldValue;
        	Double dValue = new Double(value);
        	dValue = ArithUtil.round(dValue, 2);
        	content = df.format(dValue);
//            content = fieldValue.toString();
        } else if(fieldValue instanceof Date) {
            content = format.format(fieldValue);
        } else if(fieldValue instanceof Boolean) {
            content = fieldValue.toString();
        }
        else if(fieldValue instanceof Long)
        {
        	  content = fieldValue.toString();
        } else if(fieldValue instanceof BigDecimal) {
        	((BigDecimal)fieldValue).setScale(2,java.math.BigDecimal.ROUND_HALF_UP);
            content = df.format(fieldValue);
        }
    	
    	return content;
    }
}


当出现大数据的时候一次性导出的时候很常会内存溢出:我就想到一个直接用流导出,但是不能设置样式

 

 

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
public class ReportForLee {
	
	private String fileName;
	private CommonExcelData commonData;
	private DecimalFormat df = new DecimalFormat("0.00"); 
	
	public ReportForLee(String fileName, CommonExcelData commonData) {
		this.fileName = fileName;
		this.commonData = commonData;
	}
	
	public void generateReport( )throws Exception {
		File file = new File(fileName);
		FileOutputStream out = new FileOutputStream(file);  
	    OutputStreamWriter osw = new OutputStreamWriter(out, "GB2312");  
	    BufferedWriter bw = new BufferedWriter(osw);   
	    StringBuffer sbTitle = new StringBuffer();
	    // 创建表头   
	    String[][] titles = commonData.getColumnTitles();
        for (int i = 0; i < titles.length; i++) {
        	sbTitle.append(titles[i][1]).append("\t");
        }
        sbTitle.append("\r\n"); 
        bw.write(sbTitle.toString());       
        StringBuffer mess = new StringBuffer();  
        Collection<?> list = commonData.getDatas();
        if(list != null) {
            Iterator<?> iter = list.iterator();
            while(iter.hasNext()) {
                Object obj = iter.next();
                Class<? extends Object> thisClass = obj.getClass();
                for(int j = 0; j < titles.length; j++) {
                	String fieldName = titles[j][0];
                	Field field = thisClass.getDeclaredField(fieldName);
                	Class<?> fieldType = field.getType();     //取属性数据类型
                    String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
                    if(fieldType.getName().equals("java.lang.Boolean")) {     //布尔数据类型的属性获得方法以is开头
                        getMethodName = "is" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
                    }
                    Method getMethod = thisClass.getMethod(getMethodName, new Class[]{});
                    Object fieldValue = getMethod.invoke(obj, new Object[]{});
                    String content = getContent(fieldValue);
                    mess.append(content).append("\t");              
                }
                mess.append("\r\n");
            }
     }
        bw.write(mess.toString());
        bw.close();  
        osw.close();  
        out.close();   
	}
	
    private String getContent(Object fieldValue) {
    	String content = "";
    	
    	SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    	
    	if(fieldValue == null) {
    		content = "";
    	} else if(fieldValue instanceof String) {
            content = (String) fieldValue;
        } else if(fieldValue instanceof Integer) {
            content = fieldValue.toString();
        } else if(fieldValue instanceof Double) {   //需要消除科学计数法
        	Double value = (Double) fieldValue;
        	value = ArithUtil.round(value, 2);
        	content = df.format(value);
            //content = fieldValue.toString();
        } else if(fieldValue instanceof Float) {    //需要消除科学计数法
        	Float value = (Float) fieldValue;
        	Double dValue = new Double(value);
        	dValue = ArithUtil.round(dValue, 2);
        	content = df.format(dValue);
//            content = fieldValue.toString();
        } else if(fieldValue instanceof Date) {
            content = format.format(fieldValue);
        } else if(fieldValue instanceof Boolean) {
            content = fieldValue.toString();
        }
        else if(fieldValue instanceof Long)
        {
        	  content = fieldValue.toString();
        } else if(fieldValue instanceof BigDecimal) {
        	((BigDecimal)fieldValue).setScale(2,java.math.BigDecimal.ROUND_HALF_UP);
            content = df.format(fieldValue);
        }
    	
    	return content;
    }
	 

}


 


 

posted @ 2013-04-19 21:42  xinyuyuanm  阅读(987)  评论(0编辑  收藏  举报