springboot中使用poi导出excel文件(亲测实现了第一个功能)
1.POI簡(jiǎn)介
Jakarta POI 是一套用于訪問(wèn)微軟格式文檔的Java API.
組件HWPF用于操作Word的;
組件HSSF用于操作Excel格式文件.
2.常用組件
HSSFWorkbook -- excel的文檔對(duì)象
HSSFSheet -- excel的表單
HSSFRow -- excel的行
HSSFCell -- excel的格子單元
HSSFHeader -- sheet頭
HSSFFooter -- sheet尾(只有打印的時(shí)候才能看到效果)
HSSFDataFormat -- 日期格式
HSSFCellStyle -- cell樣式
HSSFFont -- excel字體
HSSFColor -- 顏色
HSSFDateUtil -- 日期
HSSFPrintSetup -- 打印
HSSFErrorConstants -- 錯(cuò)誤信息表
合并單元格,構(gòu)造參數(shù)依次表示起始行,截止行,起始列,截止列
eg:sheet.addMergedRegion(new CellRangeAddress(0,0,0,3));
設(shè)置單元格樣式時(shí),先創(chuàng)建樣式,再指定到單元格。
樣式可指定對(duì)齊方式、背景填充方式及顏色、上下左右邊框樣式及顏色
設(shè)置單元格的填充方式,以及前景顏色和背景顏色時(shí)注意:
a.如果需要前景顏色或背景顏色,一定要指定填充方式,兩者順序無(wú)所謂;
b.如果同時(shí)存在前景顏色和背景顏色,前景顏色的設(shè)置要寫(xiě)在前面;
c.前景顏色不是字體顏色。
3.結(jié)構(gòu)說(shuō)明
Excel <-- 一 工作空間(workbook)
workbook <-- 多 工作表(sheet)
sheet <-- 多 行(row) + 多列(cell)
4.操作步驟
a、用HSSFWorkbook打開(kāi)或者創(chuàng)建Excel文件對(duì)象
b、用HSSFWorkbook對(duì)象返回或者創(chuàng)建Sheet對(duì)象
c、用Sheet對(duì)象返回行對(duì)象,用行對(duì)象得到Cell對(duì)象
d、對(duì)Cell對(duì)象讀寫(xiě)
5.實(shí)例
第一種方法 固定導(dǎo)出字段導(dǎo)出excel;
第二種方法 用配置的方式將導(dǎo)出字段存儲(chǔ)數(shù)庫(kù)中導(dǎo)出excel,可重用;
pom.xml
<!-- json轉(zhuǎn)換工具 --><dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.4</version><classifier>jdk15</classifier></dependency><!-- easypoi 導(dǎo)入導(dǎo)出插件--><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>3.0.3</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>3.0.3</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>3.0.3</version></dependency><!-- POI,excel導(dǎo)入需要的 --> <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version></dependency><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version></dependency>IExportExcleService.java? ?接口
package com.wulss.jakartapoi.hssf;import java.util.List;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public interface IExportExcelService {/*** 第一種 直接導(dǎo)出excle* @param req* @param resp* @param list 要導(dǎo)出的數(shù)據(jù)*/public void exportExcelWithSimple(HttpServletRequest req,HttpServletResponse resp,List<UserConsumeDetailRecord> list);/*** 第二種 根據(jù)exportKey查詢出要導(dǎo)出的字段,并匹配list每個(gè)類中字段來(lái)導(dǎo)出excel,只需維護(hù)數(shù)據(jù)庫(kù),即可實(shí)現(xiàn)該方法的重用* @param exportKey 數(shù)據(jù)庫(kù)中存儲(chǔ)的導(dǎo)出英文名* @param fileName 文件名* @param list 要導(dǎo)出的數(shù)據(jù)* @param req* @param resp*/public void exportExcelWithDispose(String exportKey,String fileName,List<?> list,HttpServletRequest req,HttpServletResponse resp); }ExportExcleServiceImpl.java? 實(shí)現(xiàn)類
package com.wulss.jakartapoi.hssf;import java.text.SimpleDateFormat; import java.util.List; import java.util.UUID;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;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.util.CellRangeAddress; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import net.sf.json.JSONArray; import net.sf.json.JSONObject;@Service public class ExportExcelServiceImpl extends ExportExcelBaseService implements IExportExcelService{@Autowiredprivate ExportMapper exportMapper;@Overridepublic void exportExcelWithSimple(HttpServletRequest req,HttpServletResponse resp,List<UserConsumeDetailRecord> list){String fileName = "個(gè)人消費(fèi)明細(xì)表" + UUID.randomUUID().toString();try { //工作空間HSSFWorkbook workbook = new HSSFWorkbook();//第1張工作表HSSFSheet sheet1 = workbook.createSheet("個(gè)人消費(fèi)明細(xì)"); sheet1.setDefaultRowHeightInPoints(20);//行高sheet1.setDefaultColumnWidth(20);//列寬//行標(biāo)題HSSFRow titleRow = sheet1.createRow(0);titleRow.createCell(0).setCellValue("個(gè)人消費(fèi)明細(xì)表");sheet1.addMergedRegion(new CellRangeAddress(0,0,0,4));合并單元格//行表頭HSSFRow headRow = sheet1.createRow(sheet1.getLastRowNum() + 1);headRow.createCell(0).setCellValue("序號(hào)");headRow.createCell(headRow.getLastCellNum()).setCellValue("用戶姓名");headRow.createCell(headRow.getLastCellNum()).setCellValue("消費(fèi)金額");headRow.createCell(headRow.getLastCellNum()).setCellValue("消費(fèi)時(shí)間");headRow.createCell(headRow.getLastCellNum()).setCellValue("消費(fèi)項(xiàng)目");//行表頭單元格設(shè)置樣式for(int h = 0; h < headRow.getLastCellNum() ; h ++) {headRow.getCell(h).setCellStyle(super.getCellStyle(workbook));}//行數(shù)據(jù)體int index = 1;HSSFRow bodyRow = null;for(UserConsumeDetailRecord bean:list) {bodyRow = sheet1.createRow(sheet1.getLastRowNum() + 1);bodyRow.createCell(0).setCellValue(index ++ );bodyRow.createCell(bodyRow.getLastCellNum()).setCellValue(bean.getUserName());bodyRow.createCell(bodyRow.getLastCellNum()).setCellValue(bean.getConsumeAmount());bodyRow.createCell(bodyRow.getLastCellNum()).setCellValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(bean.getConsumeDate()));//.split("\\.")[0]bodyRow.createCell(bodyRow.getLastCellNum()).setCellValue(bean.getConsumeTitle());}//輸出super.outExcelStream(resp, workbook, fileName);//將生成的excel文件寫(xiě)到磁盤(pán) // FileOutputStream fos = new FileOutputStream(fileName + ".xls"); // workbook.write(fos); // fos.close();//從磁盤(pán)刪除刪除文件 // super.deleteFileDir(fileName + ".xls");}catch(Exception e){e.printStackTrace();}}@Overridepublic void exportExcelWithDispose(String exportKey,String fileName,List<?> list,HttpServletRequest req,HttpServletResponse resp){//查詢一表 級(jí)聯(lián) 獲取多表集合List<ExportFieldBean> fieldBeanList = exportMapper.getExportByExportKey(exportKey).getFieldBeanList();try { //工作空間HSSFWorkbook workbook = new HSSFWorkbook();//第1張工作表HSSFSheet sheet1 = workbook.createSheet("個(gè)人消費(fèi)明細(xì)"); sheet1.setDefaultRowHeightInPoints(20);//行高sheet1.setDefaultColumnWidth(20);//列寬//行表頭HSSFRow headRow = sheet1.createRow(0);headRow.createCell(0).setCellValue("序號(hào)");headRow.getCell(0).setCellStyle(super.getCellStyle(workbook));//創(chuàng)建行表頭單元格并設(shè)置樣式for(ExportFieldBean fieldBean:fieldBeanList) {headRow.createCell(headRow.getLastCellNum()).setCellValue(fieldBean.getExportName());//賦值headRow.getCell(headRow.getLastCellNum()).setCellStyle(super.getCellStyle(workbook));//樣式}//創(chuàng)建行數(shù)據(jù)體int index = 1;HSSFRow bodyRow = null;JSONArray jsonArray = JSONArray.fromObject(list);// --賦值(先轉(zhuǎn)json, 再賦值, 通用性高)for(Object obj:jsonArray) {bodyRow = sheet1.createRow(sheet1.getLastRowNum() + 1);bodyRow.createCell(0).setCellValue(index ++ );for(ExportFieldBean fieldBean:fieldBeanList) {bodyRow.createCell(bodyRow.getLastCellNum()).setCellValue(((JSONObject)obj).get(fieldBean.getExportCode()) + "");//賦值 // bodyRow.getCell(bodyRow.getLastCellNum()).setCellStyle(super.getCellStyle(workbook));//樣式}}//輸出super.outExcelStream(resp, workbook, fileName);}catch(Exception e){e.printStackTrace();}}}ExportExcelBaseService.java 基礎(chǔ)類
package com.wulss.jakartapoi.hssf;import java.io.File; import java.io.IOException; import java.io.OutputStream;import javax.servlet.http.HttpServletResponse;import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFDataFormat; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.stereotype.Component;@Component public class ExportExcelBaseService {/*** 獲取設(shè)置好的樣式* @param workbook 工作空間* @return*/public HSSFCellStyle getCellStyle(HSSFWorkbook workbook) {HSSFCellStyle cellStyle = workbook.createCellStyle();cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//單元格-垂直居中cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//單元格-水平居中cellStyle.setFillPattern(HSSFCellStyle.DIAMONDS);//背景色-方塊填充cellStyle.setFillForegroundColor(HSSFColor.SKY_BLUE.index);//前背景色-天藍(lán)cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index);//后背景色-淺黃cellStyle.setBorderBottom(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);//底邊框樣式-傾斜斷點(diǎn) cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index);//底邊框顏色-暗紅cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));//日期顯示格式 // headRowCellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("@"));cellStyle.setFont(this.getFont(workbook));//設(shè)置字體return cellStyle;}/*** 獲取設(shè)置好的字體* @param workbook 工作空間* @return*/public HSSFFont getFont(HSSFWorkbook workbook) {HSSFFont fontStyle = workbook.createFont(); fontStyle.setFontName("宋體");//名稱-宋體fontStyle.setFontHeightInPoints((short)13);//高度-13fontStyle.setColor(HSSFColor.WHITE.index);//顏色-白色fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗fontStyle.setItalic(true);//斜體fontStyle.setUnderline(HSSFFont.U_SINGLE);//下劃線return fontStyle;}/*** 通過(guò)流的方式輸出excle到頁(yè)面* @param response 響應(yīng)* @param workbook 工作空間* @param fileName 文件名*/public void outExcelStream(HttpServletResponse response, Workbook workbook, String fileName){OutputStream os = null;try {os = response.getOutputStream();response.setContentType("application/x-download");response.setCharacterEncoding("UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + new String(fileName.getBytes(), "ISO8859-1") + ".xls");workbook.write(os);os.flush();}catch (Exception e) {e.printStackTrace();}finally {if(os!=null){try {os.close();} catch (IOException e) {e.printStackTrace();}}}}//刪除單個(gè)文件夾public void deleteFileDir(String fileName) { File file = new File(fileName); DeleteAll(file);}public void DeleteAll(File dir) {if (dir.isFile()) {dir.delete();return;} else {File[] files = dir.listFiles();for (File file : files) {DeleteAll(file);}}dir.delete();} }ExportExcelController.java
package com.wulss.jakartapoi.hssf;import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.UUID;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController;@RestController @RequestMapping("/exportExlce") public class ExportExcelController {@AutowiredIExportExcelService iExportExcelService;@RequestMapping(value="/withSimple",method=RequestMethod.GET)public String withSimple(HttpServletRequest req,HttpServletResponse resp) {List<UserConsumeDetailRecord> list = new ArrayList<>();UserConsumeDetailRecord record = null;for(int i=0;i<10;i++) {record = new UserConsumeDetailRecord();record.setUserName("奧雷里亞諾");record.setConsumeAmount(6.66);record.setConsumeDate(new Date());record.setConsumeTitle("喝酒吃肉");list.add(record);}iExportExcelService.exportExcelWithSimple(req, resp, list);return "success";}@RequestMapping(value="/withDispose",method=RequestMethod.GET)public String WithDispose(HttpServletRequest req,HttpServletResponse resp) {List<UserConsumeDetailRecord> list = new ArrayList<>();UserConsumeDetailRecord record = null;for(int i=0;i<10;i++) {record = new UserConsumeDetailRecord();record.setUserName("奧雷里亞諾");record.setConsumeAmount(6.66);record.setConsumeDate(new Date());record.setConsumeTitle("喝酒吃肉");list.add(record);}iExportExcelService.exportExcelWithDispose("consume_detail", "個(gè)人消費(fèi)明細(xì)表" + UUID.randomUUID().toString(), list, req, resp);return "success";} }第二種方法涉及到的建表語(yǔ)句
CREATE TABLE `export` (`id` int(32) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',`export_code` varchar(255) DEFAULT NULL COMMENT '導(dǎo)出主題英文名',`export_name` varchar(255) DEFAULT NULL COMMENT '導(dǎo)出主題中文名'PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='導(dǎo)出主題表';CREATE TABLE `export_field` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',`export_id` int(11) unsigned DEFAULT NULL COMMENT '導(dǎo)出主表ID',`field_code` varchar(55) DEFAULT NULL COMMENT '字段英文名',`field_name` varchar(64) DEFAULT NULL COMMENT '字段中文名',`sort` int(11) unsigned DEFAULT '1' COMMENT '排序字段'PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='導(dǎo)出字段表';數(shù)據(jù)截圖
表一
表二
涉及到的 UserConsumeDetailRecord.java 、ExportBean.java、ExportFieldBean.java、ExportMapper.java等,mybatis映射文件就不貼出來(lái)了
/*** * @Descript TODO (用戶消費(fèi)實(shí)體)* @author Administrator* @date 2019年5月24日**/ public class UserConsumeDetailRecord {private int id;private int userId;private String userName;private String userTel;private String consumeTitle;private Date consumeDate;private Double consumeAmount;public int getId() {return id;}public void setId(int id) {this.id = id;}public int getUserId() {return userId;}public void setUserId(int userId) {this.userId = userId;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getUserTel() {return userTel;}public void setUserTel(String userTel) {this.userTel = userTel;}public String getConsumeTitle() {return consumeTitle;}public void setConsumeTitle(String consumeTitle) {this.consumeTitle = consumeTitle;}public Date getConsumeDate() {return consumeDate;}public void setConsumeDate(Date consumeDate) {this.consumeDate = consumeDate;}public Double getConsumeAmount() {return consumeAmount;}public void setConsumeAmount(Double consumeAmount) {this.consumeAmount = consumeAmount;} } /*** * @Descript TODO (導(dǎo)出主題表)* @author Administrator* @date 2019年5月27日**/ public class ExportBean {private Integer id;private String exportCode;private String exportName;private List<ExportFieldBean> fieldBeanList;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getExportCode() {return exportCode;}public void setExportCode(String exportCode) {this.exportCode = exportCode;}public String getExportName() {return exportName;}public void setExportName(String exportName) {this.exportName = exportName;}public List<ExportFieldBean> getFieldBeanList() {return fieldBeanList;}public void setFieldBeanList(List<ExportFieldBean> fieldBeanList) {this.fieldBeanList = fieldBeanList;} } /*** * @Descript TODO (導(dǎo)出字段表)* @author Administrator* @date 2019年5月27日**/ public class ExportFieldBean {private Integer id;private Integer exportId;private String exportCode;private String exportName;private Integer sort;private ExportBean exportBean;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public Integer getExportId() {return exportId;}public void setExportId(Integer exportId) {this.exportId = exportId;}public String getExportCode() {return exportCode;}public void setExportCode(String exportCode) {this.exportCode = exportCode;}public String getExportName() {return exportName;}public void setExportName(String exportName) {this.exportName = exportName;}public Integer getSort() {return sort;}public void setSort(Integer sort) {this.sort = sort;}public ExportBean getExportBean() {return exportBean;}public void setExportBean(ExportBean exportBean) {this.exportBean = exportBean;} } @Mapper public interface ExportMapper {ExportBean getExportByExportKey(String exportKey); }其他更詳細(xì)的可以參考此文章Java POI 導(dǎo)出EXCEL經(jīng)典實(shí)現(xiàn) Java導(dǎo)出Excel - DawnHeaven - 博客園
來(lái)源:springboot中使用poi導(dǎo)出excel文件 - 五柳先生柳三變 - 博客園
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的springboot中使用poi导出excel文件(亲测实现了第一个功能)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java中List for循环的6种写法
- 下一篇: stream的常见方法操作(亲测)