Java 导出Excel实例代码整理(POI) 可用

        两年前曾实现做过导出excel表格,由于当年缺少一种代码积累意识,于是乎跟很多人一样代码实现后就给弃之九霄,凑巧如今又使用了这么一个功能,等于又重新开始了一段初学的历程.  声明:以下代码均是小弟参考其他大神资料整理而来。建议阅读时根据先后顺序

附上导出结果:


Java 导出Excel实例代码整理(POI) 可用_第1张图片


一、Java实现Excel导出的方式有哪些

目前常见读写Excel的工具类开源javaAPI有两种方式,
一个是JXL(Java Excel API) 官网地址:http://jexcelapi.sourceforge.net/
一个是Apache的POI(Poor Obfuscation Implementation)官网地址:http://poi.apache.org/

由于我是使用的POI,所以这里较为注重POI导出资料的整理,另鉴于轮组不要胡乱造,况且新造的轮子不一定有旧的好,故此处搬出自己学习的技术博客出处
  • java中导入、导出execl   http://blog.csdn.net/jerehedu/article/details/45195359
注:很简单明了的一个教程,可以让你简单快速的进行代码开发等。
  • java读写execl之POI超入门  http://rensanning.iteye.com/blog/1538591
注:此为详细篇,基本常用的都已包含. 基础execl格式以满足.
  • poi中常用的api  http://blog.csdn.net/u011182715/article/details/51473618
注:一些api的补充.

以上三篇,可以说包含了大部分的poi资料.  一般情况下够用,至少我就是参考以上例子完成酱.

二、代码功能实现

  铺垫了酱么多,说白了还是一样一样的,这里就简单附上一下个人代码的实现,首先肯定了先要加jar包,插件嘛,少了关键点怎么行呢,就比如咱们去大保健,钱都没带那不是迟早要粗事吖~ Java 导出Excel实例代码整理(POI) 可用_第2张图片

1.加入jar包.

自己下载自己加    http://download.csdn.net/detail/dcb_ripple/9790774

2.main代码实现

package jakarta;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFAnchor;
import org.apache.poi.hssf.usermodel.HSSFCell;
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.ss.util.CellRangeAddress;

