通过使用poi技术生成Excel,使用反射技术实现自动映射列表的数据。

ExportTableUtil.java

public class ExportTableUtil {

	/**
*
* @Description: 获取csv格式的字符串
* @param @param 表格头
* @param @param fieldNameList 对应的属性名 按照先后与表头对应而且值与数据类型的属性名对应
* @param @param params 数据
* @param @return
* @param @throws IllegalArgumentException
* @param @throws IllegalAccessException
* @param @throws NoSuchFieldException
* @param @throws SecurityException 设定文件
* @return String 返回类型
*/
public static String csv(String[] headList, String[] fieldNameList, List<?> params) throws IllegalArgumentException, IllegalAccessException,
NoSuchFieldException, SecurityException {
StringBuilder stringBuilder = new StringBuilder();
// add head on first
for (int i = 0; null != headList && i < headList.length; i++) {
stringBuilder.append(headList[i]);
if (i < headList.length - 1) {
stringBuilder.append(",");
} else {
stringBuilder.append("\r\n");
}
}
// add data from second line to ---
for (int i = 0; null != params && i < params.size(); i++) {
Class<? extends Object> clazz = params.get(i).getClass();
for (int j = 0; null != fieldNameList && j < fieldNameList.length; j++) {
String fieldName = fieldNameList[j];
if (!fieldName.contains(".")) {
Field field = clazz.getDeclaredField(fieldName);
if (null != field) {
field.setAccessible(true);
Object obj = field.get(params.get(i));
if (null != obj) {
stringBuilder.append(obj.toString());
}
} else {
stringBuilder.append("");
}
if (j < fieldNameList.length - 1) {
stringBuilder.append(",");
}
}else{
Object param = params.get(i);
Object valObj = vectorObj(clazz, fieldName, param);
if(null!=valObj){
stringBuilder.append(valObj.toString());
}else {
stringBuilder.append("");
}
if (j < fieldNameList.length - 1) {
stringBuilder.append(",");
}
}
}
stringBuilder.append("\r\n");
} return stringBuilder.toString();
} /**
*
* @Description: 通过response下载文档
* @param @param response
* @param @param fileName
* @param @param headList
* @param @param fieldNameList
* @param @param params 设定文件
* @return void 返回类型
*/
public static void httpExportCSV(HttpServletRequest request, HttpServletResponse response, String fileName, String[] headList,
String[] fieldNameList, List<?> params) {
Map<String, Object> map = new HashMap<String, Object>();
try {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/x-download");
final String userAgent = request.getHeader("USER-AGENT");
String csvContent = csv(headList, fieldNameList, params);
String finalFileName = null;
if (StringUtils.contains(userAgent, "MSIE")) {// IE浏览器
finalFileName = URLEncoder.encode(fileName, "UTF8");
} else if (StringUtils.contains(userAgent, "Mozilla")) {// google,火狐浏览器
finalFileName = new String(fileName.getBytes(), "ISO8859-1");
} else {
finalFileName = URLEncoder.encode(fileName, "UTF8");// 其他浏览器
} response.setHeader("Content-Disposition", "attachment; filename=\"" + finalFileName + "\"");
response.getOutputStream().write(csvContent.getBytes());
} catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException | IOException e) { e.printStackTrace();
map.put("state", "202");
map.put("message", "数据转换异常");
try {
response.getOutputStream().write(JSONUtils.toJSONString(map).getBytes());
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} } /**
*
* @Description: 得到excel表的二进制流
* @param @param headList 表头
* @param @param fieldNameList 属性名按照表头先后顺序对应而且必须在数据类型中存在属性名与之对应
* @param @param params
* @param @return
* @param @throws IllegalArgumentException
* @param @throws IllegalAccessException
* @param @throws NoSuchFieldException
* @param @throws SecurityException
* @param @throws IOException 设定文件
* @return byte[] 返回类型
*/
public static byte[] xls(String[] headList, String[] fieldNameList, List<?> params) throws IllegalArgumentException, IllegalAccessException,
NoSuchFieldException, SecurityException, IOException {
Workbook work = new HSSFWorkbook();
Sheet sheet = work.createSheet();
Row rowOne = sheet.createRow(0);
for (int i = 0; null != headList && i < headList.length; i++) {// 表头
Cell cellOne = rowOne.createCell(i);
cellOne.setCellValue(headList[i]);// 填充值
} // 数据填充
for (int i = 0; null != params && i < params.size(); i++) {
Class<? extends Object> clazz = params.get(i).getClass();
Row dataRow = sheet.createRow(i + 1);
for (int j = 0; null != fieldNameList && j < fieldNameList.length; j++) {
String fieldName = fieldNameList[j];
Cell cell = dataRow.createCell(j);
if (!fieldName.contains(".")) {
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
Object obj = field.get(params.get(i));
if (null != obj) { if (obj instanceof String) {
cell.setCellValue(obj.toString());
} else if (obj instanceof Double) {
cell.setCellValue((double) obj);
} else if (obj instanceof Boolean) {
cell.setCellValue((boolean) obj);
} else if (obj instanceof Date) {
cell.setCellValue((Date) obj);
} else {
cell.setCellValue(obj.toString());
}
}
} else if (fieldName.contains(".")) {
Object param = params.get(i);
Object valObj = vectorObj(clazz, fieldName, param); cell.setCellValue(null == valObj ? null : valObj.toString());
} } }
ByteOutputStream bos = new ByteOutputStream();
work.write(bos);
work.close();
return bos.getBytes();
} private static Object vectorObj(Class<? extends Object> clazz, String fieldName, Object obj) throws NoSuchFieldException, SecurityException,
IllegalArgumentException, IllegalAccessException {
if (!fieldName.contains(".")) {
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
return field.get(obj);
} else {
String fieldChildName = fieldName.substring(0, fieldName.indexOf("."));
Object newObj = null;
if (null != fieldChildName) { Field field = clazz.getDeclaredField(fieldChildName);
field.setAccessible(true);
newObj = field.get(obj);
if (newObj == null) {
return null; } else {
Class<? extends Object> clazz2 = newObj.getClass();
String fieldOtherChildName = fieldName.substring(fieldName.indexOf(".") + 1);
return vectorObj(clazz2, fieldOtherChildName, newObj);
} }
return null;
} } /**
*
* @Description: 导出xls表-------------从第一列开始
* @param @param request
* @param @param response
* @param @param fileName 文件名
* @param @param headList 表头
* @param @param fieldNameList 属性名 和按照表头先后顺序对应,值和数据列表中对象类型的属性名相同
* @param @param params 设定文件
* @return void 返回类型
*/
public static void httpExportXLS(HttpServletRequest request, HttpServletResponse response, String fileName, String[] headList,
String[] fieldNameList, List<?> params) {
Map<String, Object> map = new HashMap<String, Object>();
try {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/x-download");
final String userAgent = request.getHeader("USER-AGENT");
byte[] xlsContent = xls(headList, fieldNameList, params);
String finalFileName = null;
if (StringUtils.contains(userAgent, "MSIE")) {// IE浏览器
finalFileName = URLEncoder.encode(fileName, "UTF8");
} else if (StringUtils.contains(userAgent, "Mozilla")) {// google,火狐浏览器
finalFileName = new String(fileName.getBytes(), "ISO8859-1");
} else {
finalFileName = URLEncoder.encode(fileName, "UTF8");// 其他浏览器
} response.setHeader("Content-Disposition", "attachment; filename=\"" + finalFileName + "\"");
response.getOutputStream().write(xlsContent);
} catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException | IOException e) { e.printStackTrace();
map.put("state", "202");
map.put("message", "数据转换异常");
try {
response.getOutputStream().write(JSONUtils.toJSONString(map).getBytes());
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
} /**
*
* @Description: 根据路径的后缀名导出对应的文件
* @param @param request
* @param @param response
* @param @param fileName------------文件名(格式*.xls,*.csv)
* @param @param headList--------------表格头部内容
* @param @param fieldNameList----------属性名和数据列表中类型的属性名相同,通过先后循序和表头对应。
* @param @param params--------------数据
* @param @throws Exception ----文件名不合法
* @return void 返回类型
*/
public static void httpExport(HttpServletRequest request, HttpServletResponse response, String fileName, String[] headList,
String[] fieldNameList, List<?> params) throws Exception {
if (null == fileName || StringUtils.isEmpty(fileName)) {
throw new NullPointerException("文件名不可以为空");
} else {
String suffix = fileName.substring(fileName.indexOf(".") + 1);
if (null != suffix) {
System.out.println(suffix);
switch (suffix) {
case "csv":
httpExportCSV(request, response, fileName, headList, fieldNameList, params);
break;
case "xls":
httpExportXLS(request, response, fileName, headList, fieldNameList, params);
break;
case "xlsx":
httpExportXLS(request, response, fileName, headList, fieldNameList, params);
break;
case "doc":
break;
case "docx":
break;
case "pdf":
break;
}
} else {
throw new Exception("文件名的格式不合法");
}
}
}
}

  

java使用poi实现excel表格生成的更多相关文章

