JAVA之POI導(dǎo)出Excel

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的組件對象,常用對象:

  1. 常用組件:
    • HSSFWorkBook -----excel的文檔對象
    • HSSFSheet -----excel表單
    • HSSFRow -----excel的行
    • HSSFCell -----excel的格子單元(列)
    • HSSFFont -----excel的字體
    • HSFFDataFormat -----日期格式
    • HSSFHeader ------sheet頭
    • HSSFFooter -----sheet尾
  2. 樣式:
    • HSSFCellStype -----cell的樣式

基本操作步驟

首先一個Excel文件對應(yīng)一個workbook辫狼,一個workbook中有多個sheet組成初斑,一個sheet是由多個行(row)和列(cell)組成,那么使用順序:

  1. 用HSSFWorkbook創(chuàng)建一個Excel文件對象
  2. 用HSSFWorkbook對象創(chuàng)建一個Sheet對象
  3. 用Sheet對象創(chuàng)建行對象(row)膨处,用行對象得到cell對象(列)
  4. 對cell對象進(jìn)行讀或?qū)懖僮鳌?/li>
  5. 將生成的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è)置字體樣式

  1. 創(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);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末腺占,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子痒谴,更是在濱河造成了極大的恐慌,老刑警劉巖铡羡,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件积蔚,死亡現(xiàn)場離奇詭異,居然都是意外死亡烦周,警方通過查閱死者的電腦和手機尽爆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進(jìn)店門怎顾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漱贱,你說我怎么就攤上這事槐雾。” “怎么了幅狮?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵募强,是天一觀的道長。 經(jīng)常有香客問我崇摄,道長擎值,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任逐抑,我火速辦了婚禮,結(jié)果婚禮上厕氨,老公的妹妹穿的比我還像新娘进每。我一直安慰自己,他們只是感情好命斧,可當(dāng)我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布田晚。 她就那樣靜靜地躺著,像睡著了一般冯丙。 火紅的嫁衣襯著肌膚如雪肉瓦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天胃惜,我揣著相機與錄音泞莉,去河邊找鬼。 笑死船殉,一個胖子當(dāng)著我的面吹牛鲫趁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播利虫,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼挨厚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了糠惫?” 一聲冷哼從身側(cè)響起疫剃,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎硼讽,沒想到半個月后巢价,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年壤躲,在試婚紗的時候發(fā)現(xiàn)自己被綠了城菊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡碉克,死狀恐怖凌唬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情漏麦,我是刑警寧澤客税,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站唁奢,受9級特大地震影響霎挟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜麻掸,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一酥夭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧脊奋,春花似錦熬北、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至久又,卻和暖如春巫延,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背地消。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工炉峰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脉执。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓疼阔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親半夷。 傳聞我的和親對象是個殘疾皇子婆廊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,926評論 2 361