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工具庫,在
這裏寫出來記錄,這是積累的必經一步,我會繼續出這個系列文章,分享經驗給你們。歡迎在下面指出錯誤,共同窗習!
!你的點贊是對我最好的支持!!
複製代碼