public class JakartaTest {
	public static void main(String[] args) {
		//web对象
		HSSFWorkbook wb = new HSSFWorkbook();
		//创建表头等
		HSSFSheet sheet = wb.createSheet("test1");
		//创建行
		HSSFRow row = sheet.createRow(0);
		
		//创建列
		HSSFCell cell = row.createCell(0);
		
		HSSFCell cell2 = row.createCell(2);
		cell2.setCellValue("嗯哼");
		cell.setCellValue("我是写入的值");
		sheet.addMergedRegion(new CellRangeAddress(0,0,0,3)); 
		
		try {
			FileOutputStream output = new FileOutputStream("E:\\JAKARTA.xls");
			wb.write(output);
			output.flush(); 
			System.out.println("成功创建excel文件");
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

经测试.   运行即可完成execl创建,其实可以理解为是java 通过POI插件创建了一个EXECL文件而已.

3.通过浏览器实现导出

其实上面教程已经有讲怎么样通过控制器Controller导出

public void exportInfo(){
		try {
			
			String myId = getRequest().getParameter("myId");
		
			MyOrder my = endOrderService.getMyOrderMyId(myId);	//订单信息
			List mylist = endOrderService.getOrderInfos(myId); //订单产品详情
			if(my!=null || mylist!=null){
				//web对象
				HSSFWorkbook wb = new HSSFWorkbook();
				
				//创建表头等
				HSSFSheet sheet = wb.createSheet(my.getOrder_title());
				//省略省略/....  
				
				//以下是关键
				HttpServletResponse response = ServletActionContext.getResponse();
				response.reset(); 
				OutputStream output = getRepsonse().getOutputStream(); 
				response.setHeader("Content-disposition", "attachment; filename=Info.xls");  
			    response.setContentType("application/msexcel");          
			    wb.write(output);
			    output.close();  
				System.out.println("成功创建excel文件");
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
	}


Struts2框架,这里是通过了输出流OutputStream完成对文件的创建,这里要避免可能出现的Exception,即输出流重复创建或者输出流与struts2方法返回冲突。

概要; http://blog.csdn.net/dcb_ripple/article/details/62422440

代码实例.

/**
	 * 导出订单信息.
	* @author 邓成波
	* @date 创建时间 2017年3月16日 下午12:04:31 
	* @return
	 */
	public void exportInfo(){
		try {
			
			String myId = getRequest().getParameter("myId");
		
			MyOrder my = endOrderService.getMyOrderMyId(myId);	//订单信息
			List mylist = endOrderService.getOrderInfos(myId); //订单产品详情
			if(my!=null || mylist!=null){
				//web对象
				HSSFWorkbook wb = new HSSFWorkbook();
				
				//创建表头等
				HSSFSheet sheet = wb.createSheet(my.getOrder_title());
				// 用于格式化单元格的数据
		        HSSFDataFormat format = wb.createDataFormat();
		        // 设置字体 (上方标题用 填写内容)
		        HSSFFont font = wb.createFont();
		        font.setFontHeightInPoints((short) 11); //字体高度
		        font.setColor(HSSFFont.COLOR_NORMAL); //字体颜色
		        font.setFontName("宋体"); //字体
		        
		        //表头主数据,加粗
		        HSSFCellStyle cellStyle = wb.createCellStyle();
		        cellStyle.setFont(font);
		        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平布局:居中
		        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//单元格垂直居中
		        cellStyle.setWrapText(true);//换行
		        
		        // 设置字体 (上方标题用 导航头加粗)
		        HSSFFont fontBold = wb.createFont();
		        fontBold.setFontHeightInPoints((short) 11); //字体高度
		        //setHSSFPalette("#3366FF",7,wb);//自定义设置字体颜色
		        fontBold.setColor(HSSFFont.COLOR_NORMAL); //字体颜色
		        fontBold.setFontName("宋体"); //字体
		        fontBold.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
		        
		        // 设置单元格类型
		        HSSFCellStyle cellStyleBold = wb.createCellStyle();
		        cellStyleBold.setFont(fontBold);
		        cellStyleBold.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平布局:居中
		        cellStyleBold.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//单元格垂直居中
		        cellStyleBold.setWrapText(true);//换行
		        
		        ArrayList list = new ArrayList();
		        //rowNmae名称
		        String[] rowsName1 = new String[]{"合同流水号:","","机构:",""+my.getCompany()+"",   "客户名称:",""+my.getClient_name()+"","出货批次:",""+my.getBatch()+""};  
		        String[] rowsName2 = new String[]{"合同号:","","负责人:",""+my.getPrincipal()+"",   "项目名称:",""+my.getProject_name()+"","收货人:",""+my.getReceipt_name()+""};  
		        list.add(rowsName1);
		        list.add(rowsName2);
		        String[] rowsName3 = new String[]{"erp编号","产品名称","型号","识别号","颜色","数量","合同单价","金额小计"};  
		        list.add(rowsName3);
		        sheet.setDefaultColumnWidth(15);//设置列默认的宽度
		        //sheet.setDefaultRowHeight((short) 1.5); //设置默认列高度
		        for (int i = 0; i < list.size(); i++) {
		        	HSSFRow row = null;
		        	if(i==2){
		        		row = sheet.createRow(3);
		        	}else{
		        		row = sheet.createRow(i);
		        	}
		        	row.setHeightInPoints(17);//设置字体大小
		        	String[] rowsName = list.get(i);
					for(int c = 0;c  dataList = new ArrayList();  
		        Object[] objs = null;  
		        for (int i = 0; i < mylist.size(); i++) {  
		        	MyOrderProductBean mybean = mylist.get(i);  
		            objs = new Object[rowsName3.length];  
		            objs[0] = mybean.getProduct_id(); //erp编号
		            objs[1] = mybean.getSort_Name();  //产品名称
		            objs[2] = mybean.getTypeName();   //产品类型名称  
		            objs[3] = mybean.getIdentify();   //识别号 id  
		            objs[4] = mybean.getColor();  	  //颜色
		            objs[5] = mybean.getCount();  	  //数量
		            objs[6] = mybean.getClinch_money();  	  //合同单价	
		            objs[7] = mybean.getClinch_money_sum();  	  //金额小计	
		            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
		            //String date = df.format(man.getModiDate());  
		            dataList.add(objs);  
		        }
		        
		        for(int i = 0; i < dataList.size(); i++) {
		        	HSSFRow row =sheet.createRow(i+4);
		        	Object[] objsRow = dataList.get(i);
		        	int length = 0;
		        	for (int j = 0; j < objsRow.length; j++) {
						HSSFCell cell = row.createCell(j);
						if(objsRow[j]!=null && !objsRow[j].toString().isEmpty()){
							if(objsRow[j].toString().length()>length){
								//获取本列最高的字符长度
								length =  objsRow[j].toString().length();
							}
							cell.setCellValue(objsRow[j].toString());
						}
						cell.setCellStyle(getStyle(wb));
					}
		        	//某列字数太多换行  暂时不要
		        	/*if(length>9){
		        		row.setHeight((short)((length%9)*265)); //这里的265代表一个字的高度
		        	}*/
				}
		        //价格合计及说明.
		        HSSFRow row =sheet.createRow(dataList.size()+4);
		        HSSFCell cell = row.createCell(0);
		        cell.setCellStyle(getStyle(wb));
		        HSSFCell cell2 = row.createCell(1);
		        cell2.setCellValue("合计:");
		        cell2.setCellStyle(getStyle(wb));
		        row.createCell(2).setCellStyle(getStyle(wb));
		        row.createCell(3).setCellStyle(getStyle(wb));
		        row.createCell(4).setCellStyle(getStyle(wb));
		        row.createCell(5).setCellStyle(getStyle(wb));
		        row.createCell(6).setCellStyle(getStyle(wb));
		        HSSFCell cell3 = row.createCell(7);
		        cell3.setCellValue(my.getTotal_money());
		        cell3.setCellStyle(getStyleTitle(wb));
		        sheet.addMergedRegion(new CellRangeAddress(dataList.size()+4,dataList.size()+4,1,6));
		        // 表格说明列
		        HSSFRow rowContext =sheet.createRow(dataList.size()+5);
		        HSSFCell cellContext = rowContext.createCell(0);
		        cellContext.setCellValue("说明:");
		        cellContext.setCellStyle(getStyle(wb));
		        HSSFCell cellContext2 = rowContext.createCell(1);
		        cellContext2.setCellValue(my.getOrder_desc());
		        cellContext2.setCellStyle(getStyle(wb));
		        rowContext.createCell(2).setCellStyle(getStyle(wb));
		        rowContext.createCell(3).setCellStyle(getStyle(wb));
		        rowContext.createCell(4).setCellStyle(getStyle(wb));
		        rowContext.createCell(5).setCellStyle(getStyle(wb));
		        rowContext.createCell(6).setCellStyle(getStyle(wb));
		        rowContext.createCell(7).setCellStyle(getStyle(wb));
		        sheet.addMergedRegion(new CellRangeAddress(dataList.size()+5,dataList.size()+5,1,7));
		        
		       	sheet.autoSizeColumn((short)0); //调整第一列宽度
		        sheet.autoSizeColumn((short)1); //调整第二列宽度
		        sheet.autoSizeColumn((short)2); 
		        sheet.autoSizeColumn((short)3);
		        sheet.autoSizeColumn((short)4); 
		        sheet.autoSizeColumn((short)5);
		        sheet.autoSizeColumn((short)6); 
		        sheet.autoSizeColumn((short)7);
				//sheet.addMergedRegion(new CellRangeAddress(0,0,0,3));  //合并列
				HttpServletResponse response = ServletActionContext.getResponse();
				response.reset(); 
				OutputStream output = getRepsonse().getOutputStream(); 
				response.setHeader("Content-disposition", "attachment; filename=Info.xls");  
			    response.setContentType("application/msexcel");          
			    wb.write(output);
			    output.close();  
				System.out.println("成功创建excel文件");
			}
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**  
	 * 列表数据格式
	* @author 邓成波
	* @date 创建时间 2017年3月21日 下午4:32:13 
	* @param workbook
	* @return
	*/
    public HSSFCellStyle getStyle(HSSFWorkbook workbook) {  
          // 设置字体  
          HSSFFont font = workbook.createFont();  
          //设置字体名字  
          font.setFontName("宋体"); //字体
          //设置字体大小  
          font.setFontHeightInPoints((short)11);  
          //字体加粗  
          //font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
          //设置样式;   
          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(true);  
          //设置水平对齐的样式为居中对齐;    
          style.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
          //设置垂直对齐的样式为居中对齐;   
          style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  
          return style;  
	}  
	
    /**
	* 列表表头用   数据格式表头
	* @author 邓成波
	* @date 创建时间 2017年3月21日下午4:32:13
	* @param workbook
	* @return
	*/
    public HSSFCellStyle getStyleTitle(HSSFWorkbook workbook) {
    	
          //设置字体  
          HSSFFont font = workbook.createFont();  
          //设置字体名字  
          font.setFontName("宋体"); //字体
          //设置字体大小  
          font.setFontHeightInPoints((short)10);  
          //字体加粗  
          font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
          //设置样式;   
          HSSFCellStyle style = workbook.createCellStyle();  
          
          style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 
          style.setFillForegroundColor(IndexedColors.RED.getIndex());  
          style.setFillBackgroundColor(IndexedColors.RED.getIndex());  
          
          //设置底边框;   
          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;  
	}  
    
	/**
	 * 设定自定义字体颜色信息
	* @author 邓成波
	* @date 创建时间 2017年3月21日 下午12:01:09 
	* @param str 颜色
	* @param index 编号
	* @param wb execl对象
	 */
	public void setHSSFPalette(String str,int index,HSSFWorkbook wb){
	  //处理把它转换成十六进制并放入一个数 
	  int[] color=new int[3]; 
	  color[0]=Integer.parseInt(str.substring(1, 3), 16); 
	  color[1]=Integer.parseInt(str.substring(3, 5), 16);
	  color[2]=Integer.parseInt(str.substring(5, 7), 16); 
	  //自定义颜色 
	  HSSFPalette palette = wb.getCustomPalette(); 
	  //设置自定义颜色的下标,接下来会用到
	  palette.setColorAtIndex(((short) index),(byte)color[0], (byte)color[1], (byte)color[2]);
	} 
	


附加:导出表名中文乱码问题,从别处找到可用. 

 	response.setHeader("Content-disposition", "attachment; filename=中文名称.xls");
        //response.setContentType("application/msexcel");
        response.setContentType("application/x-download");//下面三行是关键代码,处理乱码问题  
        response.setCharacterEncoding("utf-8");  
        response.setHeader("Content-Disposition", "attachment;filename="+new String(my.getOrder_title().getBytes("gbk"), "iso8859-1")+".xls");  

代码有点乱,由于格式问题,比较臃肿,仅能做参考那种。至于为什么要这么用上面的三个已经介绍的比较详细》

一. POI设置自定义的字体颜色等,经测试可行,代码中未使用 注释掉了。

  1. poi怎么使用自定义字体颜色  http://www.iteye.com/problems/42620
  2. poi设置颜色和自定义颜色  http://blog.sina.com.cn/s/blog_b0d90e8c0102v3op.html
  3. 颜色索引对照表  http://blog.csdn.net/for_china2012/article/details/29844661

二.调整行宽及自适应及数据转

  1. execl自动调整列宽  http://www.cnblogs.com/azhqiang/p/4111197.html
  2. 行高设置   http://blog.csdn.net/chinapi_hzh/article/details/5776119
  3. 公共导出execl的方法  http://blog.csdn.net/wangchangpen62/article/details/44410967

完。


 嗯哼》》  不会告诉你这么点东西,整理下来弄一弄居然花了一个多小时.  宝宝心里苦

Java 导出Excel实例代码整理(POI) 可用_第3张图片














你可能感兴趣的:(Java 导出Excel实例代码整理(POI) 可用)