  1. java用poi读取Excel表格中的数据

    Java读写Excel的包是Apache POI(项目地址:http://poi.apache.org/),因此需要先获取POI的jar包,本实验使用的是POI 3.9稳定版.Apache POI 代 ...

  2. Java使用POI解析Excel表格

    概述 Excel表格是常用的数据存储工具,项目中经常会遇到导入Excel和导出Excel的功能. 常见的Excel格式有xls和xlsx.07版本以后主要以基于XML的压缩格式作为默认文件格式xlsx ...

  3. Java Struts2 POI创建Excel文件并实现文件下载

    Java Struts2 POI创建Excel文件并实现文件下载2013-09-04 18:53 6059人阅读 评论(1) 收藏 举报 分类: Java EE(49) Struts(6) 版权声明: ...

  4. JAVA使用POI获取Excel的列数与行数

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能. 下面这篇文章给大家介 ...

  5. Java之POI导出Excel(一):单sheet

    相信在大部分的web项目中都会有导出导入Excel的需求,今天我们就来看看如何用Java代码去实现 用POI导出Excel表格. 一.pom引用 pom文件中,添加以下依赖 查看代码  <!-- ...

  6. JAVA使用POI读取EXCEL文件的简单model

    一.JAVA使用POI读取EXCEL文件的简单model 1.所需要的jar commons-codec-1.10.jarcommons-logging-1.2.jarjunit-4.12.jarlo ...

  7. java通过poi编写excel文件

    public String writeExcel(List<MedicalWhiteList> MedicalWhiteList) { if(MedicalWhiteList == nul ...

  8. java使用POI实现excel文件的读取,兼容后缀名xls和xlsx

    需要用的jar包如下: 如果是maven管理的项目,添加依赖如下: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --&g ...

  9. Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决

    Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决 引言: 在Java中 ...

随机推荐

  1. NoSQL 数据库概览及其与 SQL 语法的比较

    NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用的难题. 本文对NoSQL数据库的定义.分类.特征.当前比较流行的NoSQL数据库系统等进行了简单的介绍,并对N ...

  2. Spring源码解析(一)开篇

    前言 Spring源码继承结构比较复杂,看过以后经常会忘记.因此,记录一下源码分析的过程,方便以后回顾.本次分析的Spring源码版本为3.2.15. 另外,一提Spring就是IOC.DI等等,我们 ...

  3. abap 中modify 的使用

    1.modify table itab from wa Transporting f1 f2 ... 表示表itab中符合工作区wa 中关键字的一条数据的 f1 f2字段会被wa中对应的字段值更新. ...

  4. UVA+POJ中大数实现的题目,持续更新(JAVA实现)

    UVA10494:If We Were a Child Again 大数除法加取余 import java.util.Arrays; import java.util.Scanner; import ...

  5. su 与 su - 区别

    su与su -都是用来切换用户的命令,简单说它们之间的区别就是:su -切换的干净彻底,而su 切换用户却拖泥带水. su su username,切换到指定用户,但是当前目录不会变化,环境变量还是上 ...

  6. 初探Nginx服务器的整体架构

    高度模块化的设计是 Nginx 的架构基础.Nginx 服务器被分解为多个模块,每个模块就是一个功能模块,只负责自身的功能,模块之间严格遵循“高内聚,低耦合”的原则. 核心模块 核心模块是 Nginx ...

  7. web安全学习方向~两图胜千言~~

  8. 使用Xib创建自定义视图(不是cell)时需要注意的问题

    开发项目过程中,有些地方不免会用到Xib来提高开发效率,如果你的手速够快,写代码建视图,我并不反对这样做.因为我以前也是纯手写代码开发. 进入正题,Xib好用,但是这些下面这些问题需要注意一下. 问题 ...

  9. LRU算法---缓存淘汰算法

    计算机中的缓存大小是有限的,如果对所有数据都缓存,肯定是不现实的,所以需要有一种淘汰机制,用于将一些暂时没有用的数据给淘汰掉,以换入新鲜的数据进来,这样可以提高缓存的命中率,减少磁盘访问的次数. LR ...

  10. linux系统上使用unzip命令

    最近在本地使用maven打包工程后,将工程部署到linux服务器的tomcat上,使用unzip解压工程报--->未找到命令.即该命名文件未安装,需要安装一下.安装命令如下: yum insta ...