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;
}
}

浙公网安备 33010602011771号