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

来源:互联网 发布:淘宝被冻结了怎么注销 编辑:程序博客网 时间:2024/05/17 03:37

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;     //查询条件2private 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;    //NEWprivate HashMap TimImage;    //TIMprivate HashMap EqtImage;    //EQTprivate HashMap CnlImage;    //CNLprivate HashMap RteImage;    //RTEprivate 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;    } }



原创粉丝点击