美文网首页
Java读取Excel文件数据并将记录写入到新的文件中--POI

Java读取Excel文件数据并将记录写入到新的文件中--POI

作者: wangzaiplus | 来源:发表于2017-09-25 14:57 被阅读0次

    1. apache poi包里有4个主要的类:

    • Workbook------工作表,通过WorkbookFactory的create(FileInputStream fis)方法获取,
    • Sheet------------表格,Workbook实例的getSheetAt(int num)方法获取,
    • Row--------------行,Sheet实例的getRow(int num)方法获取,
    • Cell--------------单元格,Row实例的getCell(int num)方法获取,
      最后通过Cell实例根据数据类型调用对应的方法获取单元格的值。

    2. 代码

    package com.upi.institution.utils;
    
    import com.upi.institution.common.utils.CommonUtils;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.Map;
    
    public class ExcelUtil {
    
        private static Logger logger = LoggerFactory.getLogger(ExcelUtil.class);
    
        private static Workbook workbook;
        private static Sheet sheet;
    
        /**
         * 初始化表格,判断文件格式是xls还是xlsx
         * @param excelPath
         */
        private static void initExcel(String excelPath){
            if (CommonUtils.isEmpty(excelPath)){
                logger.info("文件路径不能为空");
                workbook = null;
                return;
            }
            try {
                InputStream is = new FileInputStream(excelPath);
                if (excelPath.endsWith(".xls")){//.xls格式
                    workbook = new HSSFWorkbook(is);
                }else if(excelPath.endsWith(".xlsx")){//.xlsx格式
                    workbook = new XSSFWorkbook(is);
                }else{
                    workbook = null;
                    logger.info("无法转换的Excel文件格式(后缀名应为:.xls或.xlsx)");
                }
            } catch (FileNotFoundException e) {
                logger.info("找不到指定文件");
            } catch (IOException e) {
                logger.info("IO异常");
            }
        }
    
        /**
         * 读取Excel文件并解析成json字符串后写入新的文件
         * @param excelPath 要解析的Excel文件路径(具体文件)
         * @param fromRow 指定开始读取的行数,如从第2行开始则为2
         * @param filePath 写入json后的文件保存位置(文件路径)
         */
        private static void readExcelToJsonFile(String excelPath, int headerNum, int fromRow, String filePath){
            initExcel(excelPath);
            if(workbook == null){
                logger.info("初始化工作簿失败");
                return;
            }
            for(int s=0; s<workbook.getNumberOfSheets(); s++){//遍历sheet
                sheet = workbook.getSheetAt(s);
                Row headerRow = getRow(sheet, headerNum);//首行,即json-key
                int rowNum = sheet.getLastRowNum() + 1;//总行数
                for(int i=(fromRow-1); i<rowNum; i++){//遍历行,从fromRow行开始遍历
                    Map<String, String > map = new HashMap<String, String>();
                    Row row = sheet.getRow(i);
                    if(row == null){
                        continue;
                    }
                    int cellNum = row.getLastCellNum();//总列数
                    for(int j=0; j<cellNum; j++){//遍历单元格
                        String key = getCellValue(headerRow.getCell(j));
                        String value = getCellValue(row.getCell(j));
                        if(!CommonUtils.isEmpty(key) && !CommonUtils.isEmpty(value)){
                            map.put(key, value);
                        }
                    }
                    String jsonStr = JsonUtil.toJson(map);//将map解析成json字符串
                    String fileName = UUIDUtil.UUID("002");//生成随机文件名,以"002"开头
                    String finalFilePath = filePath + "\\" + fileName + ".txt";//最终保存的文件路径
                    FileUtil.writeToFile(finalFilePath, jsonStr, false);//将json字符串写入文件,不追加,每一行数据即生成一个文件
                    String fileNamePath = filePath + "\\fileNames.txt";//保存所有随机文件名
                    FileUtil.writeToFile(fileNamePath, (fileName + "\r\n"), true);//将文件名写入fileNames.txt文本中
                }
                logger.info("成功读取Excel并生成文件");
            }
        }
    
        /**
         * 获取指定行
         * @param sheet
         * @param rowNum
         * @return
         */
        private static Row getRow(Sheet sheet, int rowNum){
            if(sheet == null){
                return null;
            }
            return sheet.getRow(rowNum - 1);
        }
    
        /**
         * 获取单元格的值
         * @param cell
         * @return 单元格值
         */
        private static String getCellValue(Cell cell){
            String cellValue = "";
            if(cell != null){
                switch (cell.getCellType()){//单元格类型
                    case Cell.CELL_TYPE_BOOLEAN://布尔类型
                        cellValue = cell.getBooleanCellValue() + "";
                        break;
                    case Cell.CELL_TYPE_NUMERIC://数字类型
                        if (DateUtil.isCellDateFormatted(cell)) {//格式化后的日期数值类型
                            cellValue = new DataFormatter().formatCellValue(cell);
                        } else {
                            //数值
                            double value = cell.getNumericCellValue();
                            int intValue = (int) value;
                            cellValue = value - intValue == 0 ? String.valueOf(intValue) : String.valueOf(value);
                        }
                        break;
                    case Cell.CELL_TYPE_FORMULA:{//公式
                        try{
                            cellValue = cell.getNumericCellValue() + "";
                        }catch(IllegalStateException e){
                            cellValue = String.valueOf(cell.getRichStringCellValue());
                        }
                    }
                    break;
                    case Cell.CELL_TYPE_STRING://字符串
                        cellValue = cell.getStringCellValue();
                        break;
                    case Cell.CELL_TYPE_BLANK://空值
                        cellValue = "";
                        break;
                    case Cell.CELL_TYPE_ERROR://故障
                        cellValue = "非法字符";
                        break;
                    default:
                        cellValue = "未知类型";
                        break;
                }
            }
            return cellValue.trim();
        }
    
        public static void main(String[] args) {
            String test = "C:\\Users\\Administrator\\Desktop\\test.xls";
            String filePath = "C:\\Users\\Administrator\\Desktop";
            readExcelToJsonFile(test, 1, 2, filePath);
        }
    
    }
    

    3. 测试

    test.xls表格数据

    运行代码:


    控制台 桌面生成的文件 json数据 文件名

    相关文章

      网友评论

          本文标题:Java读取Excel文件数据并将记录写入到新的文件中--POI

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