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);
}
}
}
}
分享到:
相关推荐
jxl导出excel工具类,封装好了的,实现传递任意集合自动导出excel
Excel导入导出 jxl及Poi 工具类:jxl 实现 及 Poi实现 非常实用
jxl导出excel加水印 WritableWorkbook、WritableSheet、WritableCellFormat
jxl导出excel 完整例子工程jxl导出excel 完整例子工程jxl导出excel 完整例子工程 jxl导出excel 完整例子工程jxl导出excel 完整例子工程jxl导出excel 完整例子工程
jxl导入导出excel 详细的描述了如何使用jxl导入导出excel。
使用jxl导出Excel表的好例子 导出excel表的例子
jxl.jar,excel数据工具类导出jar。用于对数据的导出。工具类地址 :https://mp.csdn.net/postedit/83502664
本例为利用JXL导出Excel的代码示例
jxl导出Excel基础,非常有用的一个东西,漫漫看
jxl工具类导出excel,导出详细说明,及相关代码和jar,如有不明白私聊
一个实用的java导入导出Excel工具类,基于开源的Java Excel API(JXL)纯java类库实现,Windows和Linux系统下均可使用。 主要实现功能如下: 导出:将List转化为Excel(listToExcel)。 导入:将Excel转化为List...
jxl从数据库中直接导出excel文档java源码
Android使用jxl快速导出excel表
使用jxl方式实现Excel表格导出,非常简单而且实用
利用jxl实现数据库内容导出到Excel表格中,压缩文件里包括jxl.jar包、例子源代码、txt文档代码
利用JXL技术支持模板和非模板的表格导出
绝对不会让你失望。自己找了好多帮助才实现的哦,希望对你有帮助。互相学习
jxlapi和jar包 博文链接:https://dhl004.iteye.com/blog/1324644
学习使用JXL读写EXCEL文件, 学习使用JXL读写EXCEL文件。
jxl根据实体类注解导出excel工具类,自己封装的util。