java 使用poi动态导出的操作

实现用户想要那个字段的数据,就导出那个字段的数据,我使用#分割字段实现

在传入字段的值时做文章

创建一个excel导出工具类,

package com.zy.util;
import java.io.OutputStream;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Iterator;
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.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Font;
/**
 * *
 *
 * @Title: ExportExcelUtil.java
 * @Package com.jarmsystem.web.util 类描述: 基于POI的javaee导出Excel工具类
 * @author 范保林
 * @date 2018年11月16日 上午10:38:00
 * @version V1.0
 */
public class ExPortExcelUtil {
	/**
	 *
	 * @param response
	 *   请求
	 * @param fileName
	 *   文件名 如:"用户表"
	 * @param excelHeader
	 *   excel表头数组,存放"管理员#admin"格式字符串,"管理员"为excel标题行, "admin"为对象字段名
	 * @param dataLis
	 *   数据集合,需与表头数组中的字段名一致,并且符合javabean规范(驼峰命名法)
	 * @return 返回一个HSSFWorkbook
	 * @throws Exception
	 */
	public static <T> HSSFWorkbook export(HttpServletResponse response, String fileName, String[] excelHeader,
			Collection<T> dataLis) throws Exception {
		response.setContentType("application/x-download");
		response.setCharacterEncoding("utf-8");// 处理编码问题
		response.setHeader("Content-Disposition",
				"attachment;filename=" + new String(fileName.getBytes("gbk"), "iso8859-1") + ".xls");// 表头编码问题
		// 创建一个工作薄
		HSSFWorkbook wb = new HSSFWorkbook();
		// 设置标题样式
		HSSFCellStyle titleStyle = wb.createCellStyle();
		// 设置单元格边框样式
		titleStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框 细边线
		titleStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 下边框 细边线
		titleStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框 细边线
		titleStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框 细边线
		// 设置单元格对齐方式
		titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平居中
		titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中
		// 设置字体样式
		Font titleFont = wb.createFont();
		titleFont.setFontHeightInPoints((short) 15);// 字体高度
		titleFont.setFontName("黑体");// 字体样式
		titleStyle.setFont(titleFont);
		// 在 workBook 工作簿中添加一个sheet(工作表) 对应excel文件中的sheet
		HSSFSheet sheet = wb.createSheet();
		// 标题数组
		String[] titleArray = new String[excelHeader.length];
		// 字段名数组
		String[] fieldArray = new String[excelHeader.length];
		for (int i = 0; i < excelHeader.length; i++) {
			String[] tempArray = excelHeader[i].split("#");
			titleArray[i] = tempArray[0];
			fieldArray[i] = tempArray[1];
		}
		// 在sheet中添加标题行
		HSSFRow row = sheet.createRow(0);// 行数从0开始
		// 自动设置宽度
		sheet.autoSizeColumn(0);
		// 设置表格默认列宽度
		sheet.setDefaultColumnWidth(20);
		// 为标题行赋值
		for (int i = 0; i < titleArray.length; i++) {
			// 需要序号就需要+1 因为0号位被序号占用
			HSSFCell titleCell = row.createCell(i);
			titleCell.setCellValue(titleArray[i]);
			titleCell.setCellStyle(titleStyle);
			sheet.autoSizeColumn(i + 1); // 0 号被序号占用
		}
		// 字段的数据样式 标题和字段的数据样式不同,需分开设置
		HSSFCellStyle dataStyle = wb.createCellStyle();
		// 设置数据边框
		dataStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		dataStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
		dataStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		dataStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
		// 设置居中样式
		dataStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平居中
		dataStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直居中
		// 设置数据字体
		Font dataFont = wb.createFont();
		dataFont.setFontHeightInPoints((short) 12);// 字体高度
		dataFont.setFontName("宋体");// 字体
		dataStyle.setFont(dataFont);
		// 遍历数据行,产生数据行
		Iterator<T> it = dataLis.iterator();
		int index = 0;
		while (it.hasNext()) {
			index++; // 老话 0号位被占用
			row = sheet.createRow(index);
			T t = it.next();
			// 利用反射 根据传过来的字段名数组,动态调用对应的getxxx()方法得到属性值
			for (int i = 0; i < fieldArray.length; i++) {
				// 需要序号 就需要 i+1
				HSSFCell dataCell = row.createCell(i);
				dataCell.setCellStyle(dataStyle);
				sheet.autoSizeColumn(i);
				String fieldName = fieldArray[i];
				// 取得对应的getxxx()方法 实体类命名一定要用驼峰才能分割成功
				String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
				Class<? extends Object> tCls = t.getClass();// 泛型为Object以及所有Object的子类
				Method getMethod = tCls.getMethod(getMethodName, new Class[] {});// 通过方法名得到对应的方法
				Object value = getMethod.invoke(t, new Object[] {});// 动态调用方法,得到属性值
				if (value != null) {
					dataCell.setCellValue(value.toString());// 为当前列赋值
				}
			}
		}
		OutputStream outputStream = response.getOutputStream();// 打开流
		wb.write(outputStream);// HSSFWorkbook写入流
		wb.close();// HSSFWorkbook关闭
		outputStream.flush();// 刷新流
		outputStream.close();// 关闭流 

		// excel 各种样式
		// XSSFCellStyle.ALIGN_CENTER 居中对齐
		// XSSFCellStyle.ALIGN_LEFT 左对齐
		// XSSFCellStyle.ALIGN_RIGHT 右对齐
		// XSSFCellStyle.VERTICAL_TOP 上对齐
		// XSSFCellStyle.VERTICAL_CENTER 中对齐
		// XSSFCellStyle.VERTICAL_BOTTOM 下对齐
		// CellStyle.BORDER_DOUBLE 双边线
		// CellStyle.BORDER_THIN 细边线
		// CellStyle.BORDER_MEDIUM 中等边线
		// CellStyle.BORDER_DASHED 虚线边线
		// CellStyle.BORDER_HAIR 小圆点虚线边线
		// CellStyle.BORDER_THICK 粗边线
		return wb;
	}
}

