使用HSSFWorkbook導(dǎo)出、操作excel

在實際開發(fā)中我們經(jīng)常需要導(dǎo)入數(shù)據(jù),統(tǒng)計數(shù)據(jù)输瓜,并且將統(tǒng)計好的數(shù)據(jù)導(dǎo)出excel栗菜,今天分享一個導(dǎo)出學(xué)生信息的方法骡男。
目前赃蛛,比較常用的實現(xiàn)Java導(dǎo)入、導(dǎo)出Excel的技術(shù)有兩種Jakarta POI和Java Excel港粱。
Jakarta POI 是一套用于訪問微軟格式文檔的Java API螃成。Jakarta POI有很多組件組成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF查坪,目前用于操作Excel的HSSF比較成熟寸宏。官方主頁API文檔
使用步驟:

一:下載jar包偿曙,并放在工程的WEB-INF——>lib目錄下

下載地址:http://poi.apache.org/download.html
目前最新版本是4.0氮凝,我使用的是3.9

二:理解HSSFWorkbook的幾種對象:

HSSFWorkbook:excel的工作簿
HSSFSheet:excel的工作表
HSSFRow:excel的行
HSSFCell:excel的單元格
HSSFFont:excel字體
HSSFDataFormat:日期格式
HSSFHeader:sheet頭
樣式:
HSSFCellStyle:單元格樣式
一個Excel的文件對應(yīng)一個工作簿(HSSFWorkbook),一個工作簿可以有多個工作表(我們通惩洌看到的Sheet0罩阵、Sheet1)(HSSFSheet)組成竿秆,一個工作表是由多行(HSSFRow)組成,一行又是由多個單元格(HSSFCell)組成稿壁。

三:定義導(dǎo)出數(shù)據(jù)的請求接口幽钢,一般的業(yè)務(wù)邏輯在這里處理

    /**
     * 導(dǎo)出學(xué)生信息
     * @param request
     * @param response
     * @throws IOException
     */
    @RequestMapping("/studentInfoExcelOut")
    public void studentInfoExcelOut(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        /**獲取導(dǎo)出數(shù)據(jù),實際開發(fā)中這里一般是從數(shù)據(jù)庫查詢的數(shù)據(jù)傅是,
        這里演示是定義了一個實體對象匪燕,然后初始化多個對象,并放進(jìn)我們需要導(dǎo)出的集合里*/
        List<Student> list = new ArrayList<>();
        int sex = 1;
        for(int i = 0 ;i < 10 ;i++){
            if(i%2 == 0){
                sex = 2;
            }
            Student stu = new Student(i+1,"學(xué)生"+(i+1)+"號",sex,18+i,20190001+i,"1998年-"+(i+1)+"月",new Date());
            list.add(stu);
        }
        exportExcelBook(request,response,list);
        return;
    }

由于我們是導(dǎo)出學(xué)生的基礎(chǔ)信息喧笔,所以需要定義一個學(xué)生實體類對象Student.java:

public class Student {
    /**學(xué)生id*/
    private int id;
    /**學(xué)生姓名*/
    private String name;
    /**學(xué)生性別 1:男 2:女*/
    private int sex;
    /**學(xué)生年齡*/
    private int age;
    /**學(xué)生學(xué)號*/
    private int student_no;
    /**學(xué)生出生年月*/
    private String birthday;
    /**學(xué)生創(chuàng)建時間*/
    private Date create_time;

    public Student(int id,String name,int sex,int age,int student_no,String birthday,Date create_time) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.student_no = student_no;
        this.birthday = birthday;
        this.create_time = create_time;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getStudent_no() {
        return student_no;
    }

    public void setStudent_no(int student_no) {
        this.student_no = student_no;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Date getCreate_time() {
        return create_time;
    }

    public void setCreate_time(Date create_time) {
        this.create_time = create_time;
    }
}

四:調(diào)用HSSFWorkbook提供的方法將所需要導(dǎo)出的數(shù)據(jù)導(dǎo)出并生成文件

