前言
之前写了一篇使用poi进行docx模板导出的文章,最近呢也使用poi实现excel文件的导出与下载,特此记录。
springboot —— 根据docx填充生成word文件,并导出pdf
环境
- springboot 2.1.4
- poi-tl 1.5.0
依赖引入
再新建的springboot工程项目中,引入下列的依赖即可
<dependency>
<groupid>com.deepoove</groupid>
<artifactid>poi-tl</artifactid>
<version>1.5.0</version>
</dependency>导出excel工具类编写
编写工具类,主要用于表头的创建、单元格样式的定义、以及数据格式的转换等。
import lombok.extern.slf4j.slf4j;
import org.apache.poi.hssf.usermodel.hssfcellstyle;
import org.apache.poi.hssf.usermodel.hssffont;
import org.apache.poi.hssf.util.hssfcolor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.sxssfcell;
import org.apache.poi.xssf.streaming.sxssfrow;
import org.apache.poi.xssf.streaming.sxssfsheet;
import org.apache.poi.xssf.streaming.sxssfworkbook;
import org.apache.poi.xssf.usermodel.xssfrichtextstring;
import javax.servlet.http.httpservletresponse;
import java.io.file;
import java.io.fileoutputstream;
import java.net.urlencoder;
import java.util.list;
import java.util.optional;
@slf4j
public final class excelexport {
/**
* description: 依据excel模板,导出数据excel
* @param sheetname sheet 页名称
* @param headers 数据header部分
* @param datalist table 数据集合
* @param destfile excel模板文件路径
*/
public static void export(string sheetname, string[] headers, list<list<object>> datalist, file destfile) throws exception {
sxssfworkbook workbook = new sxssfworkbook();
createsheet(sheetname, headers, datalist, workbook);
workbook.write(new fileoutputstream(destfile));
}
/**
* 根据header与data的集合,动态地创建并生成excel数据流进行下载操作
* description: 导出excel --- 支持web
* @param sheetname sheet表名字
* @param headers 表头
* @param datalist 表数据
* @param filename 导出文件名
* @param response
*/
public static void export(string sheetname , string[] headers , list<list<object>> datalist ,string filename
, httpservletresponse response) throws exception {
sxssfworkbook workbook = new sxssfworkbook();
createsheet(sheetname, headers, datalist, workbook);
response.reset();
//response.setcontenttype("application/vnd.ms-excel; charset=utf-8");
response.setcontenttype("application/octet-stream; charset=utf-8");
response.setheader("content-disposition", "attachment; filename=" + urlencoder.encode(filename, "utf-8"));
workbook.write(response.getoutputstream());
// 删除临时文件
workbook.dispose();
}
/**
* description: 创建sheet表格
* @param sheetname 表sheet 名字
* @param headers 表头
* @param datalist 表数据
* @param wb
*/
public static void createsheet(string sheetname , string[] headers , list<list<object>> datalist , sxssfworkbook wb) {
sxssfsheet sheet = wb.createsheet(sheetname);
// 设置表头和单元格格式
cellstyle headstyle = setheaderstyle(wb);
cellstyle bodystyle = setbodystyle(wb);
// 创建表头和单元格数据
createheader(headers, sheet, headstyle);
createbody(datalist, sheet, bodystyle,wb);
}
/**
* description: 创建表头
* @param headers
* @param sheet
* @param headstyle
*/
private static void createheader(string[] headers, sxssfsheet sheet, cellstyle headstyle) {
sxssfrow row = sheet.createrow(0);
row.setheightinpoints(16f);
for (int i = 0; i < headers.length; i++) {
// 创建单元格
sxssfcell cell = row.createcell(i);
cell.setcellstyle(headstyle);
xssfrichtextstring text = new xssfrichtextstring(headers[i]);
cell.setcellvalue(text);
sheet.trackallcolumnsforautosizing();
sheet.autosizecolumn(i);
}
}
/**
* description: 表格中填充数据
* @param datalist
* @param sheet
* @param bodystyle
* @param wb 主要是更改文本格式
*/
private static void createbody(list<list<object>> datalist, sxssfsheet sheet, cellstyle bodystyle,sxssfworkbook wb) {
if (datalist == null) {
return;
}
for (int i = 0; i < datalist.size(); i++) {
// 从第二行开始,第一行做表头
sxssfrow row = sheet.createrow(i+1);
list<object> rowlist = datalist.get(i);
if (rowlist == null) {
continue;
}
for (int j = 0; j < rowlist.size(); j++) {
sxssfcell cell = row.createcell(j);
object data = rowlist.get(j);
// 如果数据是 double 类型,则需要保证金额数转换,否则导出数据显示为科学计数法 如: 8e7
if(data instanceof double){
dataformat format= wb.createdataformat();
bodystyle.setdataformat(format.getformat("#,##0.00")); // 千位符
// bodystyle.setdataformat(format.getformat("#0.00")); // 小数
// bodystyle.setdataformat(format.getformat("0.00%")); // 百分比 数据必须是小数,如:0.59 -> 59%
cell.setcellstyle(bodystyle);
cell.setcellvalue(double.parsedouble(string.valueof(data)));
}else{
string textstr = optional.ofnullable(rowlist.get(j)).orelse("").tostring();
xssfrichtextstring text = new xssfrichtextstring(textstr);
cell.setcellvalue(text);
}
sheet.trackallcolumnsforautosizing();
//设置内容列为列的最大值
sheet.autosizecolumn(j);
}
}
}
/**
* description: 设置单元格内容样式
* @param wb
* @return hssfcellstyle
*/
private static cellstyle setbodystyle(sxssfworkbook wb) {
// 设置表格单元格格式
cellstyle style = wb.createcellstyle();
style.setfillforegroundcolor(hssfcolor.white.index);
style.setfillpattern(hssfcellstyle.solid_foreground);
style.setborderbottom(hssfcellstyle.border_thin);
style.setborderleft(hssfcellstyle.border_thin);
style.setborderright(hssfcellstyle.border_thin);
style.setbordertop(hssfcellstyle.border_thin);
style.setalignment(hssfcellstyle.align_left);
// 设置字体格式
font font = wb.createfont();
font.setfontname("宋体");
font.setboldweight(hssffont.boldweight_normal);
style.setfont(font);
return style;
}
/**
* description: 设置表头样式
* @param wb
* @return
* @return hssfcellstyle
*/
private static cellstyle setheaderstyle(sxssfworkbook wb) {
// 设置表格单元格格式
cellstyle style = wb.createcellstyle();
style.setverticalalignment(cellstyle.vertical_center);
style.setborderright(borderstyle.thin);
style.setrightbordercolor(indexedcolors.grey_50_percent.getindex());
style.setborderleft(borderstyle.thin);
style.setleftbordercolor(indexedcolors.grey_50_percent.getindex());
style.setbordertop(borderstyle.thin);
style.settopbordercolor(indexedcolors.grey_50_percent.getindex());
style.setborderbottom(borderstyle.thin);
style.setbottombordercolor(indexedcolors.grey_50_percent.getindex());
// style.setfillbackgroundcolor(indexedcolors.light_yellow.getindex());
style.setfillforegroundcolor(indexedcolors.light_yellow.getindex());
style.setfillpattern(fillpatterntype.solid_foreground);
// 设置字体格式
font font = wb.createfont();
font.setfontname("宋体");
font.setfontheightinpoints((short) 10);
style.setfont(font);
return style;
}
}测试案例
@getmapping("/test-xls")
public void contractintrqrypayxls(httpservletresponse response) throws exception {
string[] headers = new string[]{"编号","名称","金额"};
list<list<object>> datalists = new arraylist<>();
for (int i = 0; i < 10; i++) {
list<object> data = new arraylist<>();
data.add("xj_"+i);
data.add("xiangjiao "+i);
data.add(10000.00*i);
datalists.add(data);
}
excelexport.export("sheetname",headers,datalists,"xiangjiao测试.xls",response);
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论