Java利用POI读写Excel文件工具类

本文实例为大家分享了Java读写Excel文件工具类的具体代码,供大家参考,具体内容如下

package com.test.app.utils;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.lang.reflect.Field;

import java.lang.reflect.Method;

import java.util.ArrayList;

import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFDateUtil;

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 org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.util.CollectionUtils;

/**

* @Description: Excel读写工具类

* @Author: hunger.zhu

* @CreateDate: 2019/4/10 13:21

*/

public class ExcelUtils {

private static final Logger logger = LoggerFactory.getLogger(ExcelUtils.class);

/**

* 读取Excel内容

* @param file 需要被读的文件对象

* @param startRow 从哪一行开始读 (rowIndex从0开始的)

* @param isExcel2003 是否是excel2003还是更高的版本

* @param sheetIndex 读取哪一个sheet (sheetIndex也是从0开始)

* @return List<List<String>>

* @throws Exception

*/

public static List<List<String>> readExcel(File file, int startRow, boolean isExcel2003, int sheetIndex) throws Exception {

List<List<String>> dataLst;

InputStream is = null;

try {

/** 创建读取文件的输入流 */

is = new FileInputStream(file);

/** 根据版本选择创建Workbook的方式 */

Workbook wb;

if (isExcel2003) {

wb = new HSSFWorkbook(is);

} else {

wb = new XSSFWorkbook(is);

}

/** 调用本类的读取方法读取excel数据 */

dataLst = read(wb, startRow, sheetIndex);

} catch (Exception ex) {

logger.error("读取excel文件异常!", ex);

ex.printStackTrace();

throw ex;

} finally {

if (is != null) {

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

/** 返回最后读取的结果 */

return dataLst;

}

private static List<List<String>> read(Workbook wb, int startRow, int sheetIndex) {

/** 总列数 */

int totalCells = 0;

/** 创建集合存储读取的数据 */

List<List<String>> dataLst = new ArrayList<List<String>>();

/** 得到第一个shell */

Sheet sheet = wb.getSheetAt(sheetIndex);

/** 得到Excel的行数 */

int totalRows = sheet.getPhysicalNumberOfRows();

/** 得到Excel的列数 */

if (totalRows >= 1 && sheet.getRow(0) != null) {

totalCells = sheet.getRow(0).getPhysicalNumberOfCells();

}

/** 循环Excel的行 */

for (int r = startRow; ; r++) {

Row row = sheet.getRow(r);

if (row == null) {

break;

}

List<String> rowLst = new ArrayList<String>();

/** 循环Excel的列 */

for (int c = 0; c < totalCells; c++) {

Cell cell = row.getCell(c);

String cellValue = "";

if (null != cell) {

// 以下是判断数据的类型

switch (cell.getCellTypeEnum()) {

case NUMERIC: // 数字

// 判断是不是日期格式

if (HSSFDateUtil.isCellDateFormatted(cell)) {

cellValue = cell.getDateCellValue() + "";

}else {

cellValue = cell.getNumericCellValue() + "";

}

break;

case STRING: // 字符串

cellValue = cell.getStringCellValue();

break;

case BOOLEAN: // Boolean

cellValue = cell.getBooleanCellValue() + "";

break;

case FORMULA: // 公式

cellValue = cell.getCellFormula() + "";

break;

case BLANK: // 空值

cellValue = "";

break;

case ERROR: // 故障

cellValue = "非法字符";

break;

default:

cellValue = "未知类型";

break;

}

}

rowLst.add(cellValue);

}

/** 保存第r行的第c列 */

boolean isEmptyRow = true;

if (rowLst != null) {

for (String s : rowLst) {

if (s != null && !s.isEmpty()) {

isEmptyRow = false;

}

}

}

if (!isEmptyRow) {

dataLst.add(rowLst);

}

}

return dataLst;

}

/**

* 读取Excel内容

* @param filePath 被读取文件的绝对路径

* @param startRow

* @param isExcel2003

* @param sheetIndex

* @return List<List<String>>

* @throws Exception

*/

public static List<List<String>> readExcel(String filePath, int startRow, boolean isExcel2003, int sheetIndex) throws Exception {

return readExcel(new File(filePath) , startRow, isExcel2003, sheetIndex);

}

/**

* 将数据写入Excel工作簿

* @param header 表格的标题

* @param dataList 所需写入的数据 List<List<String>>

* @param isExcel2003 是否是excel2003还是更高的版本

* @param sheetName 生成的excel中sheet的名字

* @return Workbook 之后直接写出即可,如workbook.write(new FileOutputStream("E://test/20190410_test.xlsx"));

*/

public static Workbook getWorkbookFromList(List<String> header, List<List<String>> dataList, boolean isExcel2003,

String sheetName) {

Workbook wb;

// 创建Workbook对象(excel的文档对象)

if (isExcel2003) {

wb = new HSSFWorkbook();

} else {

wb = new XSSFWorkbook();

}

// 建立新的sheet对象(excel的表单)

Sheet sheet = wb.createSheet(sheetName);

// 在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个

int rowNum = 0;

Row row0 = sheet.createRow(rowNum);

if (!CollectionUtils.isEmpty(header)) {

// 设置表头

for (int i = 0; i < header.size(); i++) {

Cell cell = row0.createCell(i);

// 设置单元格样式

cell.setCellStyle(POIUtils.getCellStyle(wb, "Calibri", (short) 12));

// 设置列宽

sheet.setColumnWidth(i, 256 * 20);

cell.setCellValue(header.get(i));

}

rowNum++;

}

if (!CollectionUtils.isEmpty(dataList)) {

// 填充数据

for (List<String> cellList : dataList) {

Row row = sheet.createRow(rowNum);

for (int i = 0; i < cellList.size(); i++) {

Cell cell = row.createCell(i);

cell.setCellStyle(POIUtils.getCellStyle(wb, "Calibri", (short) 12));

if (CollectionUtils.isEmpty(header)) {

sheet.setColumnWidth(i, 256 * 20);

}

cell.setCellValue(cellList.get(i));

}

rowNum++;

}

}

return wb;

}

/**

* 将数据写入Excel工作簿

* @param header 表格的标题

* @param dataList 所需写入的数据 List<Object>

* @param isExcel2003 是否是excel2003还是更高的版本

* @param sheetName 生成的excel中sheet的名字

* @return Workbook对象,之后直接写出即可,如workbook.write(new FileOutputStream("E://test/20190410_test.xlsx"));

* @throws Exception

*/

public static Workbook getWorkbookFromObj(List<String> header, List<?> dataList, boolean isExcel2003,

String sheetName) throws Exception {

Workbook wb;

// 创建Workbook对象(excel的文档对象)

if (isExcel2003) {

wb = new HSSFWorkbook();

} else {

wb = new XSSFWorkbook();

}

// 建立新的sheet对象(excel的表单)

Sheet sheet = wb.createSheet(sheetName);

// 在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个

int rowNum = 0;

Row row0 = sheet.createRow(rowNum);

if (!CollectionUtils.isEmpty(header)) {

// 设置表头

for (int i = 0; i < header.size(); i++) {

Cell cell = row0.createCell(i);

// 设置单元格样式

cell.setCellStyle(POIUtils.getCellStyle(wb, "Calibri", (short) 12));

sheet.setColumnWidth(i, 256 * 20);

cell.setCellValue(header.get(i));

}

rowNum++;

}

if (!CollectionUtils.isEmpty(dataList)) {

// 填充数据

Class<? extends Object> objClass = dataList.get(0).getClass();

Field[] fields = objClass.getDeclaredFields();

for (int i = 0; i < dataList.size(); i++) {

// 创建row对象

Row row = sheet.createRow(rowNum);

// 遍历获取每一个字段的值

for (int j = 0; j < fields.length; j++) {

String fieldVal = "";

Method[] methods = objClass.getDeclaredMethods();

for (Method method : methods) {

if (method.getName().equalsIgnoreCase("get" + fields[j].getName())) {

String property = (String) method.invoke(dataList.get(i), null);

fieldVal = property == null ? "" : property;

break;

}

}

Cell cell = row.createCell(j);

cell.setCellStyle(POIUtils.getCellStyle(wb, "Calibri", (short) 12));

if (CollectionUtils.isEmpty(header)) {

sheet.setColumnWidth(j, 256 * 20);

}

cell.setCellValue(fieldVal);

}

rowNum++;

}

}

return wb;

}

public static boolean validateExcel(String filePath) {

/** 检查文件名是否为空或者是否是Excel格式的文件 */

if (filePath == null

|| !(isExcel2003(filePath) || isExcel2007(filePath))) {

// "文件名不是excel格式";

return false;

}

/** 检查文件是否存在 */

File file = new File(filePath);

if (file == null || !file.exists()) {

// "文件不存在";

return false;

}

return true;

}

public static boolean isExcel2003(String filePath) {

return filePath.matches("^.+\\.(?i)(xls)$");

}

public static boolean isExcel2007(String filePath) {

return filePath.matches("^.+\\.(?i)(xlsx)$");

}

}

以下为POIUtils.java:

package com.test.app.utils;

import org.apache.poi.ss.usermodel.*;

import org.apache.poi.ss.usermodel.Font;

import org.apache.poi.xssf.usermodel.XSSFCellStyle;

import org.apache.poi.xssf.usermodel.XSSFColor;

import org.apache.poi.xssf.usermodel.XSSFFont;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.awt.*;

import java.awt.Color;

/**

* @Description: Excel的单元格样式

* @Author: hunger.zhu

* @CreateDate: 2019/4/10 13:05

*/

public class POIUtils {

/**

* 设置单元格的边框(细)且为黑色,字体水平垂直居中,自动换行

* @param workbook

* @param fontName

* @param fontSize

* @return

*/

public static CellStyle getCellStyle(Workbook workbook, String fontName, short fontSize){

CellStyle style = workbook.createCellStyle();

Font font = workbook.createFont();

// 设置上下左右四个边框宽度

style.setBorderTop(BorderStyle.THIN);

style.setBorderBottom(BorderStyle.THIN);

style.setBorderLeft(BorderStyle.THIN);

style.setBorderRight(BorderStyle.THIN);

// 设置上下左右四个边框颜色

style.setTopBorderColor(IndexedColors.BLACK.getIndex());

style.setBottomBorderColor(IndexedColors.BLACK.getIndex());

style.setLeftBorderColor(IndexedColors.BLACK.getIndex());

style.setRightBorderColor(IndexedColors.BLACK.getIndex());

// 水平居中,垂直居中,自动换行

style.setAlignment(HorizontalAlignment.CENTER);

style.setVerticalAlignment(VerticalAlignment.CENTER);

style.setWrapText(false);

// 设置字体样式及大小

font.setFontName(fontName);

font.setFontHeightInPoints(fontSize);

style.setFont(font);

return style;

}

}

以上是 Java利用POI读写Excel文件工具类 的全部内容, 来源链接: utcz.com/z/311608.html

回到顶部