    /**
     * 導(dǎo)出數(shù)據(jù)生成EXCEL方法
     * @param request
     * @param response
     * @param list
     * @throws IOException
     */
    public void exportExcelBook(HttpServletRequest request, HttpServletResponse response,List<Student> list)
            throws IOException {
        if (CollectionUtils.isEmpty(list)) {
            return;
        }
        //文件名稱帽驯,客戶端傳來的參數(shù),防止中文文件名亂碼參數(shù)編碼因此這里需要解碼
        String fileName = URLDecoder.decode(request.getParameter("fileName"),"UTF-8");
        //創(chuàng)建Excel工作薄對象
        HSSFWorkbook workbook = new HSSFWorkbook();
        //創(chuàng)建Excel工作表對象
        HSSFSheet sheet = workbook.createSheet();
        sheet.setColumnWidth(0, 3000);
        sheet.setColumnWidth(1, 5000);
        sheet.setColumnWidth(2, 4000);
        sheet.setColumnWidth(3, 2500);
        sheet.setColumnWidth(4, 3000);
        sheet.setColumnWidth(5, 6000);
        sheet.setColumnWidth(6, 6000);

        // 設(shè)置表頭字體樣式
        HSSFFont columnHeadFont = workbook.createFont();
        columnHeadFont.setFontName("宋體");
        columnHeadFont.setFontHeightInPoints((short) 10);
        columnHeadFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

        // 列頭的樣式
        HSSFCellStyle columnHeadStyle = workbook.createCellStyle();
        columnHeadStyle.setFont(columnHeadFont);
        // 左右居中
        columnHeadStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 上下居中
        columnHeadStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        columnHeadStyle.setLocked(true);
        columnHeadStyle.setWrapText(true);
        // 左邊框的顏色
        columnHeadStyle.setLeftBorderColor(HSSFColor.BLACK.index);
        // 邊框的大小
        columnHeadStyle.setBorderLeft((short) 1);
        // 右邊框的顏色
        columnHeadStyle.setRightBorderColor(HSSFColor.BLACK.index);
        // 邊框的大小
        columnHeadStyle.setBorderRight((short) 1);
        // 設(shè)置單元格的邊框為粗體
        columnHeadStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        // 設(shè)置單元格的邊框顏色
        columnHeadStyle.setBottomBorderColor(HSSFColor.BLACK.index);
        // 設(shè)置單元格的背景顏色(單元格的樣式會覆蓋列或行的樣式)
        columnHeadStyle.setFillForegroundColor(HSSFColor.WHITE.index);
        // 設(shè)置普通單元格字體樣式
        HSSFFont font = workbook.createFont();
        font.setFontName("宋體");
        font.setFontHeightInPoints((short) 10);

        //創(chuàng)建Excel工作表第一行
        HSSFRow row0 = sheet.createRow(0);
        // 設(shè)置行高
        row0.setHeight((short) 750);
        HSSFCell cell = row0.createCell(0);
        //設(shè)置單元格內(nèi)容
        cell.setCellValue(new HSSFRichTextString("學(xué)生id"));
        //設(shè)置單元格字體樣式
        cell.setCellStyle(columnHeadStyle);
        cell = row0.createCell(1);
        cell.setCellValue(new HSSFRichTextString("姓名"));
        cell.setCellStyle(columnHeadStyle);
        cell = row0.createCell(2);
        cell.setCellValue(new HSSFRichTextString("性別"));
        cell.setCellStyle(columnHeadStyle);
        cell = row0.createCell(3);
        cell.setCellValue(new HSSFRichTextString("年齡"));
        cell.setCellStyle(columnHeadStyle);
        cell = row0.createCell(4);
        cell.setCellValue(new HSSFRichTextString("學(xué)號"));
        cell.setCellStyle(columnHeadStyle);
        cell = row0.createCell(5);
        cell.setCellValue(new HSSFRichTextString("出生年月"));
        cell.setCellStyle(columnHeadStyle);
        cell = row0.createCell(6);
        cell.setCellValue(new HSSFRichTextString("創(chuàng)建時間"));
        cell.setCellStyle(columnHeadStyle);

        // 循環(huán)寫入數(shù)據(jù)
        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            HSSFRow row = sheet.createRow(i + 1);
            cell = row.createCell(0);
            cell.setCellValue(new HSSFRichTextString(String.valueOf(stu.getId())));
            cell.setCellStyle(columnHeadStyle);
            cell = row.createCell(1);
            cell.setCellValue(new HSSFRichTextString(stu.getName()));
            cell.setCellStyle(columnHeadStyle);
            cell = row.createCell(2);
            if(stu.getSex() == 1){
                cell.setCellValue(new HSSFRichTextString("男"));
            }else{
                cell.setCellValue(new HSSFRichTextString("女"));
            }
            cell.setCellStyle(columnHeadStyle);
            cell = row.createCell(3);
            cell.setCellValue(new HSSFRichTextString(String.valueOf(stu.getAge())));
            cell.setCellStyle(columnHeadStyle);
            cell = row.createCell(4);
            cell.setCellValue(new HSSFRichTextString(String.valueOf(stu.getStudent_no())));
            cell.setCellStyle(columnHeadStyle);
            cell = row.createCell(5);
            cell.setCellValue(new HSSFRichTextString(stu.getBirthday()));
            cell.setCellStyle(columnHeadStyle);
            cell = row.createCell(6);
            cell.setCellValue(new HSSFRichTextString());
            cell.setCellStyle(columnHeadStyle);
            cell.setCellValue(new HSSFRichTextString(DateUtils.DateToString(stu.getCreate_time(), "yyyy-MM-dd HH:mm:ss")));
        }
        // 獲取輸出流
        OutputStream os = response.getOutputStream();
        // 重置輸出流
        response.reset();
        // 設(shè)定輸出文件頭
        response.setHeader("Content-disposition",
                "attachment; filename=" + new String(fileName.getBytes("GB2312"), "8859_1") + ".xls");
        // 定義輸出類型
        response.setContentType("application/msexcel");
        workbook.write(os);
        os.close();
        return;
    }

