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

 更新时间:2020年12月31日 10:41:24   作者:Lieforlove  
这篇文章主要为大家详细介绍了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通过FTP服务器上传下载文件的方法

    Java通过FTP服务器上传下载文件的方法

    本文介绍了如何使用Apache Jakarta Commons Net(commons-net-3.3.jar)基于FileZilla Server服务器实现FTP服务器上文件的上传/下载/删除等操作,需要的朋友可以参考下
    2015-07-07
  • Java基本类型包装类概述与Integer类、Character类用法分析

    Java基本类型包装类概述与Integer类、Character类用法分析

    这篇文章主要介绍了Java基本类型包装类概述与Integer类、Character类用法,结合实例形式分析了java基本数据类型与字符串转换相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • Spring Boot 简介(入门篇)

    Spring Boot 简介(入门篇)

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。下面通过本文给大家介绍spring boot相关知识,需要的的朋友参考下吧
    2017-04-04
  • 如何使用@Value和@PropertySource注入外部资源

    如何使用@Value和@PropertySource注入外部资源

    这篇文章主要介绍了如何使用@Value和@PropertySource注入外部资源的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • java List中相同的数据合并到一起

    java List中相同的数据合并到一起

    这篇文章主要介绍了java List中相同的数据合并到一起,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Spring boot实现一个简单的ioc(1)

    Spring boot实现一个简单的ioc(1)

    这篇文章主要为大家详细介绍了Spring boot实现一个简单的ioc,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 教你怎么实现java语言的在线编译

    教你怎么实现java语言的在线编译

    这篇文章主要介绍了教你怎么实现java语言的在线编译,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • Java二叉树的四种遍历(递归与非递归)

    Java二叉树的四种遍历(递归与非递归)

    这篇文章小编给大家分享的是Java二叉树的四种遍历,主要是递归与非递归,下面文章加u来详细介绍,感兴趣的小伙伴一起来学习吧
    2021-10-10
  • 详解Java中的checked异常和unchecked异常区别

    详解Java中的checked异常和unchecked异常区别

    这篇文章主要介绍了详解Java中的checked异常和unchecked异常区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • idea撤销git commit操作详解

    idea撤销git commit操作详解

    这篇文章主要为大家介绍了idea撤销git commit操作详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论