JavaWEB--POI之EXCEL操作、优化、封装详解系列(一)--概述与原理

鉴于现在博客混杂臃肿,对POI技术讲解得十分不不充分,让本博主在开发优化时遭遇诸多大坑,为了让后人更好制作企业级报表,我将在这一系列详细解说这个以及罗列我所遇到的诸多问题。并且基于强大的POI技术写一个辅助工具库给大家。

本系列的所有代码均可以直接执行,请放心使用。

文章结构:(1)概述;(2)原理(以例子讲解)

先贴出官方地址:POI官网

一、概述:

(一)框架背景:

Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。

Apache POI 是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API。用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件。Apache POI 提供Java操作Excel解决方案(适用于Excel97-2008)。

(二)POI框架的类库:

HSSF - 提供读写Microsoft Excel格式档案的功能。

XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。

HWPF - 提供读写Microsoft Word格式档案的功能。

HSLF - 提供读写Microsoft PowerPoint格式档案的功能。

HDGF - 提供读写Microsoft Visio格式档案的功能。

(三)对比以前的框架JXL:(后面会给出一个jxl的例子)

(1)JXL概述:

通过Jxl,Java可以很方便的操作微软的Excel文档。jxl是一个韩国人写的java操作excel的工具,jExcelAPI对中文支持非常好,API是纯Java的, 并不 依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。 另外需要说明的是,这套API对图形和图表的支持很有限,而且 仅仅识别PNG格式。

(2)两者现状:

jxl现在基本上没被维护了。相反,poi属于Apache开源项目的一部分,更新维护得比较好,同时poi可以支持更高版本的excel,而jxl只能支持excel2003以及之前的版本(局限的数据量)。

小文件使用jxl解析效率比较高,但是因为支持的excel版本的限制,导致不能导出65535以上量级的数据。

(3)JXL使用DEMO:

1)导出JXL的库
<!-- jxl excel导入导出的另一个库 -->
    <dependency>
      <groupId>net.sourceforge.jexcelapi</groupId>
      <artifactId>jxl</artifactId>
      <version>2.6.12</version>
    </dependency>
2)代码实现:
package com.fuzhu.utils;

import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.write.Label;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by 符柱成 on 2017/8/23.
 */
public class JXLTest {

