Java玩转Excel(建议收藏)
全栈开发者社区
共 7464字,需浏览 15分钟
·
2021-02-10 21:16
点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]
1、POI是什么
<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poiartifactId>
<version>3.9version>
dependency>
<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poi-ooxmlartifactId>
<version>3.9version>
dependency>
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核心类
2.1 工作簿 Workbook
HSSFWorkbook : 有读取.xls 格式和写入Microsoft Excel文件的方法。它与微软Office97-2003版本兼容
XSSFWorkbook : 有读写Microsoft Excel和OpenOffice的XML文件的格式.xls或.xlsx的方法。它与MS-Office版本2007或更高版本兼容
//直接创建新的
HSSFWorkbook()
//通过输入流创建
HSSFWorkbook(java.io.InputStream s)
//直接创建新的XSSFWorkbook()//通过File类创建XSSFWorkbook(java.io.File file)//通过输入流创建XSSFWorkbook(java.io.InputStream is)
2.2 标签页 Sheet
workbook.createSheet();
workbook.createSheet(String sheetName);
2.3 行 Row
sheet.createRow(int rownum);
2.4 单元格 Cell
row.createCell(int column);
row.createCell(int column, int type);
3、创建和读取
import java.io.*;
import org.apache.poi.xssf.usermodel.*;
public class CreateWorkBook
{
public static void main(String[] args)throws Exception
{
Blank workbook
XSSFWorkbook workbook = new XSSFWorkbook();
file system using specific name
FileOutputStream out = new FileOutputStream(
new File("createworkbook.xlsx"));
operation workbook using file out object
workbook.write(out);
out.close();
System.out.println("
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);
//Get the workbook instance for XLSX 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.");
}
}
}
4、方法示例:任意对象List转至为Excel文档(可用注解定义标签名和列名)
"学生标签页") (name =
public class Student {
"姓名") (name =
private String name;
private boolean male;
"身高") (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
list = new ArrayList (); 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;
public 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;/** * Excel的操作工具类 */public class ExcelUtil { private static Logger log = Logger.getLogger(ExcelUtil.class); /** * 获取某个File文件对应的Workbook工作簿对象 */ 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; } /** * 判断某个Excel文件是否是2003-2007通用旧版 */ private static boolean isOlderEdition(File file) { return file.getName().matches(".+\\.(?i)xls"); } /** * 判断文件是否是一个Excel文件 */ 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); } /** * 将某个对象的List转换为Excel工作簿 */ public static Workbook createExcel(List 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; }}
来源:https://www.cnblogs.com/deng-cc
觉得本文对你有帮助?请分享给更多人
关注「全栈开发者社区」加星标,提升全栈技能
本公众号会不定期给大家发福利,包括送书、学习资源等,敬请期待吧!
如果感觉推送内容不错,不妨右下角点个在看转发朋友圈或收藏,感谢支持。
好文章,留言、点赞、在看和分享一条龙吧❤️
评论