深刻Java多線程之JUC鎖(一)--互斥鎖ReentrantLock

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工具庫,在

這裏寫出來記錄,這是積累的必經一步,我會繼續出這個系列文章,分享經驗給你們。歡迎在下面指出錯誤,共同窗習!

!你的點贊是對我最好的支持!!
複製代碼
相關文章
相關標籤/搜索