apache POI 操作excel<导入导出>
1、首先导入maven依赖
<!-- POI核心依赖 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.8</version>
</dependency>
<!-- 为POI支持Office Open XML -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.8</version>
</dependency>
2、MicroUtil.java工具类
package com.yinz.tool.j2ee; import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set; 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.HSSFDataFormat;
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.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.WorkbookUtil;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import com.yinz.tool.ReflectUtil; /**
*
* @description: 执行Microsoft文件 相关操作《导出/导入excel表格等》
* 需要用到POI相关jar包
* @author yinz
* 2016-11-9
*/
public class MicroUtil { public static void main(String[] args) throws Exception {
String excelPath = "C:\\Users\\yinz\\Desktop\\场景2\\场景2-样例数据_拜访记录.xls";
Map<Integer, String> indexMapAtt = new HashMap<Integer, String>();
indexMapAtt.put(0, "mbActivityInfoId");
indexMapAtt.put(1, "activity");
indexMapAtt.put(2, "activityName");
indexMapAtt.put(3, "sendDate");
indexMapAtt.put(4, "state");
indexMapAtt.put(5, "isDelete");
indexMapAtt.put(6, "customerId");
indexMapAtt.put(7, "customerGender");
indexMapAtt.put(8, "customerBirthDay");
indexMapAtt.put(9, "empNo");
indexMapAtt.put(10, "noteType");
indexMapAtt.put(11, "contactDate");
indexMapAtt.put(12, "remark");
List<ContactRecord> result = readExcel(excelPath, null, 1, indexMapAtt, ContactRecord.class);
System.out.println(result);
} /**
* 导出excel表格到输出流<可用于web界面导出excel表格>
* @param response : 输出流
* @param result : 需要导出的数据java对象列表
* @param name : 文件名
* @param excelHead : 表格列名
* @param params : 列对应的对象属性名
* @param isAddIndex : 是否增加序列号
*/
public static void exportExcel(HttpServletResponse response, List<?> result, String name, String[] excelHead, Object[] params, boolean isAddIndex) {
//创建excel表格
HSSFWorkbook wb = new HSSFWorkbook();
//长度不能超过31个字符,并且不能包含部分特殊字符,使用如下方法,可将特殊字符替换为空格,长度超过31的进行
name = WorkbookUtil.createSafeSheetName(name);
HSSFSheet sheet = wb.createSheet(name);
String[] head = null;
//如果增加序号,第一列设为序号,重新生成head数组
if (isAddIndex)
{
head = new String[excelHead.length + 1];
head[0] = "序列号";
for (int i = 0; i < excelHead.length; i++)
{
head[i+1] = excelHead[i];
}
}
else
{
head = excelHead;
}
for(int i=0;i<head.length;i++){
sheet.setColumnWidth(i, 6000);
}
//Rows are 0 based.
HSSFRow row = sheet.createRow((int) 0);
HSSFCellStyle style = wb.createCellStyle();
HSSFCellStyle style2 = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
HSSFDataFormat format = wb.createDataFormat();
style2.setDataFormat(format.getFormat("@")); for(int i=0;i<head.length;i++){
HSSFCell cell = row.createCell((short) i);
cell.setCellValue(head[i]);
cell.setCellStyle(style);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
sheet.setDefaultColumnStyle(i, style2);
}
int count = 1;
if (result != null)
{
for (Object obj : result){ int i = 0;
row = sheet.createRow(count);
//先增加序号
if (isAddIndex)
{
row.createCell((short) 0).setCellValue(count);
i++;
}
for (Object attrName:params)
{
HSSFCell cell = row.createCell((short) i);
cell.setCellStyle(style2);
Object value = ReflectUtil.getObjAttributeValue(obj, (String)attrName);
cell.setCellValue(value == null ? "" : value.toString());
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
i++;
}
count++;
}
}
try
{
String filename = name+".xls";//设置文件名
response.reset();
response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(filename, "UTF-8"));
response.setContentType("application/vnd.ms-excel");
OutputStream fout = response.getOutputStream();
//将excel写到输出流
wb.write(fout);
fout.flush();
fout.close();
response.getOutputStream().flush();
response.getOutputStream().close(); }
catch (Exception e)
{
e.printStackTrace();
}
} //读取excel表格数据 /**
* 读取excel表格内容到java对象
* @param inStream excel文件输入流
* @param sheetPage 要读取的sheet页(0 based),若为null,则读取第1页
* @param startRow 从第几行开始读取
* @param indexMapAtt excel表单cell与java对象对应关系
* @param clazz 要生成的java类型
* @return
* @throws Exception
*/
public static <T> List<T> readExcel(InputStream inStream, Integer[] sheetPage, Integer startRow, Map<Integer, String> indexMapAtt, Class<T> clazz) throws Exception {
startRow = startRow == null ? 0 : startRow;
List<T> result = new ArrayList<T>();
Workbook wb = new HSSFWorkbook(inStream);;
Sheet sheet = null;
if(sheetPage == null || sheetPage.length <= 0) {
sheet = wb.getSheetAt(0);
readSheet(sheet, result, startRow, indexMapAtt, clazz);
} else {
for(Integer sheetIndex : sheetPage) {
sheet = wb.getSheetAt(sheetIndex);
readSheet(sheet, result, startRow, indexMapAtt, clazz);
}
} return result;
} /**
*
* @param excelPath excel表格路径
* @param sheetPage 要读取的excel中的sheet所有 、0开始
* @param startRow 开始读取的数据的行标 ,0开始
* @param indexMapAtt 列索引与对象属性对应map
* @param clazz 每行记录所对应的java对象
* @return
* @throws Exception
*/
@SuppressWarnings("resource")
public static <T> List<T> readExcel(String excelPath, Integer[] sheetPage, Integer startRow, Map<Integer, String> indexMapAtt, Class<T> clazz) throws Exception {
startRow = startRow == null ? 0 : startRow;
List<T> result = new ArrayList<T>();
InputStream inStream = new FileInputStream(excelPath);
Workbook wb = null;
if(excelPath.matches("^.+\\.(?i)(xls)$")) {
//excel2003
wb = new HSSFWorkbook(inStream);
} else if(excelPath.matches("^.+\\.(?i)(xlsx)$")) {
//excel2007
wb = new XSSFWorkbook(inStream);
} else {
return null;
}
Sheet sheet = null;
if(sheetPage == null || sheetPage.length <= 0) {
sheet = wb.getSheetAt(0);
readSheet(sheet, result, startRow, indexMapAtt, clazz);
} else {
for(Integer sheetIndex : sheetPage) {
sheet = wb.getSheetAt(sheetIndex);
readSheet(sheet, result, startRow, indexMapAtt, clazz);
}
} return result;
} //读取excel中的sheet数据、并为java对象集合赋值
private static <T> void readSheet(Sheet sheet, List<T> result, Integer startRow, Map<Integer, String> indexMapAtt, Class<T> resultType) throws Exception {
//获取总行数
int totalRows = sheet.getPhysicalNumberOfRows(); T t;
for(int i = startRow; i < totalRows; i++) {
Row row = sheet.getRow(i);
if(row == null) {
continue;
} t = resultType.newInstance();
Set<Integer> cellIndexSet = indexMapAtt.keySet();
for(Integer index : cellIndexSet) {
Cell cell = row.getCell(index);
if(cell == null) {
continue;
}
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
ReflectUtil.setObjAttributeValue(t, indexMapAtt.get(index), cell.getStringCellValue() == null ? "" : cell.getStringCellValue());
}
result.add(t);
}
}
}
反射工具类:ReflectUtil.java
package com.yinz.tool; import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map; /**
*
* @description: 反射工具类
* @author yinz
* 2016-11-9
*/
public class ReflectUtil { /**
* 将对象属性和值以map存储,默认包含属性值为null的属性
* @param obj
* @return
*/
public static Map<String, Object> obj2map(Object obj) {
return obj2map(obj, true);
} /**
* 将对象属性和值以map存储
* @param obj
* @param isContainNullValue : 是否包含属性中为空的属性
* @return
*/
public static Map<String, Object> obj2map(Object obj, boolean isContainNullValue) {
Map<String, Object> map = new HashMap<String, Object>(); Field[] fList = obj.getClass().getDeclaredFields();
try {
for(Field f : fList) {
f.setAccessible(true);
if(isContainNullValue) {
map.put(f.getName(), f.get(obj));
} else {
if(f.get(obj) != null && f.get(obj) != "") {
map.put(f.getName(), f.get(obj));
}
}
}
} catch (Exception e) {
return null;
}
return map;
} /**
* 获取对象指定属性值
* @param obj
* @param attName
* @return
*/
public static Object getObjAttributeValue(Object obj, String attName) {
return getObjAttributeValue(obj, attName, "");
} /**
* 获取对象指定属性的值
* @param obj : 查询对象
* @param attName : 要获取的属性名
* @param defVal : 默认值
* @return
*/
public static Object getObjAttributeValue(Object obj, String attName, String defVal) {
Object value = null;
Field field = null;
try {
field = obj.getClass().getDeclaredField(attName);
field.setAccessible(true);
value = field.get(obj);
} catch (Exception e) {
return defVal;
}
if(value == null || value.toString().trim().length() <= 0) {
value = defVal;
}
return value;
} /**
* 为对象属性赋值
* @param obj 要赋值的对象
* @param attName 对象属性名
* @param value 属性值
*/
public static void setObjAttributeValue(Object obj, String attName, String value) {
Field field = null;
try {
field = obj.getClass().getDeclaredField(attName);
field.setAccessible(true);
field.set(obj, value);
} catch (Exception e) {
}
}
}
实体类:ContactRecord.java
package com.tianwen.nlp.pojo; public class ContactRecord {
private Integer id; private String mbActivityInfoId; private String activityType; private String activityName; private String sendDate; private String state; private String isDelete; private String customerId; private String customerGender; private String customerBirthday; private String empNo; private String noteType; private String contactDate; private String remark; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getMbActivityInfoId() {
return mbActivityInfoId;
} public void setMbActivityInfoId(String mbActivityInfoId) {
this.mbActivityInfoId = mbActivityInfoId == null ? null : mbActivityInfoId.trim();
} public String getActivityType() {
return activityType;
} public void setActivityType(String activityType) {
this.activityType = activityType == null ? null : activityType.trim();
} public String getActivityName() {
return activityName;
} public void setActivityName(String activityName) {
this.activityName = activityName == null ? null : activityName.trim();
} public String getSendDate() {
return sendDate;
} public void setSendDate(String sendDate) {
this.sendDate = sendDate == null ? null : sendDate.trim();
} public String getState() {
return state;
} public void setState(String state) {
this.state = state == null ? null : state.trim();
} public String getIsDelete() {
return isDelete;
} public void setIsDelete(String isDelete) {
this.isDelete = isDelete == null ? null : isDelete.trim();
} public String getCustomerId() {
return customerId;
} public void setCustomerId(String customerId) {
this.customerId = customerId == null ? null : customerId.trim();
} public String getCustomerGender() {
return customerGender;
} public void setCustomerGender(String customerGender) {
this.customerGender = customerGender == null ? null : customerGender.trim();
} public String getCustomerBirthday() {
return customerBirthday;
} public void setCustomerBirthday(String customerBirthday) {
this.customerBirthday = customerBirthday == null ? null : customerBirthday.trim();
} public String getEmpNo() {
return empNo;
} public void setEmpNo(String empNo) {
this.empNo = empNo == null ? null : empNo.trim();
} public String getNoteType() {
return noteType;
} public void setNoteType(String noteType) {
this.noteType = noteType == null ? null : noteType.trim();
} public String getContactDate() {
return contactDate;
} public void setContactDate(String contactDate) {
this.contactDate = contactDate == null ? null : contactDate.trim();
} public String getRemark() {
return remark;
} public void setRemark(String remark) {
this.remark = remark == null ? null : remark.trim();
}
}
此处用与上传的excel文件:http://files.cnblogs.com/files/yinz/场景2-样例数据_拜访记录.rar
apache POI 操作excel<导入导出>的更多相关文章
- 【原创】POI操作Excel导入导出工具类ExcelUtil
关于本类线程安全性的解释: 多数工具方法不涉及共享变量问题,至于添加合并单元格方法addMergeArea,使用ThreadLocal变量存储合并数据,ThreadLocal内部借用Thread.Th ...
- SpringBoot集成文件 - 集成POI之Excel导入导出
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能.本文主要介绍通过Spr ...
- 利用Apache POI操作Excel
最近在做接口,有个功能是利用Excel导入汽车发动机所需零件信息到线上系统中.简单回顾一下之前学过的用java操作Excel. 1.maven配置Apache POI pom.xml中配置POIjar ...
- Java之POI的excel导入导出
一.Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显示MS Office文件.这由Apache软件基金会开发使用Java分布式设计或修改Microsoft Offic ...
- Java使用Apache POI进行Excel导入和导出
Manve依赖 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --> <dependency> ...
- POI操作Excel导入和导出
Apache的POI组件是Java操作Microsoft Office办公套件的强大API,当中对Word,Excel和PowperPoint都有支持,当然使用较多的还是Excel.由于Word和Po ...
- 基于POI的Excel导入导出(JAVA实现)
今天做了个excel的导入导出功能,在这记录下. 首先现在相关poi的相关jar包,资源链接:http://download.csdn.net/detail/opening_world/9663247 ...
- POI实现Excel导入导出
我们知道要创建一张excel你得知道excel由什么组成,比如说sheet也就是一个工作表格,例如一行,一个单元格,单元格格式,单元格内容格式…这些都对应着poi里面的一个类. 一个excel表格: ...
- Spring Boot学习笔记----POI(Excel导入导出)
业务:动态生成模板导出Excel,用户修改完再导入Excel. Spring boot + bootstrap + poi 1.添加Dependence <dependency> < ...
随机推荐
- 输入参数之POJO包装类
1,包装类:需要实现序列化 package com.songyan.pojo; import java.io.Serializable; public class QueryVo implements ...
- 不仅仅是浏览器 走近Chrome开发人员工具
Chrome浏览器以其简单.快速.安全.稳定.扩展丰富等特性受到了不少人的喜爱,除了这些特性,Chrome浏览器还提供了非常简单方便的开发人员工具,可以为开发提高效率,加上Chrome浏览器对HTML ...
- [Android Traffic] Android网络开启、关闭整理
转载: http://blog.csdn.net/tu_bingbing/article/details/8469871 近段时间由于要对手机网络状况进行判断.开启和关闭,从网上找了些资料,现整理如下 ...
- Go 测试单个方法/性能测试
Go 测试单个方法 gotest.go package mytest import ( "errors" ) func Division(a, b float64) (float6 ...
- 64个命令,每天一个linux命令目录, shutdown,tee,rcp,
每天一个linux命令目录 开始详细系统的学习linux常用命令,坚持每天一个命令,所以这个系列为每天一个linux命令.学习的主要参考资料为: 1.<鸟哥的linux私房菜> 2.htt ...
- Java平时需要注意的事项
1.String 相等 稍微有点经验的程序员都会用equals比较而不是用 ==,但用equals就真的安全了吗,看下面的代码 user.getName().equals("xiaoming ...
- golang中的那些坑之迭代器中的指针使用
今天在编写代码的时候,遇到了一个莫名其妙的错误,debug了半天,发现这是一个非常典型且易犯的错误.记之 示例代码: package main import "fmt" type ...
- hdu 5265 技巧题 O(nlogn)求n个数中两数相加取模的最大值
pog loves szh II Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- .Net——实现IConfigurationSectionHandler接口定义处理程序处理自己定义节点
除了使用.net里面提供的内置处理程序来处理我们的自己定义节点外,我们还能够通过多种方法,来自己定义处理类处理我们的自己定义节点,本文主要介绍通过实现IConfigurationSectionHand ...
- NSDate 问题
类型 比特数 有效数字 数值范围 float 32 6-7 -3.4*10(-38)-3.4*10(38) double 64 15-16 -1.7*10(-308)-1.7*10(308) long ...