五:網(wǎng)頁調(diào)用導(dǎo)出excel接口

      <a href="javascript:void(0)" onclick="outExcel()">導(dǎo)出學(xué)生信息</a>
      <script>
        function outExcel(){
            var fileName ="學(xué)生信息表";
            //編碼防止中文字符亂碼
            window.location.href=encodeURI("studentInfoExcelOut?fileName="+encodeURIComponent(fileName));
        }
      </script>

六:導(dǎo)出excel截圖:


原文作者技術(shù)博客:http://www.reibang.com/u/ac4daaeecdfe
95后前端妹子一枚书闸,愛閱讀尼变,愛交友,將工作中遇到的問題記錄在這里梗劫,希望給每一個看到的你能帶來一點幫助享甸。
歡迎留言交流截碴。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梳侨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子日丹,更是在濱河造成了極大的恐慌走哺,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,496評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哲虾,死亡現(xiàn)場離奇詭異丙躏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)束凑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,187評論 3 385
  • 文/潘曉璐 我一進(jìn)店門晒旅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人汪诉,你說我怎么就攤上這事废恋。” “怎么了扒寄?”我有些...
    開封第一講書人閱讀 157,091評論 0 348
  • 文/不壞的土叔 我叫張陵鱼鼓,是天一觀的道長。 經(jīng)常有香客問我该编,道長迄本,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,458評論 1 283
  • 正文 為了忘掉前任课竣,我火速辦了婚禮嘉赎,結(jié)果婚禮上置媳,老公的妹妹穿的比我還像新娘。我一直安慰自己公条,他們只是感情好半开,可當(dāng)我...
    茶點故事閱讀 65,542評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赃份,像睡著了一般寂拆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抓韩,一...
    開封第一講書人閱讀 49,802評論 1 290
  • 那天纠永,我揣著相機(jī)與錄音,去河邊找鬼谒拴。 笑死尝江,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的英上。 我是一名探鬼主播炭序,決...
    沈念sama閱讀 38,945評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼苍日!你這毒婦竟也來了惭聂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,709評論 0 266
  • 序言:老撾萬榮一對情侶失蹤相恃,失蹤者是張志新(化名)和其女友劉穎辜纲,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拦耐,經(jīng)...
    沈念sama閱讀 44,158評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡耕腾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,502評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了杀糯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扫俺。...
    茶點故事閱讀 38,637評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖固翰,靈堂內(nèi)的尸體忽然破棺而出狼纬,到底是詐尸還是另有隱情,我是刑警寧澤倦挂,帶...
    沈念sama閱讀 34,300評論 4 329
  • 正文 年R本政府宣布畸颅,位于F島的核電站,受9級特大地震影響方援,放射性物質(zhì)發(fā)生泄漏没炒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,911評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望送火。 院中可真熱鬧拳话,春花似錦、人聲如沸种吸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,744評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坚俗。三九已至镜盯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猖败,已是汗流浹背速缆。 一陣腳步聲響...
    開封第一講書人閱讀 31,982評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留恩闻,地道東北人艺糜。 一個月前我還...
    沈念sama閱讀 46,344評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像幢尚,于是被迫代替她去往敵國和親破停。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,500評論 2 348

推薦閱讀更多精彩內(nèi)容

  • POI操作Excel Excel簡介一個excel文件就是一個工作簿workbook尉剩,一個工作簿中可以創(chuàng)建多張工作...
    灰氣球閱讀 4,705評論 2 48
  • 使用首先需要了解他的工作原理 1.POI結(jié)構(gòu)與常用類 (1)創(chuàng)建Workbook和Sheet (2)創(chuàng)建單元格 (...
    長城ol閱讀 8,409評論 2 25
  • 轉(zhuǎn)自鏈接 3.項目實踐 3.1基于.xls模板生成Excel文件 3.2生成九九乘法表 3.3生成一張工資單 3....
    腿毛褲閱讀 3,436評論 0 0
  • 轉(zhuǎn)自鏈接 目錄 1.認(rèn)識NPOI 2.使用NPOI生成xls文件 2.1創(chuàng)建基本內(nèi)容 2.1.1創(chuàng)建Workboo...
    腿毛褲閱讀 10,484評論 1 3
  • 實習(xí)第二周 No.2 項目功能里要求能夠?qū)⒄故镜膱蟊韺?dǎo)出excel真慢,因為報表的數(shù)據(jù)都是動態(tài)從list傳進(jìn)來的,所...
    蘇筱筑閱讀 2,341評論 2 7