controller 层调用

/**
	 * 动态导出 excel (想导什么字段就传固定格式的字段)
	 *
	 * @param request
	 * @param response
	 * @param expor
	 * @throws Exception
	 */
	@RequestMapping("/excelOut")
	public void ExcelOut(HttpServletRequest request, HttpServletResponse response, String export) {
		export = "管理员#admin,id#id"; // ,手机号码#adminPhone 只导出两个字段
		String[] excelHeader = export.split(",");
		List<Tb_User> projectList = new ArrayList<Tb_User>();
		Tb_User tb_User = new Tb_User();
  // 模拟从数据库查询数据 查询所有
		tb_User.setAdmin("范保林");
		tb_User.setId("1111");
		tb_User.setAdminPhone("111");
		projectList.add(tb_User);
		try {
			ExPortExcelUtil.export(response, "用户表", excelHeader, projectList);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("导出失败!");
		}
	}

三个字段的实体类导出所需要的两个字段数据

补充知识:java使用poi导出excel的内容,同时可以利用反射进行动态获取信息

一,Java-poi导出

我们很多人都是希望我们可以写一个我们的Java导出的工具类,不需要用插件来实现,那下面就是我写的一个Java导出工具类,话不多说开始。

首先我们针对的是maven项目,导入相应的依赖

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>3.14</version>
</dependency>
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>3.14</version>
</dependency>

导入了相应的依赖后,我们就可以进行相应的代码编写了,下面是我编写的代码,这里我们传入的是泛型类。

