美文网首页软件测试学习之路
通过poi、poi-ooxml框架读取不同格式excel

通过poi、poi-ooxml框架读取不同格式excel

作者: 乘风破浪的姐姐 | 来源:发表于2018-01-06 15:56 被阅读1376次

    有时候,excel的同一个sheet中会存储多种类型的数据。如:登录、数据添加、其他数据添加,要通过sheet工作表来控制并随意读取。
    本类主要是读取后缀为xlsx或xls的excel操作。
    需要导入包

      <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.17</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.17</version>
            </dependency>
    
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    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.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.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.text.DecimalFormat;
    import java.util.ArrayList;
    import java.util.List;
    
    public class ExcelCommon {
        private XSSFSheet ExcelWSheet;
        private XSSFWorkbook ExcelWBook;
        private XSSFCell Cell;
        private XSSFRow row;
        private String filePath;
    
        //设定要操作的Excel 的文件路径和Excel 文件中的sheet名称
        //在读写excel的时候,均需要先调用此方法,设定要操作的excel 文件路径和要操作的sheet名称
        //构造函数初始化
        public ExcelCommon(String Path, String SheetName) throws Exception{ 
            FileInputStream ExcelFile;
    
            try{
                //实例化excel 文件的FileInputStream 对象
                ExcelFile = new FileInputStream(Path);
                //实例化excel 文件的XSSFWorkbook 对象
                ExcelWBook = new XSSFWorkbook(ExcelFile);
                //实例化ExcelWSheet 对象,指定excel 文件中的sheet 名称,后续用于sheet 中行、列和单元格的操作
                ExcelWSheet = ExcelWBook.getSheet(SheetName);
            }catch (Exception e){
                throw (e);
            }
            filePath = Path;
        }
    
       //读取指定单元格的数据。需要传入行数、列数
        public String getCellData(int RowNum,int ColNum) throws Exception{
            try{
                Cell = 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){
                    DecimalFormat df = new DecimalFormat("0");
                    CellData=df.format(Cell.getNumericCellValue());
                }
                return CellData;
            }catch (Exception e){
                e.printStackTrace();
                return  "";
            }
        }
       //读取指定单元格的数据且值为字符串。需要传入行数、列数
        public String getCellStrData_value(int RowNum, int ColNum) throws Exception{
            try{
                Cell = ExcelWSheet.getRow(RowNum).getCell(ColNum);
                if (Cell!=null){
                    String CellData = Cell.getStringCellValue();
                    return CellData;
                }
                else {
                    return"";
                }
            }catch (Exception e){
                return"";
            }
        }
       //读取指定单元格的数据且值为数字。需要传入行数、列数
        public String getCellNumData_value(int RowNum, int ColNum) throws Exception{
            String cellValue = "";
            DecimalFormat df = new DecimalFormat("#");
            try{
                Cell = ExcelWSheet.getRow(RowNum).getCell(ColNum);
                if (Cell!=null){
                    if (Cell.getCellType()==1){
                        cellValue= Cell.getStringCellValue();
                    }else {
                        cellValue=  String.valueOf( Cell.getNumericCellValue());
                        if(cellValue.endsWith(".0")){
                            cellValue = cellValue.substring(0, cellValue.length() - 2);
                        }
                    }
                }
                return cellValue;
            }catch (Exception e){
                return"";
            }
        }
    
        // 在excel 文件的执行单元格中写入数据,此函数只支持后缀为xlsx的excel 文件写入
        public void setCellData(int RowNum,int ColNum,String Result) throws Exception{
            try{
                // 获取excel文件中的行对象
                row = ExcelWSheet.getRow(RowNum);
                // 如果单元格为空,则返回Null
                Cell = row.getCell(ColNum, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL);
    
                if(Cell == null){
                    // 当单元格对象是null 的时候,则创建单元格
                    // 如果单元格为空,无法直接调用单元格对象的setCellValue 方法设定单元格的值
                    Cell = row.createCell(ColNum);
                    // 创建单元格后可以调用单元格对象的setCellValue 方法设定单元格的值
                    Cell.setCellValue(Result);
                }else{
                    // 单元格中有内容,则可以直接调用单元格对象的s方法设定单元格的值etCellValue
                    Cell.setCellValue(Result);
                    System.out.println("执行完成");
                }
                // 实例化写入 excel 文件的文件输出流对象
                FileOutputStream fileOut = new FileOutputStream(filePath);
                // 将内容写入excel 文件中
                ExcelWBook.write(fileOut);
                // 调用flush方法强制刷新写入文件
                fileOut.flush();
                // 关闭文件输出流对象
                fileOut.close();
            }catch (Exception e){
                e.printStackTrace();
                throw (e);
            }
        }
        // 从excel 文件获取测试数据的静态方法
        public static Object[][] getTestData(String execlFilePath,String sheetName) throws IOException{
            // 根据参数传入的数据文件路径和文件名称,组合出excel 数据文件的绝对路径
            // 声明一个file 文件对象
            File file = new File(execlFilePath);
    
            // 创建FileInputStream 对象用于读取excel 文件
            FileInputStream inputStream = new FileInputStream(file);
    
    
            // 声明Workbook 对象
            Workbook Workbook = null;
    
            // 获取文件名参数的后缀名,判断xlsx文件还是xls文件
            String fileExtensionName = execlFilePath.substring(execlFilePath.indexOf("."));
    
            // 判断文件类型如果是xlsx,则使用XSSFWorkbook 对象进行实例化
            // 判断文件类型如果是xls,则使用HSSFWorkbook 对象进行实例化
            if(fileExtensionName.equals(".xlsx")){
                //如果是2007的,也就是.xlsx, 让Workbook = new XSSFWorkbook(inputStream);
                Workbook = new XSSFWorkbook(inputStream);
            }else if (fileExtensionName.equals(".xls")){
                //如果是2003的,也就是.xls, 让Workbook = new HSSFWorkbook(inputStream);
                Workbook = new HSSFWorkbook(inputStream);
            }
    
            // 通过sheetName参数,生成sheet 对象
            Sheet Sheet = Workbook.getSheet(sheetName);
    
            // 获取excel 数据文件中sheet1中数据的行数,getLastRowNum 方法获取数据的最后行号
            // getFirstRowNum 方法获取数据的第一行行号,相减之后算出数据的行数
            // 注意:excel 文件的行号和列号都是从0开始
            int rowCount = Sheet.getLastRowNum() - Sheet.getFirstRowNum();
            // 创建名为records 的list 对象来存储从excel数据文件读取的数据
            List<Object[]> records = new ArrayList<Object[]>();
            // 使用2个for 循环遍历excel 数据文件的所有数据(除了第一行,第一行是数据列名称)
            // 所以i 从1开始,而不是从0
            for (int i=1;i<rowCount + 1;i++){
                // 使用getRow 方法获取行对象
                Row row = Sheet.getRow(i);
    
                String fields[] = new String[row.getLastCellNum() - 1];
    
                if(row.getCell(row.getLastCellNum()-1).getStringCellValue().equals("y")){
                    for(int j=0;j<row.getLastCellNum()-1;j++){
                        //判断excel 的单元格字段是数字还是字符,字符串格式调用getStringCellValue 方法获取
                        // 数字格式调用getNumericCellValue 方法获取
                        // fields[j-1]=(String) row.getCell(j).getCellType()==;
                      try {
                          if (row.getCell(j).getCellType() == XSSFCell.CELL_TYPE_STRING) {
                              fields[j] = row.getCell(j).getStringCellValue();
                          } else if (row.getCell(j).getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {
                              DecimalFormat df = new DecimalFormat("0");
                              fields[j] = df.format(row.getCell(j).getNumericCellValue());
                          } else {
                              System.out.println("格式错误");
                          }
                      }catch (Exception e){
                          fields[j] ="";
                      }
    
                    }
                    // fields 的数据对象存储到records的list中
                    records.add(fields);
                }
            }
            // 定义函数返回值,即Object[][]
            // 将存储测试数据的list 转换为一个Object 的二维数组
            Object[][] results = new Object[records.size()][];
            // 设置二维数组每行的值,每行是个object对象
            for(int i=0;i<records.size();i++){
                results[i] = records.get(i);
                //LogUtil.logInfo(results[i]);
            }
           // LogUtil.logInfo(results);
            // 关闭excel 文件
            return results;
        }
    
        public int getLastCellNum(){
            // 返回数据文件的最后一列的列号,如果有12列,则结果返回11
            return ExcelWSheet.getRow(0).getLastCellNum()-1;
        }
    

    测试类

        public static void main(String[] args) throws Exception{
             String filePath =System.getProperty("user.dir")+File.separator+"testdata"+File.separator+"apitest.xlsx";
             Object[][] results = ExcelCommon.getTestData(filePath,"test");
            for (int i=0;i<results.length;i++){
                for(int j=0;j<results[i].length;j++) {
                    System.out.print(results[i][j]+"\t");
                }
                System.out.println();
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:通过poi、poi-ooxml框架读取不同格式excel

        本文链接:https://www.haomeiwen.com/subject/sapynxtx.html