公共POI导出Excel方法详解
程序员文章站
2023-12-04 14:54:46
最早开始的时候做过一些数据excel导出的功能,但是到后期每一次导出都需要写一些差不多类似的代码,稍微研究了一下写了个公共的导出方法。
这里用的是poi,然后写成了一个公...
最早开始的时候做过一些数据excel导出的功能,但是到后期每一次导出都需要写一些差不多类似的代码,稍微研究了一下写了个公共的导出方法。
这里用的是poi,然后写成了一个公共类,传入设置好格式的数据,就能弹出下载框。
(补充下getresponse的方法,之前没注意这个有继承!)
package com.hwt.glmf.common; import java.io.ioexception; import java.io.outputstream; import java.util.arraylist; import java.util.list; import javax.servlet.http.httpservletresponse; import org.apache.poi.hssf.usermodel.hssfcell; import org.apache.poi.hssf.usermodel.hssfcellstyle; import org.apache.poi.hssf.usermodel.hssffont; import org.apache.poi.hssf.usermodel.hssfrichtextstring; import org.apache.poi.hssf.usermodel.hssfrow; import org.apache.poi.hssf.usermodel.hssfsheet; import org.apache.poi.hssf.usermodel.hssfworkbook; import org.apache.poi.hssf.util.cellrangeaddress; import org.apache.poi.hssf.util.hssfcolor; /** * 导出excel公共方法 * @version 1.0 * * @author wangcp * */ public class exportexcel extends actionsupport implements servletrequestaware{ //显示的导出表的标题 private string title; //导出表的列名 private string[] rowname ; private list<object[]> datalist = new arraylist<object[]>(); httpservletresponse response; //构造方法,传入要导出的数据 public exportexcel(string title,string[] rowname,list<object[]> datalist){ this.datalist = datalist; this.rowname = rowname; this.title = title; } /* * 导出数据 * */ public void export() throws exception{ try{ hssfworkbook workbook = new hssfworkbook(); // 创建工作簿对象 hssfsheet sheet = workbook.createsheet(title); // 创建工作表 // 产生表格标题行 hssfrow rowm = sheet.createrow(0); hssfcell celltiltle = rowm.createcell(0); //sheet样式定义【getcolumntopstyle()/getstyle()均为自定义方法 - 在下面 - 可扩展】 hssfcellstyle columntopstyle = this.getcolumntopstyle(workbook);//获取列头样式对象 hssfcellstyle style = this.getstyle(workbook); //单元格样式对象 sheet.addmergedregion(new cellrangeaddress(0, 1, 0, (rowname.length-1))); celltiltle.setcellstyle(columntopstyle); celltiltle.setcellvalue(title); // 定义所需列数 int columnnum = rowname.length; hssfrow rowrowname = sheet.createrow(2); // 在索引2的位置创建行(最顶端的行开始的第二行) // 将列头设置到sheet的单元格中 for(int n=0;n<columnnum;n++){ hssfcell cellrowname = rowrowname.createcell(n); //创建列头对应个数的单元格 cellrowname.setcelltype(hssfcell.cell_type_string); //设置列头单元格的数据类型 hssfrichtextstring text = new hssfrichtextstring(rowname[n]); cellrowname.setcellvalue(text); //设置列头单元格的值 cellrowname.setcellstyle(columntopstyle); //设置列头单元格样式 } //将查询出的数据设置到sheet对应的单元格中 for(int i=0;i<datalist.size();i++){ object[] obj = datalist.get(i);//遍历每个对象 hssfrow row = sheet.createrow(i+3);//创建所需的行数 for(int j=0; j<obj.length; j++){ hssfcell cell = null; //设置单元格的数据类型 if(j == 0){ cell = row.createcell(j,hssfcell.cell_type_numeric); cell.setcellvalue(i+1); }else{ cell = row.createcell(j,hssfcell.cell_type_string); if(!"".equals(obj[j]) && obj[j] != null){ cell.setcellvalue(obj[j].tostring()); //设置单元格的值 } } cell.setcellstyle(style); //设置单元格样式 } } //让列宽随着导出的列长自动适应 for (int colnum = 0; colnum < columnnum; colnum++) { int columnwidth = sheet.getcolumnwidth(colnum) / 256; for (int rownum = 0; rownum < sheet.getlastrownum(); rownum++) { hssfrow currentrow; //当前行未被使用过 if (sheet.getrow(rownum) == null) { currentrow = sheet.createrow(rownum); } else { currentrow = sheet.getrow(rownum); } if (currentrow.getcell(colnum) != null) { hssfcell currentcell = currentrow.getcell(colnum); if (currentcell.getcelltype() == hssfcell.cell_type_string) { int length = currentcell.getstringcellvalue().getbytes().length; if (columnwidth < length) { columnwidth = length; } } } } if(colnum == 0){ sheet.setcolumnwidth(colnum, (columnwidth-2) * 256); }else{ sheet.setcolumnwidth(colnum, (columnwidth+4) * 256); } } if(workbook !=null){ try { string filename = "excel-" + string.valueof(system.currenttimemillis()).substring(4, 13) + ".xls"; string headstr = "attachment; filename=\"" + filename + "\""; response = getresponse(); response.setcontenttype("application/octet-stream"); response.setheader("content-disposition", headstr); outputstream out = response.getoutputstream(); workbook.write(out); } catch (ioexception e) { e.printstacktrace(); } } }catch(exception e){ e.printstacktrace(); } } /** * 获取response **/ private httpservletresponse getresponse(){ httpservletresponse response = servletactioncontext.getresponse(); return response; } /* * 列头单元格样式 */ public hssfcellstyle getcolumntopstyle(hssfworkbook workbook) { // 设置字体 hssffont font = workbook.createfont(); //设置字体大小 font.setfontheightinpoints((short)11); //字体加粗 font.setboldweight(hssffont.boldweight_bold); //设置字体名字 font.setfontname("courier new"); //设置样式; hssfcellstyle style = workbook.createcellstyle(); //设置底边框; style.setborderbottom(hssfcellstyle.border_thin); //设置底边框颜色; style.setbottombordercolor(hssfcolor.black.index); //设置左边框; style.setborderleft(hssfcellstyle.border_thin); //设置左边框颜色; style.setleftbordercolor(hssfcolor.black.index); //设置右边框; style.setborderright(hssfcellstyle.border_thin); //设置右边框颜色; style.setrightbordercolor(hssfcolor.black.index); //设置顶边框; style.setbordertop(hssfcellstyle.border_thin); //设置顶边框颜色; style.settopbordercolor(hssfcolor.black.index); //在样式用应用设置的字体; style.setfont(font); //设置自动换行; style.setwraptext(false); //设置水平对齐的样式为居中对齐; style.setalignment(hssfcellstyle.align_center); //设置垂直对齐的样式为居中对齐; style.setverticalalignment(hssfcellstyle.vertical_center); return style; } /* * 列数据信息单元格样式 */ public hssfcellstyle getstyle(hssfworkbook workbook) { // 设置字体 hssffont font = workbook.createfont(); //设置字体大小 //font.setfontheightinpoints((short)10); //字体加粗 //font.setboldweight(hssffont.boldweight_bold); //设置字体名字 font.setfontname("courier new"); //设置样式; hssfcellstyle style = workbook.createcellstyle(); //设置底边框; style.setborderbottom(hssfcellstyle.border_thin); //设置底边框颜色; style.setbottombordercolor(hssfcolor.black.index); //设置左边框; style.setborderleft(hssfcellstyle.border_thin); //设置左边框颜色; style.setleftbordercolor(hssfcolor.black.index); //设置右边框; style.setborderright(hssfcellstyle.border_thin); //设置右边框颜色; style.setrightbordercolor(hssfcolor.black.index); //设置顶边框; style.setbordertop(hssfcellstyle.border_thin); //设置顶边框颜色; style.settopbordercolor(hssfcolor.black.index); //在样式用应用设置的字体; style.setfont(font); //设置自动换行; style.setwraptext(false); //设置水平对齐的样式为居中对齐; style.setalignment(hssfcellstyle.align_center); //设置垂直对齐的样式为居中对齐; style.setverticalalignment(hssfcellstyle.vertical_center); return style; } }
这个导出用到的方法,组装数据的如下:
string title = message.getstring("manifestiexporttitle"); string[] rowsname = new string[]{"序号","货物运输批次号","提运单号","状态","录入人","录入时间"}; list<object[]> datalist = new arraylist<object[]>(); object[] objs = null; for (int i = 0; i < manifestimainlist.size(); i++) { manifestimain man = manifestimainlist.get(i); objs = new object[rowsname.length]; objs[0] = i; objs[1] = man.gettranno(); objs[2] = man.getbillno(); objs[3] = man.getstatusflagcnname(); objs[4] = man.getloginname(); simpledateformat df = new simpledateformat("yyyy-mm-dd hh:mm:ss"); string date = df.format(man.getmodidate()); objs[5] = date; datalist.add(objs); } exportexcel ex = new exportexcel(title, rowsname, datalist); ex.export();
是通过组装一个list<object>的类型(里面是一些列的导出数据,可以为string/int/long等全部数据类型)。数组rowsname是指导出数据的栏位名称,title是指导出excel的标题和sheet名。
以以上的数据为例,导出的结果显示如下(只是做了简单的处理,有一些合并行与excel的样式问题没有涉及):
以上所述是小编给大家介绍的公共poi导出excel方法详解整合,希望对大家有所帮助