1、POI是什么
Apache POI - the Java API for Microsoft Documents,顾名思义,Apache的三方包,用来操作微软office文档的,多数时候用来操作excel,所以这里就以excel方面来说明。
需要引入两个包,maven地址如下(version 3.9):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
3、创建和读取
其实如果能理解面向对象,就很简单了,另外包括字体,公式,超链接等,都有对应的封装类,此处只提出了核心的几个,需要了解更多的需要自行展开。
例子的话,直接从别人教程里摘出来吧,另,读取的workbook,可以debug瞅瞅内容。
3.1 创建空白工作簿3.3、任意对象List转至为Excel文档
可用注解定义标签名和列名,写了个方法,可以将某个类的List转换为对应的Excel文档,列名如果在不使用注解的情况下默认为属性名:
类:方法:
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_poi/apache_poi_core_classes.html
作者:Dulk
来源:www.cnblogs.com/deng-cc/p/7443192.html
近期热文推荐:
1.Java 15 正式发布, 14 个新特性,刷新你的认知!!
2.终于靠开源项目弄到 IntelliJ IDEA 激活码了,真香!
3.我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。
4.吊打 Tomcat ,Undertow 性能很炸!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!