public void getexport(Collection< T> dataset ,String[] headers , HttpServletResponse response , HttpServletRequest request ,String fileName){
  //创建一个excel文件,excel文档对象
  HSSFWorkbook workbook= new HSSFWorkbook() ;
  //创建一个excel表单
  HSSFSheet sheet= workbook.createSheet(fileName) ;
  //设置单元格样式1
  HSSFCellStyle cellStyle1=workbook.createCellStyle() ;
  //设置单元格居中
  cellStyle1.setAlignment(HSSFCellStyle. ALIGN_CENTER) ;
  //设置填充色
  cellStyle1.setFillPattern(HSSFCellStyle. SOLID_FOREGROUND) ;
  cellStyle1.setFillForegroundColor(HSSFColor.YELLOW. index) ;
  //设置边框
  cellStyle1.setBorderLeft(HSSFCellStyle. BORDER_THIN) ;
  cellStyle1.setBorderRight(HSSFCellStyle. BORDER_THIN) ;
  cellStyle1.setBorderTop(HSSFCellStyle. BORDER_THIN) ;
  cellStyle1.setBorderBottom(HSSFCellStyle. BORDER_THIN) ;
  //设置单元格样式2
  HSSFCellStyle cellStyle2=workbook.createCellStyle() ;
  //设置单元格居中
  cellStyle2.setAlignment(HSSFCellStyle. ALIGN_CENTER) ;
  //设置边框
  cellStyle2.setBorderLeft(HSSFCellStyle. BORDER_THIN) ;
  cellStyle2.setBorderRight(HSSFCellStyle. BORDER_THIN) ;
  cellStyle2.setBorderTop(HSSFCellStyle. BORDER_THIN) ;
  cellStyle2.setBorderBottom(HSSFCellStyle. BORDER_THIN) ;
  //创建第一行,设置表头
  HSSFRow row= sheet.createRow( 0) ;
  for( int i= 0 ;i<headers. length ;i++){
    HSSFCell cell=row.createCell(i) ;
    cell.setCellStyle(cellStyle1) ;
    cell.setCellValue(headers[i]) ;
  }
  //遍历集合取出数据
  Iterator< T> it = dataset.iterator() ;
  int index = 0 ;
  while (it.hasNext()){
    index++ ;
    row = sheet.createRow(index) ;
    T t = ( T) it.next() ;
    // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
    Field[] fields = t.getClass().getDeclaredFields() ;
    for ( int i= 0 ;i<fields. length ;i++){
      HSSFCell cell= row.createCell(i) ;
      cell.setCellStyle(cellStyle2) ;
      Object value=getFildValue(fields[i] ,t) ;
      // 判断值的类型后进行强制类型转换
      String textValue = null;
      if(value instanceof Boolean){
        boolean bValue = (Boolean) value ;
        textValue = "是" ;
        if (!bValue)
        {
          textValue = "否" ;
        }
      } else if (value instanceof Date)
      {
        Date date = (Date) value ;
        SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd") ;
        textValue = sdf.format(date) ;
      } else
      {
        // 其它数据类型都当作字符串简单处理
        textValue = value.toString() ;
      }
      if (textValue!= null){
          cell.setCellValue(textValue) ;
      }
    }
  }
  //输出excel文件
  OutputStream output= null;
  try {
    output=response.getOutputStream() ;
    response.setHeader( "Content-disposition" , "attachment; filename="+ URLEncoder. encode(fileName , "UTF-8")+ ".xls") ;
    response.setContentType( "application/vnd.ms-excel;charset=UTF-8") ;
    workbook.write(output) ;
  } catch (IOException e) {
    e.printStackTrace() ;
  } finally {
    try {
      output.close() ;
    } catch (IOException e) {
      e.printStackTrace() ;
    }
  }
}

下一节我将来实现如何将我们的工具类打成jar包,这样我们就可以将我们的jar包导入到我们的项目中去了。

