一 :简介
开发中经常会设计到excel的处理,如导出Excel,导入Excel到数据库中,操作Excel目前有两个框架,一个是apache 的poi, 另一个是 Java Excel

Apache POI 简介是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“可怜的模糊实现”。

官方主页: http://poi.apache.org/index.html
API文档: http://poi.apache.org/apidocs/index.html

Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。jxl 由于其小巧 易用的特点, 逐渐已经取代了 POI-excel的地位, 成为了越来越多的java开发人员生成excel文件的首选。

本篇博客简单演示一下apache poi 读取excel数据。
1.添加依赖

     <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
     </dependency>

2.编写一个工具类,可以直接复制

package com.test1;

import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import static org.apache.poi.ss.usermodel.Row.MissingCellPolicy.RETURN_BLANK_AS_NULL;
@Slf4j
public class ExcelUtils {
//    private static final Logger log = LoggerFactory.getLogger(ExcelUtils.class);
    //文件路径
    private String filePath;
    //整个excel对象
    private XSSFWorkbook excelWBook;
    //sheet工作表对象
    private XSSFSheet excelWSheet;
    //行对象
    private XSSFRow Row;
    //单元格
    private XSSFCell Cell;
    //读文件IO
    FileInputStream inputStream;


    public  void openFile(String file){
        try {
            //读取文件
            this.filePath = file;
            this.inputStream = new FileInputStream(this.filePath);
            this.excelWBook = new XSSFWorkbook(inputStream);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void closeFile() throws Exception {
        this.excelWBook.close();
        this.inputStream.close();
    }

    public Object[][] getAllData(String sheetName) throws Exception {
        //获取工作簿
        this.excelWSheet = this.excelWBook.getSheet(sheetName);
        // 总行数
        int rowCount = this.excelWSheet.getLastRowNum() - this.excelWSheet.getFirstRowNum() + 1;
        // 总列数
        int colCount = this.excelWSheet.getRow(0).getPhysicalNumberOfCells();
        //开始与结束的行号、列号
        int startRow = 0;
        int endRow = rowCount - 1;
        int startCol = 0;
        int endCol = colCount - 1;
        //读取
        List<Object[]> records = new ArrayList<Object[]>();
        for (int i = startRow; i <= endRow; i++) {
            String[] row = new String[endCol - startCol + 1];
            for (int j = startCol; j <= endCol; j++) {
                row[j] = getCellData(sheetName, i, j);
            }
            records.add(row);
        }
        //将List转换为二维数组
        Object[][] results = new Object[records.size()][];
        for (int i = 0; i < records.size(); i++) {
            results[i] = records.get(i);
        }
        if (!(results.length > 0)) {
            log.error("数据参数文件读取为空,无法执行测试,请检查");
            throw new RuntimeException("dataprovider data is empty");
        }

        return results;

    }

    /**
     *
     *
     * 读取单元格数据
     * @param sheetName 工作簿名称
     * @param RowNum 行号
     * @param ColNum 列号
     */
    public String getCellData(String sheetName, int RowNum, int ColNum) throws Exception {
        this.excelWSheet = this.excelWBook.getSheet(sheetName);
        try {

            Cell = this.excelWSheet.getRow(RowNum).getCell(ColNum);

            String CellData = "";


            if (Cell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
                //字符串
                CellData = Cell.getStringCellValue();
            } else if (Cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {
                //数字
                short format = Cell.getCellStyle().getDataFormat();
                if (HSSFDateUtil.isCellDateFormatted(Cell)) {
                    //日期
                    Date d = Cell.getDateCellValue();
                    DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
                    CellData = formater.format(d);
                } else if (format == 14 || format == 31 || format == 57 || format == 58) {
                    // 日期
                    DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
                    Date date = DateUtil.getJavaDate(Cell.getNumericCellValue());
                    CellData = formater.format(date);
                } else if (format == 20 || format == 32) {
                    // 时间
                    DateFormat formater = new SimpleDateFormat("HH:mm");
                    Date date = DateUtil.getJavaDate(Cell.getNumericCellValue());
                    CellData = formater.format(date);
                } else {
                    //小数
                    DecimalFormat df = new DecimalFormat("0");
                    CellData = df.format(Cell.getNumericCellValue());
                }
            } else if (Cell.getCellType() == XSSFCell.CELL_TYPE_BLANK) {
                //空白
                CellData = "";
            }else if(Cell.getCellType() == XSSFCell.CELL_TYPE_BOOLEAN){
                //布尔
                CellData = String.valueOf(Cell.getBooleanCellValue());
            }
            else {
                //未知类型
                throw new RuntimeException("no support data type");
            }
            log.info("读取sheet工作表【" + sheetName + "】的第" + RowNum + "行第" + ColNum + "列的值为:" + CellData);
            //返回字符串
            return CellData;

        } catch (Exception e) {
            log.debug("读取sheet工作表【" + sheetName + "】的第" + RowNum + "行第" + ColNum + "列的值时异常:" + e);
            throw new RuntimeException("get excel data error-->" + e);
        }
    }

    /**
     * 写入单元格数据
     * @param sheetName 工作簿名称
     * @param RowNum 行号
     * @param ColNum 列号
     */
    public void setCellData(String sheetName,int RowNum, int ColNum) throws IOException {
        this.excelWSheet = this.excelWBook.getSheet(sheetName);
        String resultValue = "this is new";
        try {
            // 获取 excel文件中的行对象
            Row = this.excelWSheet.getRow(RowNum) == null ? excelWSheet.createRow(RowNum) : this.excelWSheet.getRow(RowNum);

            // 如果单元格为空,则返回 Null
            Cell = Row.getCell(ColNum, RETURN_BLANK_AS_NULL);

            if (Cell == null) {
                // 当单元格对象是 null 的时候,则创建单元格
                // 如果单元格为空,无法直接调用单元格对象的 setCellValue 方法设定单元格的值
                Cell = Row.createCell(ColNum);
                // 创建单元格后可以调用单元格对象的 setCellValue 方法设定单元格的值
                Cell.setCellValue(resultValue);
                System.out.println("写入成功");

            } else {
                // 单元格中有内容,则可以直接调用单元格对象的 setCellValue 方法设定单元格的值
                Cell.setCellValue(resultValue);
                System.out.println("写入成功");
            }
        } catch (Exception e) {
            throw new RuntimeException("set excel data error-->" + e);
        }
        // 实例化写入 excel 文件的文件输出流对象
        FileOutputStream fileOut = new FileOutputStream(this.filePath);
        // 将内容写入 excel 文件中
        this.excelWBook.write(fileOut);
        // 调用flush 方法强制刷新写入文件
        fileOut.flush();
        // 关闭文件输出流对象
        fileOut.close();


    }


}

3.测试类

public class PoiDome {
    public static void main(String[] args) throws Exception {
        String filename = "D:\\workSpace\\talent\\siyangerzan\\dianwei.xlsx";
        // Object[][] excelData = ExcelDataUtil.getExcelData(filename, sheetname);
        ExcelUtils excelUtils = new ExcelUtils();
        excelUtils.openFile(filename);
        Object[][] excelData = excelUtils.getAllData("自动化数据");
        
        for (Object[] row : excelData){
            Object r1 = row[0];
            Object r2 = row[1];
            Object r3 = row[2];
            Object r4 = row[3];
            System.out.println(r1.toString()+"--"+r2.toString()+"--"+r3.toString()+"--"+r4.toString());
        }
//        excelUtils.setCellData("pin",9,1);
        excelUtils.closeFile();
    }

}

 

 

相关文章:Apache POI使用详解_org.apache.poi_风流 少年的博客-CSDN博客

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