1、概述:java
(一)框架背景:web
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。apache
Apache POI 是建立和维护操做各类符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API。用它能够使用Java读取和建立,修改MS Excel文件.并且,还能够使用Java读取和建立MS Word和MSPowerPoint文件。Apache POI 提供Java操做Excel解决方案(适用于Excel97-2008)。api
(二)POI框架的类库:app
HSSF - 提供读写Microsoft Excel格式档案的功能。框架
XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。webapp
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的库
<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 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();
}
复制代码
} }
2、原理: (一)明确组成一个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做用链接好了。
好了,JavaWEB--POI之EXCEL操做、优化、封装详解系列(一)概述与原理讲完了,这是本身设计的第一个Java工具库,在
这里写出来记录,这是积累的必经一步,我会继续出这个系列文章,分享经验给你们。欢迎在下面指出错误,共同窗习!
!你的点赞是对我最好的支持!!
复制代码