以上这篇java 使用poi动态导出的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • JavaWeb动态导出Excel可弹出下载

    由于项目需求,需要将数据导出成Excel表格,并且可选择导出项,可下载.项目使用的Spring+Mybatis+SpringMVC框架,利用Apache POI导出Excel.POI具体使用请自行百度.话不多说,上代码. ExportExcelUtil代码 package com.rixin.common.util; import java.io.OutputStream; import java.lang.reflect.Method; import java.net.URLEncoder;

  • Java使用poi组件导出Excel格式数据

    在做管理系统的时候,我想Excel的导出是我们很难规避掉的,而且这也是个很实用很人性化的功能. Java中对于Excel的支持有很多种,比如说JXL,POI等.我这边使用的是POI进行一个Excel的操作,下面我会简单分享下POI组件的使用,以及我使用比较多一个工具类. POI组件 poi组件是由Apache提供的组件包,主要职责是为我们的Java程序提供对于office文档的相关操作.本文主要是它对于Excel操作的一个介绍. 官方主页:http://poi.apache.org/index.

  • Java利用POI实现导入导出Excel表格示例代码

    介绍 Jakarta POI 是一套用于访问微软格式文档的Java API.Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,在各种组件中目前只有用于操作Excel的HSSF相对成熟.官方主页http://poi.apache.org/index.html,API文档http://poi.apache.org/apidocs/index.html 实现 已经在代码中加入了完整的注释. import java.io.FileInputSt

  • java 使用poi动态导出的操作

    实现用户想要那个字段的数据,就导出那个字段的数据,我使用#分割字段实现 在传入字段的值时做文章 创建一个excel导出工具类, package com.zy.util; import java.io.OutputStream; import java.lang.reflect.Method; import java.util.Collection; import java.util.Iterator; import javax.servlet.http.HttpServletResponse;

  • Java使用POI实现导出Excel的方法详解

    目录 一.前景 二.概念 2.1. 简介 2.2.Excel版本和相关对象 2.3.WorkBook 2.4.POI依赖 三.POI - 写 3.1.代码示例 3.2. 性能对比 3.3. 测试rowAccessWindowSize 3.4. 导出Excel样式设置 四.POI - 读 4.1.代码示例 4.2.读取不同的数据类型 4.3.读取公式 五.POI - 遇到的坑 一.前景 在项目开发中往往需要使用到Excel的导入和导出,导入就是从Excel中导入到DB中,而导出就是从DB中查询数据

  • Java用POI导入导出Excel实例分析

    1.异常java.lang.NoClassDefFoundError: org/apache/poi/UnsupportedFileFormatException 解决方法: 使用的poi的相关jar包一定版本一定要相同!!!!! 2.maven所使用jar包,没有使用maven的话,就用poi-3.9.jar和poi-ooxml-3.9.jar(这个主要是用于Excel2007以后的版本)两个jar包就行() <dependency> <groupId>org.apache.po

  • Java实现Excel导入导出操作详解

    目录 前言 1. 功能测试 1.1 测试准备 1.2 数据导入 1.2.1 导入解析为JSON 1.2.2 导入解析为对象(基础) 1.2.3 导入解析为对象(字段自动映射) 1.2.4 导入解析为对象(获取行号) 1.2.5 导入解析为对象(获取原始数据) 1.2.6 导入解析为对象(获取错误提示) 1.2.7 导入解析为对象(限制字段长度) 1.2.8 导入解析为对象(必填字段验证) 1.2.9 导入解析为对象(数据唯一性验证) 1.3 数据导出 1.3.1 动态导出(基础) 1.3.2 动

  • java使用POI操作excel文件

    一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel. POI全称 Poor Obfuscation Implementation,直译为"可怜的模糊实现",利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能.官网:htt

  • Java利用POI实现导入导出Excel表格

    本文实例为大家分享了Java利用POI实现导入导出Excel表格的具体代码,供大家参考,具体内容如下 一.Java利用POI实现导入导出Excel表格demo 1.引入依赖 <dependency>       <groupId>org.apache.poi</groupId>       <artifactId>poi-ooxml</artifactId>        <version>4.1.2</version>

  • Java使用POI导出Excel(二):多个sheet

    相关文章: Java使用POI导出Excel(一):单sheet Java使用POI导出Excel(二):多个sheet 相信在大部分的web项目中都会有导出导入Excel的需求,但是在我们日常的工作中,需求往往没这么简单,可能需要将数据按类型分类导出或者数据量过大,需要分多张表导出等等.遇到类似的需求该怎么办呢,别慌,往下看. 一.pom引用 pom文件中,添加以下依赖 <!--Excel工具--> <dependency> <groupId>org.apache.p

  • Java使用poi操作excel实例解析

    本文实例为大家分享了Java使用poi操作excel的具体代码,供大家参考,具体内容如下 依赖poi的jar包,pom.xml配置如下: <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0h

  • java动态导出excel压缩成zip下载的方法

    本文实例为大家分享了java动态导出excel压缩成zip下载的具体代码,供大家参考,具体内容如下 package pack.java.io.demo; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.text.Simpl

随机推荐