poi-excel导入导出
程序员文章站
2022-07-02 14:13:05
一、添加依赖 二、工具类 ......
一、添加依赖
<dependency>
<groupid>org.apache.poi</groupid>
<artifactid>poi-scratchpad</artifactid>
<version>3.17</version>
</dependency>
二、工具类
import lombok.extern.slf4j.slf4j;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.cell;
import org.apache.poi.ss.usermodel.row;
import org.springframework.web.multipart.multipartfile;
import org.springframework.web.multipart.commons.commonsmultipartfile;
import java.io.*;
import java.lang.reflect.field;
import java.lang.reflect.invocationtargetexception;
import java.lang.reflect.method;
import java.lang.reflect.type;
import java.text.simpledateformat;
import java.util.*;
@slf4j
public class excelhelper<t> {
//构造方法
public excelhelper() {
}
class<t> clazz;
public class<t> getclazz() {
return clazz;
}
public void setclazz(class<t> clazz) {
this.clazz = clazz;
}
/**
* 读excel文件,获取信息集合
*filepath:文件所在目录;name:文件名称;fieldmap:目标类需要导入的字段
* @param filepath
* @return
*/
public list<t> getexcelinfo(string filepath,string name,map fieldmap,multipartfile mfile) {
//把spring文件上传的multipartfile转换成commonsmultipartfile类型
commonsmultipartfile cf = (commonsmultipartfile) mfile; //获取本地存储路径
file file = new file(filepath);
//创建一个目录 (它的路径名由当前 file 对象指定,包括任一必须的父路径。)
if (!file.exists()) file.mkdirs();
//新建一个文件
string newfilepath=filepath+name;
file file1 = new file(newfilepath);
//将上传的文件写入新建的文件中
try {
cf.getfileitem().write(file1);
} catch (exception e) {
log.error("readexcel:" + e);
e.printstacktrace();
}
list<t> dist = new arraylist<t>();
try {
fileinputstream in = new fileinputstream(file1);
hssfworkbook book = new hssfworkbook(in);
// // 得到第一页
hssfsheet sheet = book.getsheetat(0);
// // 得到第一面的所有行
iterator<row> row = sheet.rowiterator();
// 获取标题map
map titlemap = gettitlemap(row);
while (row.hasnext()) {
t tobject = clazz.newinstance();
// 标题下的第一行
row rown = row.next();
int k = 0;
// 遍历一行的列
for (int j = 0; j < rown.getlastcellnum() + 1; j++) {
cell cell = rown.getcell(j);
if (cell == null) {
k++;
continue;
}
// 得到此列的对应的标题
string titlestring = (string) titlemap.get(k);
// 如果这一列的标题和类中的某一列的annotation相同,那么则调用此类的的set方法,进行设值
if (fieldmap.containskey(titlestring)) {
method setmethod = (method) fieldmap.get(titlestring);
setdata(tobject, cell, setmethod);
}
k++;
}
dist.add(tobject);
}
} catch (exception e) {
log.error(e.tostring());
}
return dist;
}
private map gettitlemap(iterator<row> row) {
row title = row.next();
// 得到第一行的所有列
iterator<cell> celltitle = title.celliterator();
// 将标题的文字内容放入到一个map中。
map titlemap = new hashmap();
// 从标题第一列开始
int i = 0;
// 循环标题所有的列
while (celltitle.hasnext()) {
cell cell = celltitle.next();
string value = cell.getstringcellvalue();
// 还是把表头trim一下
value = value.trim();
titlemap.put(i, value);
i = i + 1;
}
return titlemap;
}
private void setdata(t tobject, cell cell, method setmethod) throws illegalaccessexception, invocationtargetexception {
// 得到setter方法的参数
type[] ts = setmethod.getgenericparametertypes();
// 只要一个参数
string xclass = ts[0].tostring();
// 判断参数类型
try {
switch (cell.getcelltypeenum()) {
// 数字
case numeric:
if ("class java.lang.string".equals(xclass)) {
if ((cell.getnumericcellvalue() + "").indexof(".") > 0) {
setmethod.invoke(tobject, (cell.getnumericcellvalue() + "").substring(0, (cell.getnumericcellvalue() + "").lastindexof(".")));
}
} else if ("class java.lang.integer".equals(xclass)) {
setmethod.invoke(tobject, (int) cell.getnumericcellvalue());
} else if ("int".equals(xclass)) {
setmethod.invoke(tobject, (int) cell.getnumericcellvalue());
} else if ("class java.lang.long".equals(xclass)) {
long temp = (long) cell.getnumericcellvalue();
setmethod.invoke(tobject, temp);
}
break;
// 字符串
case string:
if ("class java.lang.integer".equals(xclass)) {
setmethod.invoke(tobject, integer.parseint(cell.getstringcellvalue()));
} else if ("class java.lang.string".equals(xclass)) {
setmethod.invoke(tobject, cell.getstringcellvalue().trim());
} else if ("int".equals(xclass)) {
int temp = integer.parseint(cell.getstringcellvalue());
setmethod.invoke(tobject, temp);
} else if ("class java.lang.long".equals(xclass)) {
long temp = long.parselong(cell.getstringcellvalue());
setmethod.invoke(tobject, temp);
}
break;
// boolean
case boolean:
boolean boolname = true;
if ("否".equals(cell.getstringcellvalue())) {
boolname = false;
}
setmethod.invoke(tobject, boolname);
break;
// 公式
case formula:
log.info(cell.getcellformula() + " ");
break;
// 空值
case blank:
log.info(" ");
break;
// 故障
case error:
log.info(" ");
break;
default:
log.info("未知类型 ");
break;
}
} catch (exception e) {
// 转换出错
log.error(e.tostring());
throw e;
}
}
// 得到目标类需要导入的字段
public map getfieldmap(string[] fileds) throws nosuchmethodexception {
field[] filed = clazz.getdeclaredfields();
map fieldmap = new hashmap();
// 循环读取所有字段
for (int i = 0; i < filed.length; i++) {
field f = filed[i];
for(int j=0;j<fileds.length;j++){
string fd=fileds[j];
if(f.getname().equals(fd)){
string setmethodname = "set"
+ f.getname().substring(0, 1).touppercase()
+ f.getname().substring(1);
method setmethod = clazz.getmethod(setmethodname,
new class[]{f.gettype()});
fieldmap.put(f.getname(), setmethod);
}
} }
return fieldmap;
}
//导出excel
public string export(string basepath,string excelpath,string [][] content,string[] title,string sheetname,string filename){
outputstream os=null;
try {
filename=new simpledateformat("yyyy-mm-dd").format(new date())+"/"+filename;
file folderfile=new file(basepath+excelpath+new simpledateformat("yyyy-mm-dd").format(new date()));
if(!folderfile.exists()){
folderfile.mkdir();
}
os = new fileoutputstream(new file(basepath+excelpath + filename));
hssfworkbook wb = gethssfworkbook(sheetname, title, content, null);
wb.write(os);
os.flush();
os.close();
}catch (exception e){
e.printstacktrace();
}finally {
os=null;
}
return excelpath+filename;
}
/**
* 导出excel
* @param sheetname sheet名称
* @param title 标题
* @param values 内容
* @param wb hssfworkbook对象
* @return
*/
private hssfworkbook gethssfworkbook(string sheetname,string []title,string [][]values, hssfworkbook wb){
// 第一步,创建一个hssfworkbook,对应一个excel文件
if(wb == null){
wb = new hssfworkbook();
}
// 第二步,在workbook中添加一个sheet,对应excel文件中的sheet
hssfsheet sheet = wb.createsheet(sheetname);
// 第三步,在sheet中添加表头第0行,注意老版本poi对excel的行数列数有限制
hssfrow row = sheet.createrow(0);
// 第四步,创建单元格,并设置值表头 设置表头居中
hssfcellstyle style = wb.createcellstyle();
//style.setalignment(hssfcellstyle.align_center); // 创建一个居中格式
//声明列对象
hssfcell cell = null;
//创建标题
for(int i=0;i<title.length;i++){
cell = row.createcell(i);
cell.setcellvalue(title[i]);
cell.setcellstyle(style);
}
//创建内容
for(int i=0;i<values.length;i++){
row = sheet.createrow(i + 1);
for(int j=0;j<values[i].length;j++){
//将内容按顺序赋给对应的列对象
row.createcell(j).setcellvalue(values[i][j]);
}
}
return wb;
}
}
上一篇: JAVA 从头开始<二>
下一篇: Spring核心——设计模式与IoC