package com.nfwork.dbfound.excel;
import java.io.*;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import com.nfwork.dbfound.core.Context;
import com.nfwork.dbfound.model.ModelEngine;
import com.nfwork.dbfound.util.UUIDUtil;
import com.nfwork.dbfound.web.file.FileUtil;
import jxl.*;
import jxl.format.Alignment;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.write.Blank;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.WritableFont;
public class ExcelWriter {
@SuppressWarnings("unchecked")
public static File writeExcel(File file, List<Map> datas,
ExcelCellMeta[] columns) throws Exception {
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(file);
jxl.write.WritableSheet ws = wwb.createSheet("sheet1", 0);
jxl.write.WritableFont wfc = new jxl.write.WritableFont(
WritableFont.ARIAL, 11, WritableFont.BOLD, false,
UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.GREEN);
jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(
wfc);
wcfFC.setBackground(Colour.GRAY_25);
wcfFC.setAlignment(Alignment.CENTRE);
try {
for (int i = 0; i < columns.length; i++) {
jxl.write.Label label = new jxl.write.Label(i, 0, columns[i]
.getContent(), wcfFC);
ws.addCell(label);
ws.setColumnView(i, columns[i].getWidth());
}
int index = 1;
for (Map data : datas) {
for (int i = 0; i < columns.length; i++) {
Object o = data.get(columns[i].getName());
if (o == null) {
Blank blank = new Blank(i, index);
ws.addCell(blank);
} else if (o instanceof String) {
String content = o.toString();
Label label = new Label(i, index, content);
ws.addCell(label);
} else if (o instanceof Integer) {
Number number = new Number(i, index, (Integer) o);
ws.addCell(number);
} else if (o instanceof Double) {
Number number = new Number(i, index, (Double) o);
ws.addCell(number);
} else if (o instanceof Long) {
Number number = new Number(i, index, (Long) o);
ws.addCell(number);
} else if (o instanceof Float) {
Number number = new Number(i, index, (Float) o);
ws.addCell(number);
}
}
index++;
}
wwb.write();
} finally {
wwb.close();
}
return file;
}
@SuppressWarnings("unchecked")
public static void excelExport(Context context, String modelName,
String queryName) throws Exception {
context.isExport = true;
// 将parameters中的参数转移到param中
Map param = (Map) context.getData("param");
Map parameters = (Map) param.get("parameters");
param.putAll(parameters);
param.remove("parameters");
List<Map> result = ModelEngine.query(context, modelName, queryName, null,
false).getDatas();
excelExport(context, result);
}
@SuppressWarnings("unchecked")
public static void excelExport(Context context, List<Map> result)
throws Exception {
// 列处理
List<Map> cls = (List<Map>) context.getData("param.columns");
ExcelCellMeta[] columns = new ExcelCellMeta[cls.size()];
int index = 0;
for (Map map : cls) {
ExcelCellMeta cellMeta = new ExcelCellMeta(map.get("name")
.toString(), map.get("content").toString(), Integer
.parseInt(map.get("width").toString()));
columns[index++] = cellMeta;
}
File file = new File(FileUtil.getUploadFolder(null), UUIDUtil.getUUID()
+ ".xls");
ServletOutputStream sout = null;
InputStream in = null;
try {
file.createNewFile();
writeExcel(file, result, columns);
// 向外输出excel
context.response.setContentType("application/x-download;");
context.response.setHeader("Content-Disposition",
"attachment;filename=export.xls");
sout = context.response.getOutputStream(); // 图片输出的输出流
in = new FileInputStream(file);
if (in != null) {
byte b[] = new byte[2048];
int i = in.read(b);
while (i != -1) {
sout.write(b, 0, i);
i = in.read(b);
}
}
} finally {
if (in != null) {
in.close();
}
if (sout != null) {
sout.flush(); // 输入完毕,清除缓冲
sout.close();
}
if (file != null) {
file.delete();
}
}
}
}