深入Java多线程之JUC锁(一)--互斥锁ReentrantLock

一、概述:

(一)框架背景:

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的库

<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();
     }
    复制代码

    } }

二、原理: (一)明确组成一个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工具库,在

这里写出来记录,这是积累的必经一步,我会继续出这个系列文章,分享经验给大家。欢迎在下面指出错误,共同学习!

!你的点赞是对我最好的支持!!
复制代码

转载于:https://juejin.im/post/5ce4fcbaf265da1bd4245693

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值