一、导入相关jar包,pom依赖如下:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>RELEASE</version> </dependency>
二、开始撸代码
1.如果导出功能使用的比较多,可以将其做成一个工具类,对我下面贴出的代码进行改造
//结果返回的是写入的记录数(以下用的是自己业务场景数据)
public int downLoadToExcel(OutputStream outputStream,List<PaimaiMoneyVO> paimaiMoneyVOList) {
//文档对象
HSSFWorkbook wb = new HSSFWorkbook();
int rowNum = 0;
Sheet sheet = wb.createSheet("excel的标题");
Row row0 = sheet.createRow(rowNum++);
//因为场景不同,titil不同,可以在外面写成数组当参数传进来
row0.createCell(0).setCellValue("第一列属性名");
row0.createCell(1).setCellValue("第二列属性名");
row0.createCell(2).setCellValue("第三列属性名");
row0.createCell(3).setCellValue("第四列属性名");
row0.createCell(4).setCellValue("第五列属性名");
row0.createCell(5).setCellValue("第六列属性名");
if (paimaiMoneyVOList != null && paimaiMoneyVOList.size() > 0) {
for (PaimaiMoneyVO paimaiMoneyVO : paimaiMoneyVOList) {
Row row = sheet.createRow(rowNum++);
row.createCell(0).setCellValue(paimaiMoneyVO.getPaimaiId());
row.createCell(1).setCellValue(paimaiMoneyVO.getTitle());
row.createCell(2).setCellValue(paimaiMoneyVO.getUsername());
row.createCell(3).setCellValue(paimaiMoneyVO.getMoney()+"元");
row.createCell(4).setCellValue("升价拍");
row.createCell(5).setCellValue(bidder);
}
}
try {
wb.write(outputStream);
LogEnum.LAW_WARE.info("表数据写入到excel表成功,一共写入了"+(rowNum - 1)+"条数据");
outputStream.close();
} catch (IOException e) {
LogEnum.LAW_WARE.error("流关闭异常!", e);
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
LogEnum.LAW_WARE.error("流关闭异常!", e);
}
}
}
return rowNum - 1;
}
2.“工具类”写好后,下面就开始使用它了,从上面的函数参数可以看到,我们需要传过去两个对象,一个是输出流OutPutStream,通过流的方式把excel想要到浏览器,
另外一个就是我们需要导出的对象数组,好了,不解释太多,看代码。(下面的方法写在action层,通过struts.xml配置访问即可实现下载)
public void exportBail(){
this.fileName = "excel文件名";
try {
List<PaimaiMoneyVO> paimaiMoneyVOList = new ArrayList<>();
//下面是我的业务场景获取对象数组
if(paimaiMoneySearchParam!=null){
paimaiMoneySearchParam.setVendorId(WebHelper.getVenderId());
paimaiMoneySearchParam.setPageSize(Constants.AUCTION_WARE_PAGE_SIZE);
paimaiMoneySearchParam.setPage(page);
PaimaiMoneyDto paimaiMoneyDto = auctionWareService1.searchPopPaimaiMoneyList(paimaiMoneySearchParam);
if(paimaiMoneyDto!=null){
int count = paimaiMoneyDto.getCount();
int totalPage = count/ Constants.AUCTION_WARE_PAGE_SIZE + (count% Constants.AUCTION_WARE_PAGE_SIZE > 0?1:0);
for(int i=1;i<=totalPage;i++){
paimaiMoneySearchParam.setPage(i);
PaimaiMoneyDto paimaiMoneyResultResult = auctionWareService1.searchPopPaimaiMoneyList(paimaiMoneySearchParam);
if(paimaiMoneyResultResult!=null){
paimaiMoneyVOList.addAll(paimaiMoneyResultResult.getList());
}
}
}
}
OutputStream outputStream = response.getOutputStream();
response.reset();//清空输出流
//下面是对中文文件名的处理
response.setCharacterEncoding("UTF-8");//设置相应内容的编码格式
//解析浏览器
final String userAgent = request.getHeader("USER-AGENT").toLowerCase();
if(userAgent.contains("firefox")){ //火狐浏览器
fileName = new String(fileName.getBytes(), "ISO8859-1");
}else{
fileName = URLEncoder.encode(fileName, "UTF-8"); //其他浏览器
fileName = fileName.Replace("+", "%20"); //encode后替换,解决空格问题(其中%20是空格在UTF-8下的编码 ,如果不这么写,浏览器会用+代替空格)
}
response.setHeader("Content-Disposition", "attachment;filename=" +fileName + ".xls");//指定输出文件名
response.setContentType("application/msexcel");//定义输出类型
int rouNum = ensurePriceListToExcel(outputStream,paimaiMoneyVOList);
LogEnum.LAW_WARE.info("【RiseAuctionAction.downLoadEnsurePriceExcel】导出成功,一共更新了{"+rouNum+"}条记录");
} catch (Exception e) {
LogEnum.LAW_WARE.error("【RiseAuctionAction.downLoadEnsurePriceExcel】导出失败,error is {}", e);
}
}
三、拓展(详细的工具类开发)
如果你觉得上面写的太简单了,可以继续往下看,我把它整理出了“万能”的工具类,供大家参考。
package com.jd.pop.auction.util.excel;
import com.jd.common.web.result.Result;
import com.jd.pop.auction.util.excel.annotations.ExcelColumn;
import com.jd.pop.auction.util.excel.annotations.ExcelMapping;
import com.jd.pop.auction.util.excel.annotations.apt.ExcelColumnAPT;
import com.jd.pop.auction.util.excel.annotations.apt.ExcelMappingAPT;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.util.CellRangeAddress;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
public class GenerateExcel {
private final static Logger LOG = Logger.getLogger(GenerateExcel.class);
private HSSFWorkbook workbook;
private HSSFCellStyle headStyle;
private HSSFFont headCellFont;
private HSSFCellStyle theadStyle;
private HSSFFont theadCellFont;
private HSSFCellStyle tbodyStyle;
private HSSFFont tbodyCellFont;
private HSSFFont stringFont;
private static final short COLUMN_WIDTH = 15;
private static final short ROW_HEIGHT = 400;
public GenerateExcel() {
this.workbook = new HSSFWorkbook();
//标题
this.headStyle = workbook.createCellStyle();
headStyle.setFillForegroundColor(HSSFColor.GREY_50_PERCENT.index);
headStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
// headStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
// headStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
// headStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
// headStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
headStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// headStyle.setWrapText(true);
this.headCellFont = workbook.createFont();
headCellFont.setFontHeightInPoints((short)13);
headCellFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
headStyle.setFont(headCellFont);
this.theadStyle = workbook.createCellStyle();
theadStyle.setFillForegroundColor(HSSFColor.WHITE.index);
theadStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
theadStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
theadStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
theadStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
theadStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
theadStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
theadCellFont = workbook.createFont();
theadCellFont.setColor(HSSFColor.BLACK.index);
theadCellFont.setFontHeightInPoints((short) 12);
theadCellFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
theadStyle.setFont(theadCellFont);
tbodyStyle = workbook.createCellStyle();
tbodyStyle.setFillForegroundColor(HSSFColor.WHITE.index);
tbodyStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
tbodyStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
tbodyStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
tbodyStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
tbodyStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
tbodyStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
tbodyStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
tbodyCellFont = workbook.createFont();
tbodyCellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
tbodyStyle.setFont(tbodyCellFont);
stringFont = workbook.createFont();
stringFont.setColor(HSSFColor.BLACK.index);
}
public <T> Result export(List<String> titles, Field[] fields, Class clazz, Collection<T> dataset, OutputStream out, boolean pager) {
Result result = new Result(false);
if(pager){
}else{
HSSFSheet sheet = workbook.createSheet( "第一页");
sheet.setDefaultColumnWidth(COLUMN_WIDTH);
sheet.setDefaultRowHeight(ROW_HEIGHT);
//标题
for (int i = 0; i <titles.size(); i++) {
HSSFRow titleRow = sheet.createRow(i);
titleRow.setHeightInPoints(20f);
sheet.addMergedRegion(new CellRangeAddress(i,i,0,fields.length-1));
HSSFCell titleCell =titleRow.createCell(0);
titleCell.setCellValue(titles.get(i));
titleCell.setCellStyle(headStyle);
}
//列名
HSSFRow row = sheet.createRow(titles.size());
for (short i = 0; i < fields.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(theadStyle);
if(fields[i].isAnnotationPresent(ExcelColumn.class)){
ExcelColumn an_1 = fields[i].getAnnotation(ExcelColumn.class);
HSSFRichTextString text = new HSSFRichTextString(an_1.name());
cell.setCellValue(text);
}else if(fields[i].isAnnotationPresent(ExcelMapping.class)){
ExcelMapping an_1 = fields[i].getAnnotation(ExcelMapping.class);
HSSFRichTextString text = new HSSFRichTextString(an_1.name());
cell.setCellValue(text);
}
}
Iterator<T> it = dataset.iterator();
int index = titles.size();
while (it.hasNext()) {
index++;
row = sheet.createRow(index);
T t = (T) it.next();
for (short i = 0; i < fields.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(tbodyStyle);
Field field = fields[i];
try {
String textValue;
if(field.isAnnotationPresent(ExcelMapping.class)){
textValue = new ExcelMappingAPT().getColumnValue(field,t,clazz);
}else{
textValue = new ExcelColumnAPT().getColumnValue(field,t,clazz);
}
cell.setCellValue(textValue);
} catch (NoSuchMethodException e) {
String errorMsg = field.getName() +"字段,第"+ index+ "条数据, NoSuchMethodException 反射错误!";
LOG.error(errorMsg,e);
result.addDefaultModel(errorMsg);
return result;
} catch (IllegalAccessException e) {
String errorMsg = field.getName() +"字段,第"+ index+ "条数据, IllegalAccessException ";
LOG.error(errorMsg,e);
result.addDefaultModel(errorMsg);
return result;
} catch (InvocationTargetException e) {
String errorMsg = field.getName() +"字段,第"+ index+ "条数据, InvocationTargetException ";
LOG.error(errorMsg,e);
result.addDefaultModel(errorMsg);
return result;
}
}
}
}
try {
workbook.write(out);
result.setSuccess(true);
return result;
} catch (IOException e) {
String errorMsg = "将导出数据写入输出流失败!";
LOG.error("将导出数据写入输出流失败! ",e);
result.addDefaultModel(errorMsg);
return result;
}finally {
try {
out.close();
} catch (IOException e) {
String errorMsg = "关闭输出流异常!";
LOG.error("关闭输出流异常! ",e);
result.addDefaultModel(errorMsg);
return result;
}
}
}
}
public class ExportExcelUtils {
private final static Logger LOG = Logger.getLogger(ExportExcelUtils.class);
public static <T> Result export(List<String> titles,List<T> sourceList, OutputStream out, boolean pager){
Result result = new Result(false);
if(CollectionUtils.isEmpty(sourceList)){
result.addDefaultModel("ExportExcelUtils's param sourceList is empty!");
LOG.error("ExportExcelUtils's param sourceList is empty!");
return result;
}
if( out == null){
LOG.error("ExportExcelUtils's param OutputStream is null!");
result.addDefaultModel("ExportExcelUtils's param OutputStream is null!");
return result;
}
Class clazz = null;
Field[] fieldArr = null;
try{
//得到需要转换的列名
clazz = sourceList.get(0).getClass();
Field[] fields = clazz.getDeclaredFields();
List<Field> fieldList = new ArrayList<Field>();
for(Field field:Arrays.asList(fields)){
field.setAccessible(true);
if(field.isAnnotationPresent(ExcelColumn.class)){
fieldList.add(field);
}else if(field.isAnnotationPresent(ExcelMapping.class)){
fieldList.add(field);
}
}
if(CollectionUtils.isEmpty(fieldList)){
LOG.error("实体类中无需要导出的字段!");
result.addDefaultModel("实体类中无需要导出的字段!");
return result;
}
fieldArr = fieldList.toArray(new Field[fieldList.size()]);
}catch(Exception e){
LOG.error("数据拼装异常!");
result.addDefaultModel("数据拼装异常!");
return result;
}
//生成excel
GenerateExcel ge = new GenerateExcel();
return ge.export(titles,fieldArr,clazz,sourceList,out,false);
}
}
这一部分写的比较粗糙,但是实现的比较详细,仅供参考,大家可以稍微改造成为自己独有的utils。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# java
# excel导出功能
# java导出功能
# java导出excel
# java导出功能实现
# Java通过反射将 Excel 解析成对象集合实例
# Java使用excel工具类导出对象功能示例
# Java使用poi做加自定义注解实现对象与Excel相互转换
# 的是
# 类中
# 这一
# 好了
# 太多
# 对我
# 出了
# 将其
# 把它
# 可以看到
# 火狐
# 另外一个
# 会用
# 比较多
# 写在
# 第一页
# 贴出
# 好后
# 如果你觉得
# 清空
相关文章:
网站制作知乎推荐,想做自己的网站用什么工具比较好?
如何在IIS中新建站点并配置端口与IP地址?
建站主机是什么?如何选择适合的建站主机?
h5网站制作工具有哪些,h5页面制作工具有哪些?
建站主机选虚拟主机还是云服务器更好?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
高端网站建设与定制开发一站式解决方案 中企动力
XML的“混合内容”是什么 怎么用DTD或XSD定义
如何选择最佳自助建站系统?快速指南解析优劣
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
建站ABC备案流程中有哪些关键注意事项?
建站上市公司网站建设方案与SEO优化服务定制指南
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
购物网站制作公司有哪些,哪个购物网站比较好?
网站专业制作公司有哪些,做一个公司网站要多少钱?
济南企业网站制作公司,济南社保单位网上缴费步骤?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
为什么Go需要go mod文件_Go go mod文件作用说明
如何快速生成橙子建站落地页链接?
如何在IIS7中新建站点?详细步骤解析
网站网页制作专业公司,怎样制作自己的网页?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
宿州网站制作公司兴策,安徽省低保查询网站?
建站之星导航配置指南:自助建站与SEO优化全解析
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
如何高效生成建站之星成品网站源码?
如何通过虚拟机搭建网站?详细步骤解析
如何有效防御Web建站篡改攻击?
网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?
外贸公司网站制作哪家好,maersk船公司官网?
青岛网站建设如何选择本地服务器?
广平建站公司哪家专业可靠?如何选择?
SQL查询语句优化的实用方法总结
教育培训网站制作流程,请问edu教育网站的域名怎么申请?
如何撰写建站申请书?关键要点有哪些?
成都网站制作公司哪家好,四川省职工服务网是做什么用?
,石家庄四十八中学官网?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
如何在服务器上配置二级域名建站?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
5种Android数据存储方式汇总
如何在阿里云虚拟主机上快速搭建个人网站?
宝塔新建站点报错如何解决?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
c# 在ASP.NET Core中管理和取消后台任务
*请认真填写需求信息,我们会在24小时内与您取得联系。