POI:Jakarta POI 是一套用于訪問微軟格式文檔的Java API。Jakarta POI有很多組件組成谱邪,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,在各種組件中目前只有用于操作Excel的HSSF相對成熟喝检。
現(xiàn)在用的比較多的都是用POI技術(shù)來導(dǎo)出或者導(dǎo)入Excel铁追,最近工作需要使用導(dǎo)出Excel文件也祠,所以學(xué)習(xí)了一下插龄,總結(jié)一下POI導(dǎo)出Excel的使用愿棋。
在項目pom.xml中添加坐標(biāo)
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.6</version>
</dependency>
Jakarta POI HSSF API 組件
HSSF用于操作Excel的組件對象,常用對象:
- 常用組件:
- HSSFWorkBook -----excel的文檔對象
- HSSFSheet -----excel表單
- HSSFRow -----excel的行
- HSSFCell -----excel的格子單元(列)
- HSSFFont -----excel的字體
- HSFFDataFormat -----日期格式
- HSSFHeader ------sheet頭
- HSSFFooter -----sheet尾
- 樣式:
- HSSFCellStype -----cell的樣式
基本操作步驟
首先一個Excel文件對應(yīng)一個workbook辫狼,一個workbook中有多個sheet組成初斑,一個sheet是由多個行(row)和列(cell)組成,那么使用順序:
- 用HSSFWorkbook創(chuàng)建一個Excel文件對象
- 用HSSFWorkbook對象創(chuàng)建一個Sheet對象
- 用Sheet對象創(chuàng)建行對象(row)膨处,用行對象得到cell對象(列)
- 對cell對象進(jìn)行讀或?qū)懖僮鳌?/li>
- 將生成的HSSFWorkbook放入HttpServletResponse中響應(yīng)到前端頁面
代碼演示:
public class ExportExcelUtil {
/**
*@Author:hyg
*@Description:導(dǎo)出excel
*@Date:15:06 2020/8/12
*@param: sheetName sheet名稱
*@param: title 標(biāo)題
*@param: values 內(nèi)容
*@param: wb HSSFWorkbook對象
*@return:
*/
public static HSSFWorkbook getHSSFWorkbook(String sheetName,String[] title,String[][] values,HSSFWorkbook wb){
//第一步,創(chuàng)建一個HSSFWorkbook,對應(yīng)一個Excel文件
if (wb==null){
wb=new HSSFWorkbook();
}
//第二步 在workbook中添加一個sheet,對應(yīng)Excel文件中得sheet
HSSFSheet sheet=wb.createSheet(sheetName);
//第三步,在sheet中添加表頭第0 行
HSSFRow row=sheet.createRow(0);
//第四步,創(chuàng)建單元格,設(shè)置表頭居中
HSSFCellStyle stype=wb.createCellStyle();
stype.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//生命列對象
HSSFCell cell=null;
//創(chuàng)建標(biāo)題
for (int i=0;i<title.length;i++){
cell=row.createCell(i);
cell.setCellValue(title[i]);
cell.setCellStyle(stype);
}
//創(chuàng)建內(nèi)容
for (int i=0;i<values.length;i++){
row=sheet.createRow(i+1);
for (int j=0;j<values[i].length;j++){
//將內(nèi)容賦值到列中
row.createCell(j).setCellValue(values[i][j]);
}
}
return wb;
}
public static void setResponseHeader(HttpServletResponse response, String fileName) {
try {
fileName = new String(fileName.getBytes(), "UTF-8");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename="+java.net.URLEncoder.encode(fileName, "UTF-8"));
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static void exportExcel( HttpServletResponse response,String sheetName, String filename,String[] title,String[][] content) {
HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null);
try {
// 響應(yīng)到客戶端
ExcelUtil.setResponseHeader(response, filename);
OutputStream os = response.getOutputStream();
wb.write(os);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
工具類做好后见秤,在業(yè)務(wù)層進(jìn)行數(shù)據(jù)的處理。
service層
List<YggzgwListVO> list=workPostApplyShMapper.selectWorkPostApplyList(query,dw,type,xnxq);
String[] title=new String[]{"崗位名稱","設(shè)崗導(dǎo)師","所需人數(shù)","年級","應(yīng)聘條件及其要求","學(xué)期工作量","計酬標(biāo)準(zhǔn)","學(xué)期津貼總額","備注"};
int point=list.size();
String filename = "工作崗位匯總.xls";
String sheetName = "sheet";
String[][] content = new String[point+1][title.length];
int num = 0;
for (YggzgwListVO yggzgwListVO:list){
content[num][0]=yggzgwListVO.getGwmc();
content[num][1]=yggzgwListVO.getDsxm();
content[num][2]=String.valueOf(yggzgwListVO.getRs()) ;
content[num][3]=yggzgwListVO.getNj();
content[num][4]=yggzgwListVO.getTj();
content[num][5]=yggzgwListVO.getXqgzl();
content[num][6]=String.valueOf(yggzgwListVO.getJcbz());
content[num][7]=yggzgwListVO.getXqjtz().toString();
content[num][8]=yggzgwListVO.getBz();
num++;
}
//導(dǎo)出
ExcelUtil.exportExcel(response,sheetName,filename,title,content);
樣式的設(shè)置
1. 單元格合并
使用HSSFSheet的addMergedRegion()方法
public int addMergedRegion(CellRangeAddress region)
參數(shù)CellRangeAddress 表示合并的區(qū)域真椿,構(gòu)造方法:
CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol)
參數(shù)依次表示:起始行鹃答,截至行,起始列突硝,截至列测摔。
2. 單元格樣式
- 設(shè)置單元格的行高、列寬
HSSFSheet sheet=wb.createSheet();
sheet.setDefaultRowHeightInPoints(10);//設(shè)置缺省列高sheet.setDefaultColumnWidth(20);//設(shè)置缺省列寬
//設(shè)置指定列的列寬解恰,256 * 50這種寫法是因為width參數(shù)單位是單個字符的256分之
sheet.setColumnWidth(cell.getColumnIndex(), 256 * 50);
3. 單元格樣式
首先創(chuàng)建:HSSFCellStyle
HSSFCellStyle cellStyle=wkb.createCellStyle()
操作:
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
設(shè)置單元格的填充方式锋八,以及前景顏色和背景顏色
提示:
如果需要前景顏色或背景顏色,一定要指定填充方式护盈,兩者順序無所謂挟纱;
如果同時存在前景顏色和背景顏色,前景顏色的設(shè)置要寫在前面腐宋;
前景顏色不是字體顏色紊服。
//填充方式
cellStyle.setFillPattern(HSSFCellStyle.DIAMONDS);
//設(shè)置前景色
cellStyle.setFillForegroundColor(HSSFColor.RED.index);
//設(shè)置背景顏色
cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index);
// 設(shè)置單元格底部的邊框及其樣式和顏色
// 這里僅設(shè)置了底邊邊框,左邊框胸竞、右邊框和頂邊框同理可設(shè)欺嗤,關(guān)于參數(shù)自己可以嘗試
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);
cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index);
//設(shè)置日期型數(shù)據(jù)的顯示樣式
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
重要的一步
將樣式應(yīng)用于單元格,注意有些樣式只對單元格起作用
cell.setCellStyle(cellStyle);
row.setRowStyle(cellStyle);
設(shè)置字體樣式
- 創(chuàng)建HSSFFont對象,需要先創(chuàng)建HSSFWorkbook對象
HSSFFont fontStyle = wb.createFont();
字體的各種樣式
//設(shè)置字體樣式
fontStyle.setFontName("宋體");
//設(shè)置字體高度
fontStyle.setFontHeightInPoints((short)20);
//設(shè)置字體顏色
font.setColor(HSSFColor.BLUE.index);
//設(shè)置粗體
fontStyle.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//設(shè)置斜體
font.setItalic(true);
//設(shè)置下劃線
font.setUnderline(HSSFFont.U_SINGLE);
一樣卫枝,設(shè)置號樣式需要手動將它應(yīng)用到單元格
因為字體也是單元格格式的一部分煎饼,所以從屬于HSSFCellStyle,需要將它賦值到HSSFCellStyle的對象里校赤。
// 將字體對象賦值給單元格樣式對象
cellStyle.setFont(font);
// 將單元格樣式應(yīng)用于單元格
cell.setCellStyle(cellStyle);