Java 報表 POI操作Excel

POI操作Excel

  1. Excel簡介

    • 一個excel文件就是一個工作簿workbook认罩,一個工作簿中可以創(chuàng)建多張工作表sheet,而一個工作表中包含多個單元格Cell蹬耘,這些單元格都是由列(Column)行(Row)組成造烁,列用大寫英文字母表示,從A開始到Z共26列躏精,然后再從AA到AZ又26列,再從BA到BZ再26列以此類推鹦肿。行則使用數(shù)字表示矗烛,例如;A3 表示第三行第一列箩溃,E5表示第五行第五列瞭吃。

    • TIM截圖20170820183058.png
  2. POI工具包

    • JAVA中操作Excel的有兩種比較主流的工具包: JXL 和 POI 。jxl 只能操作Excel 95, 97, 2000也即以.xls為后綴的excel涣旨。而poi可以操作Excel 95及以后的版本歪架,即可操作后綴為 .xls 和 .xlsx兩種格式的excel。

    • POI全稱 Poor Obfuscation Implementation,直譯為“可憐的模糊實現(xiàn)”霹陡,利用POI接口可以通過JAVA操作Microsoft office 套件工具的讀寫功能和蚪。官網(wǎng):http://poi.apache.org ,POI支持office的所有版本烹棉,并且在接下來的演示中需要從前端頁面導(dǎo)入用戶上傳的版本不確定的excel文件攒霹,所以選擇POI來講解。

  3. 示例環(huán)境

    • JDK 1.8
    • OS: Windows10
    • POI 3.16
  4. 添加 Maven 依賴

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.16</version>
        </dependency>
    
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.16</version>
        </dependency>
    
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.16</version>
        </dependency>
    
        <!-- https://mvnrepository.com/artifact/org.apache.xmlbeans/xmlbeans -->
        <dependency>
            <groupId>org.apache.xmlbeans</groupId>
            <artifactId>xmlbeans</artifactId>
            <version>2.6.0</version>
        </dependency>
    
        <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    
  5. HelloWorld

    • 07版本前

      • Excel 的工作簿對應(yīng)POI的HSSFWorkbook對象浆洗;
      • Excel 的工作表對應(yīng)POI的HSSFSheet對象催束;
      • Excel 的行對應(yīng)POI的HSSFRow對象;
      • Excel 的單元格對應(yīng)POI的HSSFCell對象伏社。
    • 07版本及07以后版本

      • Excel 的工作簿對應(yīng)POI的XSSFWorkbook對象抠刺;
      • Excel 的工作表對應(yīng)POI的XSSFSheet對象塔淤;
      • Excel 的行對應(yīng)POI的XSSFRow對象;
      • Excel 的單元格對應(yīng)POI的XSSFCell對象矫付。
    • Hello POI

    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /**
     * Created by huangMP on 2017/8/20.
     * decription :
     */
    public class OutputExcelDemo {
    
        /**
         *  從 工作簿中寫入 數(shù)據(jù) OutputExcelDemo
         * 07 版本及之前的版本寫法
         * @throws IOException
         */
        public void outputExcel() throws IOException {
            // 1. 創(chuàng)建工作簿
            HSSFWorkbook workbook = new HSSFWorkbook();
    
            // 2. 創(chuàng)建工作類
            HSSFSheet sheet = workbook.createSheet("hello world");
    
            // 3. 創(chuàng)建行 , 第三行 注意:從0開始
            HSSFRow row = sheet.createRow(2);
    
            // 4. 創(chuàng)建單元格, 第三行第三列 注意:從0開始
            HSSFCell cell = row.createCell(2);
            cell.setCellValue("Hello World");
    
            String fileName = "D:\\huangMP\\Desktop\\OutputExcelDemo.xls";
            FileOutputStream fileOutputSteam = new FileOutputStream(fileName);
    
            workbook.write(fileOutputSteam);
            workbook.close();
    
            fileOutputSteam.close();
        }
    }
    
    • 測試方法
    @Test
    public void outputExcel() throws Exception {
        OutputExcelDemo outputExcelDemo = new OutputExcelDemo();
        outputExcelDemo.outputExcel();
    }
    
  6. 從工作簿(Excel)文件讀取信息

        /**
         * 從 工作簿中讀取 數(shù)據(jù) ReadExcelDemo
         * @throws IOException
         */
        public void readExel() throws IOException {
    
            String fileName = "D:\\huangMP\\Desktop\\OutputExcelDemo.xls";
            FileInputStream fileInputStream = new FileInputStream(fileName);
    
            // 1. 創(chuàng)建工作簿
            HSSFWorkbook workbook = new HSSFWorkbook(fileInputStream);
    
            // 2. 創(chuàng)建工作類
            HSSFSheet sheet = workbook.getSheetAt(0);
    
            // 3. 創(chuàng)建行 , 第三行 注意:從0開始
            HSSFRow row = sheet.getRow(2);
    
            // 4. 創(chuàng)建單元格, 第三行第三列 注意:從0開始
            HSSFCell cell = row.getCell(2);
            String cellString = cell.getStringCellValue();
    
            System.out.println("第三行第三列的值為 : " + cellString );
    
            workbook.close();
            fileInputStream.close();
        }
    
  7. 格式化Excel

    • 在POI中可以利用格式化對象來格式化excel文檔凯沪;也即設(shè)置excel內(nèi)容的樣式。POI中主要的格式化對象常用的有合并單元格买优、設(shè)置單元格字體妨马、邊框,背景顏色等杀赢。
    • 常用設(shè)置
      • 合并單元格
        • 在POI中有一個CellRangeAddress對象,中文直譯是 單元格范圍地址烘跺,主要用于在單元格的合并上,這個對象的構(gòu)造方法CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) 有4個參數(shù)脂崔,分別表示(起始行號滤淳,終止行號, 起始列號砌左,終止列號), 設(shè)置這個對象中要合并的單元格范圍后脖咐,工作表對象sheet調(diào)用方法addMergedRegion(CellRangeAddress region) ,將上述設(shè)置的CellRangeAddress對象作為參數(shù)傳入即可合并單元格汇歹。

        • 設(shè)置單元格樣式

          • 首先要設(shè)置單元格樣式則要先初始化POI中的單元格樣式對象HSSFCellStyle屁擅,然后在樣式對象中設(shè)置不同的樣式(內(nèi)容位置、字體产弹、背景派歌、顏色、邊框等)痰哨。單元格樣式是由工作簿workbook創(chuàng)建的胶果,一個工作簿可以創(chuàng)建多個樣式。
            • 設(shè)置單元格內(nèi)容位置斤斧;設(shè)置水平位置 setAlignment(short align) 早抠,設(shè)置垂直位置setVerticalAlignment(short align)
            • 設(shè)置單元格字體;POI中的字體對象為HSSFFont撬讽,字體是由工作簿創(chuàng)建蕊连,可以用于多個單元格上。
            • 設(shè)置單元格背景色锐秦。
    • 示例代碼
      public void testExcelStyle() throws IOException {
          // 1. 創(chuàng)建工作簿
          HSSFWorkbook workbook = new HSSFWorkbook();
          // 1.1 創(chuàng)建單元格對象 合并第三行第三列到5列
          // 構(gòu)造參數(shù) 起始行號 結(jié)束行號 起始列號 結(jié)束列號
          CellRangeAddress cellRangeAddress = new CellRangeAddress(
                  2, 2, 2, 4 );
          // 1.2 創(chuàng)建單元格樣式
          HSSFCellStyle style = workbook.createCellStyle();
          style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
          style.setAlignment(HSSFCellStyle.VERTICAL_CENTER);
      
          // 1.3 創(chuàng)建字體
          HSSFFont font = workbook.createFont();
          font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
          font.setFontHeightInPoints((short)16);
          // 將字體加載到樣式中
          style.setFont(font);
      
          // 1.4 設(shè)置背景色為黃色
          // 1.4.1 設(shè)置填充模式
          style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
          style.setFillBackgroundColor(HSSFColor.YELLOW.index);
          style.setFillForegroundColor(HSSFColor.GREEN.index);
      
          // 2. 創(chuàng)建工作類
          HSSFSheet sheet = workbook.createSheet("hello world");
          // 2.1 加入合并單元格對象
          sheet.addMergedRegion(cellRangeAddress);
      
          // 3. 創(chuàng)建行 , 第三行 注意:從0開始
          HSSFRow row = sheet.createRow(2);
      
          // 4. 創(chuàng)建單元格, 第三行第三列 注意:從0開始
          HSSFCell cell = row.createCell(2);
          cell.setCellValue("Hello World");
          // 4.1 單元格添加樣式
          cell.setCellStyle(style);
      
          String fileName = "D:\\huangMP\\Desktop\\HelloExcelStyle.xls";
          FileOutputStream fileOutputSteam = new FileOutputStream(fileName);
      
          workbook.write(fileOutputSteam);
          workbook.close();
      
          fileOutputSteam.close();
      
      }
      
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咪奖,一起剝皮案震驚了整個濱河市盗忱,隨后出現(xiàn)的幾起案子酱床,更是在濱河造成了極大的恐慌,老刑警劉巖趟佃,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扇谣,死亡現(xiàn)場離奇詭異昧捷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)罐寨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門靡挥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鸯绿,你說我怎么就攤上這事跋破。” “怎么了瓶蝴?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵毒返,是天一觀的道長。 經(jīng)常有香客問我舷手,道長拧簸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任男窟,我火速辦了婚禮盆赤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘歉眷。我一直安慰自己牺六,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布姥芥。 她就那樣靜靜地躺著兔乞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凉唐。 梳的紋絲不亂的頭發(fā)上庸追,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音台囱,去河邊找鬼淡溯。 笑死,一個胖子當(dāng)著我的面吹牛簿训,可吹牛的內(nèi)容都是我干的咱娶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼强品,長吁一口氣:“原來是場噩夢啊……” “哼膘侮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起的榛,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤琼了,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雕薪,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡昧诱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了所袁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盏档。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖燥爷,靈堂內(nèi)的尸體忽然破棺而出蜈亩,到底是詐尸還是另有隱情,我是刑警寧澤前翎,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布勺拣,位于F島的核電站,受9級特大地震影響鱼填,放射性物質(zhì)發(fā)生泄漏药有。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一苹丸、第九天 我趴在偏房一處隱蔽的房頂上張望愤惰。 院中可真熱鬧,春花似錦赘理、人聲如沸宦言。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奠旺。三九已至,卻和暖如春施流,著一層夾襖步出監(jiān)牢的瞬間响疚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工瞪醋, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留忿晕,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓银受,卻偏偏與公主長得像践盼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子宾巍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

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

  • 使用首先需要了解他的工作原理 1.POI結(jié)構(gòu)與常用類 (1)創(chuàng)建Workbook和Sheet (2)創(chuàng)建單元格 (...
    長城ol閱讀 8,439評論 2 25
  • 該文章為本系列的第一篇第二篇為 : Java POI操作Excel(Event Model)第三篇為 : Java...
    mmlmml閱讀 13,416評論 6 21
  • 轉(zhuǎn)自鏈接 目錄 1.認(rèn)識NPOI 2.使用NPOI生成xls文件 2.1創(chuàng)建基本內(nèi)容 2.1.1創(chuàng)建Workboo...
    腿毛褲閱讀 10,582評論 1 3
  • 實習(xí)第二周 No.2 項目功能里要求能夠?qū)⒄故镜膱蟊韺?dǎo)出excel咕幻,因為報表的數(shù)據(jù)都是動態(tài)從list傳進(jìn)來的,所...
    蘇筱筑閱讀 2,367評論 2 7
  • Maven依賴 Excel2003或更早的版本 Excel2007或更新的版本 Apache POI里面的基本概念...
    字伯約閱讀 2,165評論 0 3