1.POI簡介
Jakarta POI 是一套用於訪問微軟格式文檔的Java API.
組件HWPF用於操作Word的;
組件HSSF用於操作Excel格式文件.
2.常用組件
HSSFWorkbook -- excel的文檔對象
HSSFSheet -- excel的表單
HSSFRow -- excel的行
HSSFCell -- excel的格子單元
HSSFHeader -- sheet頭
HSSFFooter -- sheet尾(只有打印的時候才能看到效果)
HSSFDataFormat -- 日期格式
HSSFCellStyle -- cell樣式
HSSFFont -- excel字體
HSSFColor -- 顏色
HSSFDateUtil -- 日期
HSSFPrintSetup -- 打印
HSSFErrorConstants -- 錯誤信息表
合併單元格,構造參數依次表示起始行,截止行,起始列,截止列
eg:sheet.addMergedRegion(new CellRangeAddress(0,0,0,3));
設置單元格樣式時,先創建樣式,再指定到單元格。
樣式可指定對齊方式、背景填充方式及顏色、上下左右邊框樣式及顏色
設置單元格的填充方式,以及前景顏色和背景顏色時注意:
a.如果需要前景顏色或背景顏色,一定要指定填充方式,兩者順序無所謂;
b.如果同時存在前景顏色和背景顏色,前景顏色的設置要寫在前面;
c.前景顏色不是字體顏色。
3.結構說明
Excel <-- 一 工作空間(workbook)
workbook <-- 多 工作表(sheet)
sheet <-- 多 行(row) + 多列(cell)
4.操作步驟
a、用HSSFWorkbook打開或者創建Excel文件對象
b、用HSSFWorkbook對象返回或者創建Sheet對象
c、用Sheet對象返回行對象,用行對象得到Cell對象
d、對Cell對象讀寫
5.實例
第一種方法 固定導出字段導出excel;
第二種方法 用配置的方式將導出字段存儲數庫中導出excel,可重用;
pom.xml
<!-- json轉換工具 -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<!-- easypoi 導入導出插件-->
<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導入需要的 -->
<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 {
/**
* 第一種 直接導出excle
* @param req
* @param resp
* @param list 要導出的數據
*/
public void exportExcelWithSimple(HttpServletRequest req,HttpServletResponse resp,List<UserConsumeDetailRecord> list);
/**
* 第二種 根據exportKey查詢出要導出的字段,並匹配list每個類中字段來導出excel,只需維護數據庫,即可實現該方法的重用
* @param exportKey 數據庫中存儲的導出英文名
* @param fileName 文件名
* @param list 要導出的數據
* @param req
* @param resp
*/
public void exportExcelWithDispose(String exportKey,String fileName,List<?> list,HttpServletRequest req,HttpServletResponse resp);
}
ExportExcleServiceImpl.java 實現類
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{
@Autowired
private ExportMapper exportMapper;
@Override
public void exportExcelWithSimple(HttpServletRequest req,HttpServletResponse resp,List<UserConsumeDetailRecord> list){
String fileName = "個人消費明細表" + UUID.randomUUID().toString();
try {
//工作空間
HSSFWorkbook workbook = new HSSFWorkbook();
//第1張工作表
HSSFSheet sheet1 = workbook.createSheet("個人消費明細");
sheet1.setDefaultRowHeightInPoints(20);//行高
sheet1.setDefaultColumnWidth(20);//列寬
//行標題
HSSFRow titleRow = sheet1.createRow(0);
titleRow.createCell(0).setCellValue("個人消費明細表");
sheet1.addMergedRegion(new CellRangeAddress(0,0,0,4));////合併單元格
//行表頭
HSSFRow headRow = sheet1.createRow(sheet1.getLastRowNum() + 1);
headRow.createCell(0).setCellValue("序號");
headRow.createCell(headRow.getLastCellNum()).setCellValue("用戶姓名");
headRow.createCell(headRow.getLastCellNum()).setCellValue("消費金額");
headRow.createCell(headRow.getLastCellNum()).setCellValue("消費時間");
headRow.createCell(headRow.getLastCellNum()).setCellValue("消費項目");
//行表頭單元格設置樣式
for(int h = 0; h < headRow.getLastCellNum() ; h ++) {
headRow.getCell(h).setCellStyle(super.getCellStyle(workbook));
}
//行數據體
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文件寫到磁盤
// FileOutputStream fos = new FileOutputStream(fileName + ".xls");
// workbook.write(fos);
// fos.close();
//從磁盤刪除刪除文件
// super.deleteFileDir(fileName + ".xls");
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public void exportExcelWithDispose(String exportKey,String fileName,List<?> list,HttpServletRequest req,HttpServletResponse resp){
//查詢一表 級聯 獲取多表集合
List<ExportFieldBean> fieldBeanList = exportMapper.getExportByExportKey(exportKey).getFieldBeanList();
try {
//工作空間
HSSFWorkbook workbook = new HSSFWorkbook();
//第1張工作表
HSSFSheet sheet1 = workbook.createSheet("個人消費明細");
sheet1.setDefaultRowHeightInPoints(20);//行高
sheet1.setDefaultColumnWidth(20);//列寬
//行表頭
HSSFRow headRow = sheet1.createRow(0);
headRow.createCell(0).setCellValue("序號");
headRow.getCell(0).setCellStyle(super.getCellStyle(workbook));
//創建行表頭單元格並設置樣式
for(ExportFieldBean fieldBean:fieldBeanList) {
headRow.createCell(headRow.getLastCellNum()).setCellValue(fieldBean.getExportName());//賦值
headRow.getCell(headRow.getLastCellNum()).setCellStyle(super.getCellStyle(workbook));//樣式
}
//創建行數據體
int index = 1;
HSSFRow bodyRow = null;
JSONArray jsonArray = JSONArray.fromObject(list);// --賦值(先轉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 基礎類
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 {
/**
* 獲取設置好的樣式
* @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);//前背景色-天藍
cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index);//後背景色-淺黃
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);//底邊框樣式-傾斜斷點
cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index);//底邊框顏色-暗紅
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));//日期顯示格式
// headRowCellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("@"));
cellStyle.setFont(this.getFont(workbook));//設置字體
return cellStyle;
}
/**
* 獲取設置好的字體
* @param workbook 工作空間
* @return
*/
public HSSFFont getFont(HSSFWorkbook workbook) {
HSSFFont fontStyle = workbook.createFont();
fontStyle.setFontName("宋體");//名稱-宋體
fontStyle.setFontHeightInPoints((short)13);//高度-13
fontStyle.setColor(HSSFColor.WHITE.index);//顏色-白色
fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗
fontStyle.setItalic(true);//斜體
fontStyle.setUnderline(HSSFFont.U_SINGLE);//下劃線
return fontStyle;
}
/**
* 通過流的方式輸出excle到頁面
* @param response 響應
* @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();
}
}
}
}
//刪除單個文件夾
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 {
@Autowired
IExportExcelService 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", "個人消費明細表" + UUID.randomUUID().toString(), list, req, resp);
return "success";
}
}
第二種方法涉及到的建表語句
CREATE TABLE `export` (
`id` int(32) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`export_code` varchar(255) DEFAULT NULL COMMENT '導出主題英文名',
`export_name` varchar(255) DEFAULT NULL COMMENT '導出主題中文名'
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='導出主題表';
CREATE TABLE `export_field` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`export_id` int(11) unsigned DEFAULT NULL COMMENT '導出主表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='導出字段表';