欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

公共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方法详解

以上所述是小编给大家介绍的公共poi导出excel方法详解整合,希望对大家有所帮助