一、前言
最近做一个推送服务将系统某些报表,通过邮件附件的形式推送给指定的人,首先我们需要在服务端生成报表的excel文档。生成excel文档采用的是poi的方式。
二、pom引入相应的jar包
引入三个poi相关的jar包
<dependency>
<groupid>org.apache.poi</groupid>
<artifactid>poi</artifactid>
<version>4.1.2</version>
</dependency>
<dependency>
<groupid>org.apache.poi</groupid>
<artifactid>poi-ooxml</artifactid>
<version>4.1.2</version>
</dependency>
<dependency>
<groupid>org.apache.poi</groupid>
<artifactid>poi-ooxml-schemas</artifactid>
<version>4.1.2</version>
</dependency>注意:这三个jar包的版本号一定要保持一致。否则的话会引起异常,无法创建xssfworkbook
三、导出方法封装类
import lombok.extern.slf4j.slf4j;
import org.apache.http.client.utils.dateutils;
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.xssf.usermodel.xssfworkbook;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.sql.timestamp;
import java.util.*;
/**
* poi导出excel封装
* @author lenny
* @date 20210715
*/
@slf4j
public class excelutil {
/**
* @param filename excel文件名
* @param headmap 表头map
* @param datalist 表格数据
*/
public static string exportexcel(string filename,map<string, string> headmap, list<map<string, object>> datalist) {
string fullpath="";
workbook workbook = exportxlsx(filename, headmap, datalist);
fileoutputstream outputstream=null;
try {
//将生成的excel存储在系统根目录下excel文件夹中
string path=commonutil.getrunningdirectory()+"\\excel\\";
fullpath=path+filename;
outputstream = new fileoutputstream(path+filename);
workbook.write(outputstream);
} catch (exception e) {
e.printstacktrace();
} finally {
if (outputstream != null) {
try {
outputstream.close();
} catch (ioexception e) {
e.printstacktrace();
}
}
}
//返回文件所在的目录
return fullpath;
}
/**
* 导出数据
*
* @param headmap 表头map
* @param datalist 导出的数据
*/
public static workbook exportxlsx(string sheetname, map<string, string> headmap, list<map<string, object>> datalist) {
try {
xssfworkbook workbook = new xssfworkbook();
sheet sheet = workbook.createsheet(sheetname);
//初始化行列索引
int rowindex = 0, columnindex = 0;
set<string> keys = headmap.keyset();
//表头
row row = sheet.createrow(rowindex++);
for (string key : keys) {
cell cell = row.createcell(columnindex++);
cell.setcellvalue(headmap.get(key));
}
//内容
if (datalist != null && !datalist.isempty()) {
for (map<string, object> map : datalist) {
row = sheet.createrow(rowindex++);
columnindex = 0;
for (string key : keys) {
cell cell = row.createcell(columnindex++);
setcellvalue(cell, map.get(key));
}
}
}
return workbook;
}catch (exception e){
log.error(e.tostring());
return null;
}
}
/**
* 填充单元格内容
* @param cell
* @param obj
*/
private static void setcellvalue(cell cell, object obj) {
if (obj == null) {
return;
}
if (obj instanceof string) {
cell.setcellvalue((string) obj);
} else if (obj instanceof date) {
date date = (date) obj;
if (date != null) {
cell.setcellvalue(dateutils.formatdate(date));
}
} else if (obj instanceof calendar) {
calendar calendar = (calendar) obj;
if (calendar != null) {
cell.setcellvalue(dateutils.formatdate(calendar.gettime()));
}
} else if (obj instanceof timestamp) {
timestamp timestamp = (timestamp) obj;
if (timestamp != null) {
cell.setcellvalue(dateutils.formatdate(new date(timestamp.gettime())));
}
} else if (obj instanceof double) {
cell.setcellvalue((double) obj);
} else {
cell.setcellvalue(obj.tostring());
}
}
}其中使用到了封装的获取系统根目录的方法,方法实现如下:
/**
* 得到程序运行的根目录
* @return
*/
public static string getrunningdirectory()
{
return system.getproperty("user.dir");
}四、调用方法执行生成excel操作
/**
* 导出adas报警
* @param reportadaslist
* @param language
* @param timediff
* @return
*/
public static string exportadasreport(list<reportadaslist> reportadaslist, int language, int timediff) {
//表头
map<string, string> headnamemap = new linkedhashmap<string, string>();
headnamemap.put("agentname", getheadname("agentname",language));
headnamemap.put("vehiclename", getheadname("vehiclename",language));
headnamemap.put("assetid", getheadname("assetid",language));
headnamemap.put("alarmtype", getheadname("alarmtype",language));
headnamemap.put("alarmlevel", getheadname("alarmlevel",language));
headnamemap.put("starttime", getheadname("starttime",language));
headnamemap.put("endtime", getheadname("endtime",language));
headnamemap.put("drivername", getheadname("drivername",language));
headnamemap.put("startaddress", getheadname("startaddress",language));
headnamemap.put("endaddress", getheadname("endaddress",language));
headnamemap.put("processstatus", getheadname("processstatus",language));
headnamemap.put("processcontext", getheadname("processcontext",language));
headnamemap.put("processtime", getheadname("processtime",language));
//表格数据
list<map<string, object>> datalist = new arraylist<map<string, object>>();
for(reportadaslist item : reportadaslist){
map<string, object> map = new hashmap<string, object>();
map.put("agentname", item.getagentname());
map.put("vehiclename", item.getvehiclename());
map.put("assetid", item.getassetid());
map.put("alarmtype", language==1?item.getcnname():item.getenname());
map.put("alarmlevel", getalarmlevel(item.getalarmlevel(),language));
map.put("starttime", commonutil.getlocaltime(item.getstarttime(),timediff));
map.put("endtime", commonutil.getlocaltime(item.getendtime(),timediff));
map.put("drivername", item.getdrivername());
map.put("startaddress", commonutil.geocoding(string.valueof(item.getstartlatitude()),string.valueof(item.getstartlongitude()),language));
map.put("endaddress", commonutil.geocoding(string.valueof(item.getendlatitude()),string.valueof(item.getendlongitude()),language));
map.put("processstatus", getprocessstatus(item.getprocessstatus(),language));
map.put("processcontext", item.getprocesscontext());
map.put("processtime", commonutil.getlocaltime(item.getprocesstime(),timediff));
datalist.add(map);
}
string filename = "";
if(language==1) {
filename= commonconstants.cn_report_adas;
}else {
filename=commonconstants.en_report_adas;
}
filename=filename+".xlsx";
string fullpath = excelutil.exportexcel(filename,headnamemap,datalist);
return fullpath;
}这里大家可以根据自己的系统自行调整,最后封装成headmap(表头字段)与list<map<string, object>>(数据列表)即可。
到此这篇关于springboot2.x使用poi实现导入数据到excel的文章就介绍到这了,更多相关springboot poi导入数据到excel内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论