关于java:来通过-Excel-来认识神器POI

1、POI是什么

Apache POI – the Java API for Microsoft Documents,顾名思义,Apache的三方包,用来操作微软office文档的,少数时候用来操作excel,所以这里就以excel方面来阐明。

须要引入两个包,maven地址如下(version 3.9):

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.9</version>
</dependency>


<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.9</version>
</dependency>

POI的组件列表中,针对excel的次要是HSSF和XSSF组件,前者针对97-2007的通用版excel,即后缀xls;后者针对2007或更高版的excel,即后缀xlsx。官网概要如下:

HSSF is the POI Project's pure Java implementation of the Excel '97(-2007) file format. 
XSSF is the POI Project's pure Java implementation of the Excel 2007 OOXML (.xlsx) file format.

2、POI外围类

面向对象面向对象,既然如此,天然去找找一些能示意excel中内容的类。

2.1 工作簿 Workbook

创立或保护Excel工作簿的所有类的超接口,Workbook,属于org.apache.poi.ss.usermodel包。其下有两个实现类:

  • HSSFWorkbook : 有读取.xls 格局和写入Microsoft Excel文件的办法。它与微软Office97-2003版本兼容
  • XSSFWorkbook : 有读写Microsoft Excel和OpenOffice的XML文件的格局.xls或.xlsx的办法。它与MS-Office版本2007或更高版本兼容

所以在针对不同版本的excel时,须要对应以上应用不同的Workbook。构造函数中,罕用的:

HSSFWorkbook

HSSFWorkbook()
HSSFWorkbook(java.io.InputStream s)

XSSFWorkbook

XSSFWorkbook()
XSSFWorkbook(java.io.File file)
XSSFWorkbook(java.io.InputStream is)

2.2 标签页 Sheet

HSSFSheetXSSFSheet 都是Sheet接口的实现类,Sheet能够应用Workbook的两个办法取得:

workbook.createSheet();
workbook.createSheet(String sheetName);

2.3 行 Row

同理,Row是 HSSFRowXSSFRow 的接口,通过Sheet获取:

sheet.createRow(int rownum);

2.4 单元格 Cell

同理,Cell是 HSSFCellXSSFCell 的接口,通过Row获取:

row.createCell(int column);
row.createCell(int column, int type);

3、创立和读取

其实如果能了解面向对象,就很简略了,另外包含字体,公式,超链接等,都有对应的封装类,此处只提出了外围的几个,须要理解更多的须要自行开展。

例子的话,间接从他人教程里摘出来吧,另,读取的workbook,能够debug瞅瞅内容。

3.1 创立空白工作簿

import java.io.*;
import org.apache.poi.xssf.usermodel.*;
public class CreateWorkBook 
{
   public static void main(String[] args)throws Exception 
   {
      
      XSSFWorkbook workbook = new XSSFWorkbook(); 
      
      FileOutputStream out = new FileOutputStream(
      new File("createworkbook.xlsx"));
      
      workbook.write(out);
      out.close();
      System.out.println("
      createworkbook.xlsx written successfully");
   }
}

3.2 关上现有的工作簿

import java.io.*;
import org.apache.poi.xssf.usermodel.*;
public class OpenWorkBook
{
   public static void main(String args[])throws Exception
   { 
      File file = new File("openworkbook.xlsx");
      FileInputStream fIP = new FileInputStream(file);
      
      XSSFWorkbook workbook = new XSSFWorkbook(fIP);
      if(file.isFile() && file.exists())
      {
         System.out.println(
         "openworkbook.xlsx file open successfully.");
      }
      else
      {
         System.out.println(
         "Error to open openworkbook.xlsx file.");
      }
   }
}

3.3、任意对象List转至为Excel文档

可用注解定义标签名和列名,写了个办法,能够将某个类的List转换为对应的Excel文档,列名如果在不应用注解的状况下默认为属性名:

类:

@Excel(name = "学生标签页")
public class Student {

    @Excel(name = "姓名")
    private String name;

    private boolean male;

    @Excel(name = "身高")
    private int height;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public boolean isMale() {
        return male;
    }

    public void setMale(boolean male) {
        this.male = male;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }
}

测试方法:

public static void main(String[] args) {
    List<Student> list = new ArrayList<Student>();
    Student student1 = new Student();
    student1.setName("小红");
    student1.setMale(false);
    student1.setHeight(167);

    Student student2 = new Student();
    student2.setName("小明");
    student2.setMale(true);
    student2.setHeight(185);

    list.add(student1);
    list.add(student2);

    File file = new File("C:/Users/Dulk/Desktop/1314.xls");
    createExcel(list, file);
}

输入后果:

注解:

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;


@Retention(RetentionPolicy.RUNTIME)
public @interface Excel {
    
    public String name() default "";
}

办法:

import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;


public class ExcelUtil {
    private static Logger log = Logger.getLogger(ExcelUtil.class);

    
    public static Workbook gainWorkbook(File file) throws ExcelException {
        if (!isExcel(file)) {
            throw new ExcelException("文件不是Excel类型");
        }
        
        if (!file.exists()) {
            try {
                OutputStream os = new FileOutputStream(file);
                Workbook workbook = isOlderEdition(file) ? new HSSFWorkbook() : new XSSFWorkbook();
                workbook.write(os);
                log.debug("文件不存在,新建该Excel文件");
                os.close();

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        try {
            InputStream is = new FileInputStream(file);
            return isOlderEdition(file) ? new HSSFWorkbook(is) : new XSSFWorkbook(is);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    
    private static boolean isOlderEdition(File file) {
        return file.getName().matches(".+\\.(?i)xls");
    }

    
    private static boolean isExcel(File file) {
        String fileName = file.getName();
        String regXls = ".+\\.(?i)xls";
        String regXlsx = ".+\\.(?i)xlsx";
        return fileName.matches(regXls) || fileName.matches(regXlsx);
    }

    
    public static <E> Workbook createExcel(List<E> list, File file) {
        String sheetName = "default";
        if (list.size() == 0) {
            return null;
        }

        Workbook workbook = null;
        try {
            Class clazz = list.get(0).getClass();
            Field[] fields = clazz.getDeclaredFields();
            if (clazz.isAnnotationPresent(Excel.class)) {
                Excel excel = (Excel) clazz.getAnnotation(Excel.class);
                sheetName = excel.name();
            }

            workbook = gainWorkbook(file);
            Sheet sheet = workbook.createSheet(sheetName);
            
            Row line = sheet.createRow(0);
            for (int k = 0; k < fields.length; k++) {
                Cell cell = line.createCell(k);
                String columnName = fields[k].getName();
                if (fields[k].isAnnotationPresent(Excel.class)) {
                    Excel excel = fields[k].getAnnotation(Excel.class);
                    columnName = excel.name();
                }
                cell.setCellValue(columnName);
            }
            
            for (int i = 1; i <= list.size(); i++) {
                Row row = sheet.createRow(i);
                for (int j = 1; j <= fields.length; j++) {
                    Cell cell = row.createCell(j - 1);
                    String fieldName = fields[j - 1].getName();
                    String fieldFirstLetterUpper = fieldName.substring(0, 1).toUpperCase();
                    String prefix = "get";
                    if ("boolean".equals(fields[j - 1].getType().getName())) {
                        prefix = "is";
                    }
                    String methodName = prefix + fieldFirstLetterUpper + fieldName.substring(1);
                    Method method = clazz.getMethod(methodName);
                    cell.setCellValue(String.valueOf(method.invoke(list.get(i - 1))));
                }
            }
            log.debug("List读入结束");
            OutputStream os = new FileOutputStream(file);
            workbook.write(os);
            os.close();

        } catch (ExcelException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return workbook;
    }
}

参考链接:http://www.yiibai.com/apache_…

作者:Dulk\
起源:www.cnblogs.com/deng-cc/p/7443192.html

近期热文举荐:

1.Java 15 正式公布, 14 个新个性,刷新你的认知!!

2.终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!

3.我用 Java 8 写了一段逻辑,共事直呼看不懂,你试试看。。

4.吊打 Tomcat ,Undertow 性能很炸!!

5.《Java开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理