Apache POI提供了Java程序读取和写入MS Office文档的接口。
对于Excel文档读写:
-HSSF:提供读写MS Excel的xls文件的功能。
-XSSF:提供读写MS Excel的xlsx文件的功能。
Java使用POI实现对Excel文件的读写操作
本篇的ExcelUtils工具类,主要针对于一行数据(row)作为一个实例(t)的情况使用。
Excel对象 | Java对象 |
---|---|
表格(sheet) | List<T> |
行(row) | T 的一个实例 (t) |
单元格(cell) | 对象 t 的某个属性 |
package com.liziczh.ims.tools;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.LinkedList;
import java.util.List;
/**
* Excel文件读写工具类:针对一行数据(row)作为一个实例(t)的情况
*/
public class ExcelUtils {
/**
* 针对xlsx文件,使用XSSFWorkbook,要求excel版本在2007以上
*
* @param T 泛型类,行对象
* @param filepath 文件路径
* @return
* @throws Exception
*/
public static <T> List<T> readExcel(Class T,String filepath){
try {
if(filepath != null && !"".equals(filepath)){
// 工作簿
Workbook xwb = new XSSFWorkbook(new FileInputStream(filepath));
// 表格
Sheet sheet = null;
// 行
Row row = null;
// 单元格
Cell cell = null;
// 表
sheet = xwb.getSheetAt(0);
List<T> sheetList = new LinkedList<>();
for(int i = sheet.getFirstRowNum()+1; i < sheet.getPhysicalNumberOfRows(); i++){
// 获取第i行
row = sheet.getRow(i);
// 利用反射生成一个实例
T t = (T) T.newInstance();
// 依此获取单元格放入对象t中
for(int j = row.getFirstCellNum(); j < row.getPhysicalNumberOfCells(); j++){
// 获取第i行第j列的单元格,
cell = row.getCell(j);
// 获取对象的属性数组
Field[] fs = t.getClass().getDeclaredFields();
// 设置属性为可访问
fs[j].setAccessible(true);
// 类型转换:将单元格内容先转为String再转为当前属性所对应的类型
if(fs[j].getType() == String.class){
fs[j].set(t,fs[j].getType().cast(cell.toString()));
} else if (fs[j].getType() == int.class) {
fs[j].set(t,new Integer(cell.toString()));
} else if(fs[j].getType() == short.class){
fs[j].set(t,new Short(cell.toString()));
}else if(fs[j].getType() == long.class){
fs[j].set(t,new Long(cell.toString()));
}else if(fs[j].getType() == byte.class){
fs[j].set(t,new Byte(cell.toString()));
}else if(fs[j].getType() == float.class){
fs[j].set(t,new Float(cell.toString()));
}else if(fs[j].getType() == double.class){
fs[j].set(t,new Double(cell.toString()));
}
}
// 将对象t添加到集合中
sheetList.add(t);
}
return sheetList;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 针对xlsx文件,使用XSSFWorkbook,要求excel版本在2007以上
*
* @param list 数据
* @param T 泛型类,行对象
* @param colNames 表头信息,
* @param filepath 文件路径
* @return
* @throws Exception
*/
public static <T> void writeExcel(List<T> list,Class T,String[] colNames,String filepath) {
if(filepath != null && !"".equals(filepath)){
// 工作簿
Workbook workbook = new XSSFWorkbook();
// 表格
Sheet sheet = workbook.createSheet("0");
// 行
Row row = null;
// 单元格
Cell cell = null;
// 设置表头样式
CellStyle headerStyle = workbook.createCellStyle();
headerStyle.setAlignment(HorizontalAlignment.CENTER);
Font headerFont = workbook.createFont();
headerFont.setBold(true);
headerStyle.setFont(headerFont);
// 通过colNames数组生成表头
row = sheet.createRow(0);
for (int c = 0; c < colNames.length; c++) {
cell = row.createCell(c);
cell.setCellValue(colNames[c]);
cell.setCellStyle(headerStyle);
}
// 设置单元格样式
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setAlignment(HorizontalAlignment.CENTER);
// 通过一个List生成表内数据
for (int r = 0; r < list.size(); r++) {
// 获取一个List元素(即一个T的实例)
T t = list.get(r);
// 获取对象t的所有属性
Field[] fs = t.getClass().getDeclaredFields();
// 生成行
row = sheet.createRow(r + 1);
// 依此获取对象t的属性值 赋予 单元格
for (int j = 0; j < fs.length; j++) {
try {
// 设置属性为可访问
fs[j].setAccessible(true);
// 生成一个单元格
cell = row.createCell(j);
// 将属性值赋予单元格
cell.setCellValue(String.valueOf(fs[j].get(t)));
cell.setCellStyle(cellStyle);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
// 设置表名
workbook.setSheetName(0, T.getName());
// 生成xlsx文件
FileOutputStream out = null;
try {
out = new FileOutputStream(new File(filepath));
workbook.write(out);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}