`
wang吖
  • 浏览: 235769 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

闲来无事写了一个利用JXL导出Excel的工具类(比较简单期待高手提供更加灵活的工具类)

 
阅读更多
public class ExcelUtils {

/** 日志类 */
private static Logger log = Logger.getLogger(ExcelUtils.class);

/**
*
* @brief 方法功能简要说明:
* <li>根据查询的list返回Excel表格的方法</li>
* <li></li>
*
* @author - 2012-4-5 wa 创建初始版本
*
* @param response
*            HttpServletResponse 响应对象
* @param filename
*            导出的 Excel 文件名称
* @param sheetName
*            Excel sheet 表单名称
* @param tableHeadName
*            Excel sheet 表头名称
* @param titlesList
*            导出的 Excel 表格的表头名称
* @param objFieldList
*            要显示 list 里面所装的对象的字段列表集合
* @param contentList
*            要写入表格的数据集合
*/
public static void exportExcel(HttpServletResponse response,
String filename, String sheetName, String tableHeadName,
List<Object> titlesList, List<String> objFieldList,
List<Object> contentList) {
ServletOutputStream out = null;
WritableWorkbook book = null;
if (titlesList == null || titlesList.size() == 0) {
log.info("导出的 Excel 表格的表头名称 titlesList 为空");
return;
}
if (objFieldList == null || objFieldList.size() == 0) {
log.info("导出的 Excel 要显示list里面所装的对象的字段列表集合 objFieldList 为空");
return;
}
if(titlesList.size() != objFieldList.size()){
log.info("导出的 Excel 要显示表头个数和列字段个数不相等");
return;
}
if (contentList == null || contentList.size() == 0) {
log.info("导出的 Excel  要写入表格的数据集合 contentList 为空");
return;
}
try {
response.setContentType("application/vnd.ms-excel");
response.reset();
response.setHeader("Content-disposition", "attachment; filename=\""
+ new String(filename.getBytes(), "ISO8859-1") + "\"" + ".xls");
//获取输出流
out = response.getOutputStream();
// 获取工作表
book = Workbook.createWorkbook(out);

//计算将会生成几个Sheet表单
int listSize = contentList.size();//获取的数据总数
int totalCount = 1;//默认的Sheet的个数表单
int pageSize = 65000;//设置个sheet表单的条数
if (listSize % pageSize == 0) {
totalCount = listSize/pageSize;
}else{
totalCount = listSize/pageSize + 1;
}

//通过反射获取数据集合里面的数据对象
Object obj = null;
Class objClazz = null;
if (contentList != null && contentList.size() != 0) {
obj = contentList.get(0);// 获取list里面放置的对象
}
if (obj != null) {
objClazz = obj.getClass();
}
Field[] filds = null;
if (objClazz != null) {
filds = objClazz.getDeclaredFields();// 获取对象的所有字段
}
int totalCol = titlesList.size();// 获取总列数

for (int n = 0; n < totalCount; n++) {//循环执行次数  即需要建立多少个sheet表单
int index = 2;// 行数
int col = 0;// 列数
WritableSheet sheet = null;
if (n != 0) {//表单名称每一页加一个页码数
sheet = book.createSheet(sheetName + n, n);
}else{
sheet = book.createSheet(sheetName, n);
}
// 添加表头
Label labelHead = new Label(0, 0, tableHeadName);
sheet.addCell(labelHead);
sheet.mergeCells(0, 0, titlesList.size() - 1, 0);// 合并表头信息
WritableCellFormat wc = new WritableCellFormat();

// 设置居中
wc.setAlignment(Alignment.CENTRE);
WritableFont wfont = new WritableFont(WritableFont.createFont("隶书"), 20);
wc.setFont(wfont);
labelHead.setCellFormat(wc);

// 生成Excel表头数据
for (int i = 0, size = titlesList.size(); i < size; i++) {
Label label = new Label(i, 1, titlesList.get(i).toString());
sheet.addCell(label);
//设置每一列的字体样式
WritableFont font3=new WritableFont(WritableFont.ARIAL,9);
WritableCellFormat format3=new WritableCellFormat(font3);
format3.setAlignment(jxl.format.Alignment.CENTRE);
//将每一列的宽度设置为30
sheet.setColumnView(i, 30, format3);
}

// 生成表格数据
for (int k=n*pageSize; k < n*pageSize+pageSize && k<listSize; k++) {
Object objArg = contentList.get(k);// 获取list里面放置的对象
Object content = null;// objArg 字段值
Object objType = null;// 对应字段的类型
boolean fg = false;
for (Field fd : filds) {// 循环取出每个字段
String fildName = fd.getName();
for (String objAttribute : objFieldList) {
if (fildName != null && objAttribute != null && objAttribute.equals(fildName)) {
boolean flag = fd.isAccessible();
fd.setAccessible(true);
content = fd.get(objArg);// 获取字段的相关属性值
fd.setAccessible(flag);
fg = true;
//获取当前字段的类型
objType = fd.getType();
break;
}
}
if (fg) {// 当为TRUE的时候才可以把值写入Excel表格
if (col == totalCol) {// 当前的列数等于表格的总列数时 即一条数据就结束
index++;// 行数转为下一行
col = 0;// 列数又从0开始
}
fg = false;
String tempContent = "";

//进行特殊数据类型的转化
if (objType != null && objType.toString().equals("class java.util.Date")) {
if (content != null) {
//时间格式
String columnName = titlesList.get(col).toString();
if (columnName != null && columnName.indexOf("日期") != -1) {
tempContent = StrDateUtils.getDateToSring((Date)content, 1);
}else{
tempContent = StrDateUtils.getTimeToSring((Date)content);
}
}
}else if (objType != null && objType.toString().equals("class java.math.BigDecimal")) {
if (content != null) {
//金额格式   BigDecimal 仅仅用于金额
DecimalFormat df = new DecimalFormat("###,##0.00");
tempContent = df.format(content);
}
}else{
if (content != null) {
tempContent = content.toString();
}
}
Label label = new Label(col++, index, tempContent);
sheet.addCell(label);
}
}
}
}
book.write();// 写出Excel表格
out.flush();
}  catch (Exception e) {
log.error(" 导出表格  ExcelUtils 的方法 exportExcel 出现异常……………………………", e);
}finally{
try {
if (book != null) {
book.close();
}
if (out != null) {
out.close();
}
} catch (Exception e) {
log.error(" 导出表格  ExcelUtils 的方法 exportExcel 关闭流出现异常……………………………", e);
}
}
}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics