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

4次阅读

共计 6768 个字符,预计需要花费 17 分钟才能阅读完成。

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 开发手册(嵩山版)》最新公布,速速下载!

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

正文完
 0