    public static void main(String [] args){
        writeInExcel();
    }
    public static void writeInExcel() {
        //列的标题,把他写进代码,是为了方便管理业务的增删
        List<String> headList = new ArrayList<>();
        headList.add("专线类型");
        headList.add("业务类型");
        headList.add("工单标题");
        headList.add("工单号");
        headList.add("ESOP单号");
        headList.add("来源渠道");

        //(一)路径的拼接(模板文件路径)
        //模板文件流
        String basePath = Thread.currentThread().getContextClassLoader().getResource("").getPath();
        basePath = StringUtils.substringBeforeLast(basePath, "/");
        basePath = StringUtils.substringBeforeLast(basePath, "/");
        basePath = StringUtils.substringBeforeLast(basePath, "/");
        basePath = basePath+"/src/main/webapp/source/";
        File templateFile = new File(basePath + "commonexport.xls");
        //(二)导出的文件流
        String resultFilePath = basePath + "导出的文件名.xls";
        File resultFile = new File(resultFilePath);
        //(三)excel文件对象
        Workbook wb = null;//先初始化一个EXCEL文件
        WorkbookSettings settings = new WorkbookSettings();//以下两行先不要理会,后面会详细解释,这个是关于Linux与wins的区别,关于单元格最大的字符限制
        settings.setWriteAccess(null);
        WritableWorkbook wwb = null;

        try {
            wb = Workbook.getWorkbook(templateFile);
            wwb = Workbook.createWorkbook(resultFile, wb, settings);
            WritableSheet sheet = wwb.createSheet("Sheet1", 0);//excel的工作表格
            //(四)标题栏
            for (int i = 0; i < headList.size(); i++) {//这个是我们导出的模板excel的列数
                Label la = new Label(i, 0, wb.getSheet(0).getCell(i, 0).getContents());
                sheet.addCell(la);
            }
            List<Map<String, String>> dataList=new ArrayList<>();
            sheet.setRowView(0, 300);//设置第一行高度
            //(五)数据准备--假数据
            for (int t=0;t<1000;t++){
                Map<String, String> temp = new HashMap<>();
                temp.put("groupid", String.valueOf(1+t));
                temp.put("productcode", "abc"+String.valueOf(1+t));
                dataList.add(temp);
            }
            //(六)导进excel的数据
            for (int i = 0; i < dataList.size(); i++) {
                Map<String, String> map = dataList.get(i);
                Label C1 = new Label(0, i + 1, map.get("groupid"));//第一个参数指示:第一列
                Label C3 = new Label(2, i + 1, map.get("productcode"));//第一个参数指示:第三列
                sheet.addCell(C1);
                sheet.addCell(C3);
            }
            /*
            (七)导出
            */
            wwb.write();
            wwb.close();
            wb.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

二、原理:

(一)明确组成一个EXCEL文件需要多少对象:

(1)一个excel表格

HSSFWorkbook wb = new HSSFWorkbook();
XSSFWorkbook xb = new XSSFWorkbook();

(2)一个工作表格(sheet):

Sheet sheet = wb.getSheetAt(0);

(3)一行(row):

HSSFRow row1 = sheet.createRow(0);

(4)一个单元格(cell):

Cell cell = cells.next()

(5)单元格格式(cellstyle):

HSSFCellStyle style4 = wb.createCellStyle()

(6)单元格内容格式(HSSFDataFormat ):

HSSFDataFormat format= wb.createDataFormat();

(二)一个例子说明POI解析EXCEL的大致原理:(取自网上已有--一个粗糙例子)取自此文

某管理员要查某层楼有多少人叫什么名字?

1)首先要明确大楼在那里(找到对应的文件)

2)其次要明确是在第几单元(找到对应的sheet)

3)在找到第几层楼(对应的row)

4)敲门问住户户主先生/小姐的姓名(cell)

public class TestA {  
      
    public static void main(String args[]) throws Exception {  
        //找到大楼的位置  
        FileInputStream input = new FileInputStream("d:\\dir.xls");  
        //告诉管理员  
        POIFSFileSystem f = new POIFSFileSystem(input);  
        //走到大楼楼下  
        HSSFWorkbook wb = new HSSFWorkbook(f);  
        //确认自己走到第几单元  
        HSSFSheet sheet = wb.getSheetAt(0);  
        //看一看有没有楼层  
        Iterator rows = sheet.rowIterator();  
        while (rows.hasNext()) {  
            //如果有我们一层层问  
            HSSFRow row = (HSSFRow)rows.next();  
            Iterator cells = row.cellIterator();  
            //如果有人开门  
            while(cells.hasNext()) {  
                //我们一户一户的登记  
                HSSFCell cell = (HSSFCell) cells.next();  
                //是先生还是小姐(对应的数据类型)  
                int cellType = cell.getCellType();  
                System.out.print(getValue(cell,cellType));  
            }  
            System.out.println("");  
        }  
          
    }  

(三)至于EXCEL原理,那太逆天了,这里就不做解释了。给个excel作用连接好了。

EXCEL的逆天作用


源码下载:JavaWEB--POI之EXCEL操作、优化、封装详解系列

POI辅助库下载:POI辅助库

好了,JavaWEB--POI之EXCEL操作、优化、封装详解系列(一)概述与原理讲完了,这是自己设计的第一个Java工具库,在这里写出来记录,这是积累的必经一步,我会继续出这个系列文章,分享经验给大家。欢迎在下面指出错误,共同学习!!你的点赞是对我最好的支持!!

更多内容,可以访问JackFrost的博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容