POI解析excel,将批量数据写入文件或数据库

1.描述

  采用java将excel文件中的特定数据解析出来,然后将数据写文文件或导入数据库。

  常用的excel的数据有两种,一种是前几行有数据说明,另一种是全部为数据。需求可能是只要某几行或几列的数据。

  如下:

  第一种:前几行有数据说明,往往作为插入的字段

    

  第二种:全部为数据

    

 

2.引入依赖jar包配置

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.17</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.17</version>
    </dependency>

 

一个excel从程序层面来说,主要有四个属性,Workbook(工作表),Sheet(表单),Row(行), Cell(单元格)。思路是获取工作表,工作表只有一个,但Sheet表单往往可能存在多个,可循环获取表单;然后对每个表单的行进行解析,再解析每行的单元格;单元格中的内容又可分为多种:日期、数字、字符串、boolean类型值、公式、空值、非法字符等,都需要单独处理。

  首先初始Workbook,获取该对象,通过该对象循环获取Sheet表单对象,若Sheet只有一页,直接通过workbook.getSheetAt(0);获取。或者通过Sheet的名称获取:workbook.getSheet(“营业厅信息”);获得Sheet对象后,通过sheet.getRow(rowNum);获取行的对象,拿到行的对象后,通过row.getCell(i)获取该行的某个单元格的对象,通过单元格的对象获取内容。

  解析出来的数据可以写入txt文件,写成sql、csv等格式的数据,或者写入数据库。

 

3.下面是代码实现:

ParseExcelPubUtils.java

package cn.hxc.myExecel;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DateUtil;
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;

/**
 * @Description 按照Workbook,Sheet,Row,Cell一层一层往下读取。 
 * @author sun_flower
 * 2020年2月28日 下午2:42:28
 */
public class ParseExcelPubUtils {
    
    /**
     * 判断sheet是否为空
     * @param sheet
     * @return
     * 2020年2月28日 下午4:50:22
     */
    public static boolean isSheetEmpty(Sheet sheet) {
        if(sheet.getLastRowNum() == 0 &&  sheet.getPhysicalNumberOfRows() == 0) {//sheet.getPhysicalNumberOfRows():返回物理定义的行数
            System.err.println("该sheet为空,一行数据也没有");
            return true;
        }
        return false;
    }
    
    /**
     * 解析Excel的单元格的内容
     * @param cell 单元格
     * @return
     * 2020年2月28日 下午3:01:20
     */
    public static String parseCell(Cell cell) {
        CellType cellType = cell.getCellTypeEnum();
        switch (cellType) {
            case STRING:// 字符串
                return cell.getStringCellValue();
            case NUMERIC:    // 数字、日期   数字类型 先将其cell格式设置成String读取,避免将数字1变成1.0的情况
                 if (DateUtil.isCellDateFormatted(cell)) {
                     SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                     return fmt.format(cell.getDateCellValue()); // 日期型
                 } else {
                     //cell.setCellType(CellType.STRING);    //读取数字:cell.getNumericCellValue()
                     //String cellValue = String.valueOf(cell.getStringCellValue());

              double numericCellValue = cell.getNumericCellValue();
              String cellValue = String.valueOf(numericCellValue);

              if (cellValue.contains("E")) {
                return String.valueOf(new Double(cell.getNumericCellValue()).longValue()); // 数字
              }
              if(cellValue.endsWith(".0")) {
                cellValue = cellValue.substring(0, cellValue.length() - 2);
              }

           return cellValue;
                 }
            case BOOLEAN:// Boolean
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:    //公式
                return cell.getCellFormula();
            case BLANK: // 空值
                return "";
            case ERROR:// 故障
                return String.valueOf("非法字符:" + cell.getErrorCellValue());
            default:
                return "未知类型";
        }
    }
    /**
     * 默认获取第1个的Sheet
     * @param workbook
     * @param sheetName sheet的名称
     * @return
     * 2020年2月28日 下午3:02:11
     */
    public static Sheet getSheet(Workbook workbook) {
        return getSheet(workbook, 0);
    }
    /**
     * 根据sheet的名称获取Sheet
     * @param workbook
     * @param sheetName sheet的名称
     * @return
     * 2020年2月28日 下午3:02:11
     */
    public static Sheet getSheet(Workbook workbook, String sheetName) {
        return workbook.getSheet(sheetName);
    }
    /**
     * 获取第几个的Sheet
     * @param workbook
     * @param sheetIndex sheet所在的index
     * @return
     * 2020年2月28日 下午3:02:37
     */
    public static Sheet getSheet(Workbook workbook, int sheetIndex) {
        return workbook.getSheetAt(sheetIndex);
    }
    /**
     * 从文件中获取Workbook解析对象
     * @param filePath
     * @return
     * 2020年2月28日 下午3:03:23
     */
    public static Workbook readWorkBookeType(String filePath) {
        FileInputStream is = null; 
        try {
            is = new FileInputStream(filePath); 
            if(filePath.toLowerCase().endsWith(".xlsx")) {//新版excel 2007以上
                return new XSSFWorkbook(is);
            } else if(filePath.toLowerCase().endsWith(".xls")) {//旧版excel 2003
                return new HSSFWorkbook(is);
            } else {
                 throw new RuntimeException("excel格式文件错误");
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            throw new RuntimeException("读取文件错误 == " + e.toString());
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("excel格式文件错误 == " + e.toString());
        } finally {
            if(is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        
    }
    /**
     * 检查是否是Excel文件
     * @param file
     * @return
     * 2020年2月28日 下午3:03:49
     */
    public boolean checkExcelFile(File file) {
        // 判断文件是否存在
        if (null == file) {
            System.err.println("文件不存在!");
            return false;
        }
        // 获得文件名
        String fileName = file.getName();
        // 判断文件是否是excel文件
        if (!fileName.endsWith(".xls") && !fileName.endsWith(".xlsx")) {
            System.err.println("不是excel文件!");
            return false;
        }
        return true;
    }
    
}

 注:若单元格的格式和内容均为数字,直接用获取字符串的方式 cell.getStringCellValue()获取,会报:Cannot get a NUMERIC value from a STRING cell 错误,原因是无法从纯数字的单元格 用获取String的方式获取。但是使用读取数字:cell.getNumericCellValue() 会将数字 1 变成 1.0 的情况,若能接收该情况,解决方法是先将该单元格,设置成字符格式,再用读取字符串的方式获取:

cell.setCellType(CellType.STRING); //读取数字:cell.getNumericCellValue()
String cellValue = String.valueOf(cell.getStringCellValue());

 但是使用该种方式,仍然存在问题,存在double类型的数字时,精度会改变,如原值为:42.932517 ,经过上述方式运行后,变为:42.932516999999997的情况,我的解决方式是:然后以 cell.getStringCellValue()获取,对于是整数的情况,转为1.0后,将【.0】截掉:

              double numericCellValue = cell.getNumericCellValue();
              String cellValue = String.valueOf(numericCellValue);

              if (cellValue.contains("E")) {
                return String.valueOf(new Double(cell.getNumericCellValue()).longValue()); // 数字
              }
              if(cellValue.endsWith(".0")) {
                cellValue = cellValue.substring(0, cellValue.length() - 2);
              }

 


ParseExcelListMap.java  以某一行作为字段(Map中的key),其他行作为值(Map的值),每一行的值形成一个Map,所有行作为一个List集合

package cn.hxc.myExecel;

import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

/**
 * @Description 将excel中的数据解析成List<Map<E>>格式 
 *     以某一行作为字段(Map中的key),其他行作为值(Map的值)每一行的值形成一个Map,所有行作为一个List集合
 * @author Huang Xiaocong
 * 2020年2月28日 下午8:13:13
 */
public class ParseExcelListMap {
    
    /**
     * 获取sheet的所有数据
     * @param sheet
     * @param headKey 
     * @return
     * 2020年2月28日 下午6:17:52
     * @author Huang Xiaocong
     */
    public static List<Map<String, Object>> parseSheetToListMap(Sheet sheet, String[] headKey) {
        return parseSheetToListMap(sheet, headKey, 0);
    }
    /**
     * 从sheet的第startRow行开始获取数据组装成List<Map>格式
     * @param sheet
     * @param headKey 作为Map的key
     * @param startRow 行号
     * @return
     * 2020年2月28日 下午2:42:54
     * @author Huang Xiaocong
     */
    public static List<Map<String, Object>> parseSheetToListMap(Sheet sheet, String[] headKey, int startRow) {
        List<Map<String, Object>> contents = new LinkedList<Map<String, Object>>();
        if(ParseExcelPubUtils.isSheetEmpty(sheet)) {
            return contents;
        }
        Map<String, Object> tempMap = null;
        int rowNumCount = sheet.getPhysicalNumberOfRows();
        for (int rowNum = startRow; rowNum <= rowNumCount; rowNum++) {
            Row row = sheet.getRow(rowNum);
            if(null == row) {    //该行为空
                continue;
            }
            tempMap = parseSheetToMapByRow(row, headKey);
            contents.add(tempMap);
        }
        System.out.println("总共读取了" + (rowNumCount - startRow + 1) + "行!");
        return contents;
    }
    /**
     * 从sheet的 第startRow行到第endRow行 第startCol列 到 第endCol列 开始获取数据组装成List<Map>格式
     * @param sheet
     * @param headKey 作为Map的key
     * @param startRow 开始行
     * @param endRow 结束行
     * @param startCol 开始列
     * @param endCol 结束列
     * @return
     * 2020年2月28日 下午8:13:36
     * @author Huang Xiaocong
     */
    public static List<Map<String, Object>> parseSheetToListMapByRowCol(Sheet sheet, String[] headKey, int startRow, int endRow, int startCol, int endCol) {
        List<Map<String, Object>> contents = new LinkedList<Map<String, Object>>();
        if(ParseExcelPubUtils.isSheetEmpty(sheet)) {
            return contents;
        }
        if(endRow < startRow || endRow < 0) {
            System.err.println("结束行不能小于开始行");
            return contents;
        }
        Map<String, Object> tempMap = null;
        for (int rowNum = startRow; rowNum <= endRow; rowNum++) {
            Row row = sheet.getRow(rowNum);
            if(null == row) {    //该行为空
                continue;
            }
            tempMap = parseSheetToMapByRow(row, headKey, startCol, endCol);
            contents.add(tempMap);
        }
        System.out.println("读取了行:" + startRow + " - " + endRow + " ;列:" + startCol + " - " + endCol + " 之间的数据!");
        return contents;
    }
    
    /**
     * 解析一行的数据
     * @param row
     * @param headKey
     * @return
     * 2020年2月28日 下午8:04:13
     * @author Huang Xiaocong
     */
    public static Map<String, Object> parseSheetToMapByRow(Row row, String[] headKey) {
        Map<String, Object> retMap = new LinkedHashMap<String, Object>();
        int cellNumCount = row.getPhysicalNumberOfCells();
        for(int i = 0; i < cellNumCount && cellNumCount <= headKey.length; i++) {
            Cell cell = row.getCell(i);
            if(cell != null)
                retMap.put(headKey[i], ParseExcelPubUtils.parseCell(cell).trim());
        }
        return retMap;
    }
    /**
     * 解析一行中  从第startCol列 到 第endCol列 之间的数据
     * @param row
     * @param headKey
     * @param startCol 开始列
     * @param endCol 结束列
     * @return
     * 2020年2月28日 下午8:16:52
     * @author Huang Xiaocong
     */
    public static Map<String, Object> parseSheetToMapByRow(Row row, String[] headKey, int startCol, int endCol) {
        Map<String, Object> retMap = new LinkedHashMap<String, Object>();
        if(endCol < startCol || endCol < 0) {
            System.err.println("结束列不能小于开始列");
            return retMap;
        }
        int size = endCol - startCol;
        for(int i = startCol, j = 0; i < endCol && j <= size; i++, j++) {
            Cell cell = row.getCell(i);
            if(cell != null)
                retMap.put(headKey[j], ParseExcelPubUtils.parseCell(cell).trim());
        }
        return retMap;
    }
    /**
     * 从sheet中获取某一行的数据
     * @param sheet
     * @param rowNum
     * @return
     * 2020年2月28日 下午3:55:29
     * @author Huang Xiaocong
     */
    public static String[] getExcelRowColData(Sheet sheet, int rowNum) {
        Row row = sheet.getRow(rowNum);
        if(null == row) {
            System.err.println("该行数据为空");
            return null;
        }
        return getExcelRowColData(row, 0, row.getPhysicalNumberOfCells());
    }
    /**
     * 从excel中获取某一行开始 第startColIndex列到第endColIndex列之间 的数据
     * @param sheet
     * @param rowNum
     * @param startColIndex
     * @param endColIndex
     * @return
     * 2020年2月28日 下午8:19:44
     * @author Huang Xiaocong
     */
    public static String[] getExcelRowColData(Sheet sheet, int rowNum, int startColIndex, int endColIndex) {
        Row row = sheet.getRow(rowNum);
        if(null == row) {
            System.out.println("该行数据为空");
            return null;
        }
        int size = endColIndex-startColIndex;
        String[] val = new String[size];
        for (int i = startColIndex, j = 0; i < endColIndex && j <= size; i++, j++) {
            val[j] = ParseExcelPubUtils.parseCell(row.getCell(i)).trim();
        }
        return val;
    }
    /**
     * 解析一行数据 第startColIndex列到第endColIndex列之间 的数据
     * @param row
     * @param startColIndex
     * @param endColIndex
     * @return
     * 2020年2月28日 下午8:04:19
     * @author Huang Xiaocong
     */
    public static String[] getExcelRowColData(Row row, int startColIndex, int endColIndex) {
        int size = endColIndex-startColIndex;
        String[] val = new String[size];
        for (int i = startColIndex, j = 0; i < endColIndex && j <= size; i++, j++) {
            val[j] = ParseExcelPubUtils.parseCell(row.getCell(i)).trim();
        }
        return val;
    }
}

ParseExcelListList.java  以每一行中的值作为list集合,所有的行作为一个List集合

package cn.hxc.myExecel;

import java.util.LinkedList;
import java.util.List;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

/**
 * @Description 将数据解析成List<list<E>> 结构的数据形式 以每一行中的值作为list集合,所有的行作为一个List集合
 * @author Huang Xiaocong
 * 2020年2月28日 下午5:48:39
 */
public class ParseExcelListList {

    /**
     * 从某行开始读取数据
     * @param sheet
     * @param startRow 开始行
     * @return list嵌套list格式的数据
     * 2020年2月28日 下午5:11:42
     * @author Huang Xiaocong
     */
    public static List<List<String>> parseSheetToListByRow(Sheet sheet, int startRow) { //
        return parseSheetToListByRow(sheet, startRow, sheet.getPhysicalNumberOfRows());
    }
    /**
     * 读取,某行到某行的数据
     * @param sheet
     * @param startRow 开始行
     * @param endRow 结束行
     * @return list嵌套list格式的数据
     * 2020年2月28日 下午3:44:56
     * @author Huang Xiaocong
     */
    public static List<List<String>> parseSheetToListByRow(Sheet sheet, int startRow, int endRow) { //
        List<List<String>> contents = new LinkedList<List<String>>();
        if(ParseExcelPubUtils.isSheetEmpty(sheet)) {
            return contents;
        }
        if(endRow < startRow || endRow < 0) {
            System.err.println("结束行不能小于开始行");
            return contents;
        }
        List<String> tempList = null;
        Row row = null;
        for (int rowNum = startRow; rowNum <= endRow; rowNum++) {
            row = sheet.getRow(rowNum);
            if(null == row) {    //该行为空
                continue;
            }
            tempList = parseSheetToListByCol(row, 0, row.getPhysicalNumberOfCells());
            contents.add(tempList);
        }
        System.out.println("总共读取了" + (endRow - startRow + 1) + "行数据!");
        return contents;
    }
    /**
     * 从sheet读取某一行中从某列到某列的数据
     * @param sheet
     * @param rowNum 行号
     * @param startCol 开始列
     * @param endCol 结束列
     * @return list格式的数据
     * 2020年2月28日 下午5:02:31
     * @author Huang Xiaocong
     */
    public static List<String> parseSheetToListByCol(Sheet sheet, int rowNum, int startCol, int endCol) { //
        List<String> contents = new LinkedList<String>();
        if(ParseExcelPubUtils.isSheetEmpty(sheet)) {
            return contents;
        }
        Row row = sheet.getRow(rowNum);
        contents = parseSheetToListByCol(row, startCol, endCol);
        return contents;
    }
    /**
     * 从sheet读取行startRow 到 endRow 和startCol 到endCol之间的数据
     * @param sheet
     * @param startRow 开始行
     * @param endRow 结束行
     * @param startCol 开始列
     * @param endCol 结束列
     * @return
     * 2020年2月28日 下午5:37:43
     * @author Huang Xiaocong
     */
    public static List<List<String>> parseSheetToListByRowCol(Sheet sheet, int startRow, int endRow, int startCol, int endCol) { //
        List<List<String>> contents = new LinkedList<List<String>>();
        if(ParseExcelPubUtils.isSheetEmpty(sheet)) {
            return contents;
        }
        if(endRow < startRow || endRow < 0) {
            System.err.println("结束行不能小于开始行");
            return contents;
        }
        
        List<String> tempList = null;
        Row row = null;
        for (int rowNum = startRow; rowNum <= endRow; rowNum++) {
            row = sheet.getRow(rowNum);
            if(null == row) {    //该行为空
                continue;
            }
            tempList = parseSheetToListByCol(row, startCol, endCol);
            contents.add(tempList);
        }
        System.out.println("读取了行:" + startRow + " - " + endRow + " ;列:" + startCol + " - " + endCol + " 之间的数据!");
        return contents;
    }
    /**
     * 读取某一行中从某列到某列的数据
     * @param row
     * @param startCol
     * @param endCol
     * @return
     * 2020年2月28日 下午5:02:24
     * @author Huang Xiaocong
     */
    public static List<String> parseSheetToListByCol(Row row, int startCol, int endCol) { //
        List<String> contents = new LinkedList<String>();
        if(endCol < startCol || endCol < 0) {
            System.err.println("结束列不能小于开始列");
            return contents;
        }
        if(null == row) {    //该行为空
            System.err.println("该行数据为空");
            return contents;
        }
        for(int i = startCol; i < endCol; i++ ) {
            Cell cell = row.getCell(i);
            contents.add(ParseExcelPubUtils.parseCell(cell).trim());
        }
        return contents;
    }
}

 

配置类 ExcelEntity.java 该部分可以写入配置文件

package cn.hxc.myExecel;

public class ExcelEntity {

    /** sheet的名称*/
    private String sheetName;
    /** 第几个sheet*/
    private int sheetIndex;
    /** 第几行作为头信息*/
    private int headRowNum;
    /** 解析某行*/
    private int indexRow;
    /** 开始列*/
    private int startColIndex;
    /** 结束列*/
    private int endColIndex;
    /** 开始行*/
    private int startRowIndex;
    /** 结束行*/
    private int endRowIndex;
    /** 头信息*/
    private String[] headKey;
    /** 源文件及路径*/
    private String sourceFilePath;
    /** 保存的文件及路径*/
    private String saveFilePath;

    public String getSheetName() {
        return sheetName;
    }

    public void setSheetName(String sheetName) {
        this.sheetName = sheetName;
    }

    public int getSheetIndex() {
        return sheetIndex;
    }

    public void setSheetIndex(int sheetIndex) {
        this.sheetIndex = sheetIndex;
    }

    public int getHeadRowNum() {
        return headRowNum;
    }

    public void setHeadRowNum(int headRowNum) {
        this.headRowNum = headRowNum;
    }

    public int getIndexRow() {
        return indexRow;
    }

    public void setIndexRow(int indexRow) {
        this.indexRow = indexRow;
    }

    public int getStartColIndex() {
        return startColIndex;
    }

    public void setStartColIndex(int startColIndex) {
        this.startColIndex = startColIndex;
    }

    public int getEndColIndex() {
        return endColIndex;
    }

    public void setEndColIndex(int endColIndex) {
        this.endColIndex = endColIndex;
    }

    public int getStartRowIndex() {
        return startRowIndex;
    }

    public void setStartRowIndex(int startRowIndex) {
        this.startRowIndex = startRowIndex;
    }

    public int getEndRowIndex() {
        return endRowIndex;
    }

    public void setEndRowIndex(int endRowIndex) {
        this.endRowIndex = endRowIndex;
    }

    public String[] getHeadKey() {
        return headKey;
    }

    public void setHeadKey(String[] headKey) {
        this.headKey = headKey;
    }

    public String getSourceFilePath() {
        return sourceFilePath;
    }

    public void setSourceFilePath(String sourceFilePath) {
        this.sourceFilePath = sourceFilePath;
    }

    public String getSaveFilePath() {
        return saveFilePath;
    }

    public void setSaveFilePath(String saveFilePath) {
        this.saveFilePath = saveFilePath;
    }
    
}

 

DataSaveToFileUtils.java 将数据写入文件:

package cn.hxc.myExecel;

import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class DataSaveToFileUtils {

    /**
     * 对List<Map<V, E>>类型解析数据并保存
     * @param data
     * @param districtKey
     * @param bWirter
     * 2020年2月28日 下午9:34:47
     */
    public static void parseDataSave(List<Map<String, Object>> data, String[] districtKey, BufferedWriter bWirter) {
        int size = data.size();
        Set<String> tempSet = new HashSet<String>();
        for(int i = 0; i < size; i++) {
            Map<String, Object> tempMap = data.get(i);
            tempSet.add(parseData(tempMap, districtKey));
        }
        writeDataTo(new ArrayList<Object>(tempSet), bWirter);
    }
    /**
     * 写入文件
     * @param data
     * @param bWirter
     * 2020年2月29日 上午10:18:21
     */
    public static void writeDataTo(List<Object> data, BufferedWriter bWirter) {
        Iterator<Object> iterator = data.iterator();
        try {
            while (iterator.hasNext()) {
                String str = iterator.next().toString();
                bWirter.write(str);    //写入
                bWirter.newLine();
            }
            bWirter.newLine();
            bWirter.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    /**
     * 对List<List<E>>类型解析数据并保存
     * @param data
     * @param bWirter
     * 2020年2月28日 下午10:01:15
     */
    public static void parseDataSave(List<List<String>> data, BufferedWriter bWirter) {
        int size = data.size();
        Set<String> tempSet = new HashSet<String>();
        for(int i = 0; i < size; i++) {
            List<String> tempList = data.get(i);
            tempSet.add(parseData(tempList));
        }
        writeDataTo(new ArrayList<Object>(tempSet), bWirter);
    }
    /**
     * 
     * @param data
     * @return
     * 2020年2月28日 下午10:01:03
     */
    public static String parseData(List<String> data) {
        StringBuilder sb = new StringBuilder();
        for (String val : data) {
            sb.append(val).append(" | ");
        }
        return sb.toString();
    }
    /**
     * 
     * @param tempMap
     * @param key
     * @return
     * 2020年2月28日 下午9:39:18
     */
    public static String parseData(Map<String, Object> tempMap, String[] key) {
        StringBuilder sb = new StringBuilder();
        for (String valKey : key) {
            sb.append(tempMap.get(valKey)).append(" , ");
        }
        return sb.toString();
    }
    
    /**
     * 缓存对象
     * @param savePath 文件路径及名称
     * @return 缓存对象
     * 2020年2月28日 下午9:31:33
     */
    public static BufferedWriter getBufferedWriter(String savePath) {
        try {
            return new BufferedWriter(new OutputStreamWriter(new FileOutputStream(savePath)));
        } catch (FileNotFoundException e) {
            System.err.println("文件不存在" + e.toString());
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 关闭缓存流
     * @param bWirter
     * 2020年2月28日 下午9:31:24
     */
    public static void flushAndClose(BufferedWriter bWirter) {
        if(bWirter != null) {
            try {
                bWirter.flush();
                bWirter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

4.测试类 Test.java 将上图中的数据解析,写入到文件中

package cn.hxc.myExecel;

import java.io.BufferedWriter;
import java.util.List;
import java.util.Map;

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

/**
 * @Description 测试
 * @author Huang Xiaocong
 * 2020年2月29日 上午10:17:07
 */
public class Test {

    public static void main(String[] args) {
        //下面方法的测试为:以某一行作为字段(Map中的key),其他行作为值(Map的值)每一行的值形成一个Map,所有行作为一个List集合
        testMap();
        //下面的测试为:以每一行中的值作为list集合,所有的行作为一个List集合 
//        testList();
    }
    public static void testMap() {
        Test test = new Test();
        ExcelEntity excelEntity = test.excelEntityInfo();
        Sheet sheet = ParseExcelPubUtils.getSheet(ParseExcelPubUtils.readWorkBookeType(excelEntity.getSourceFilePath()), excelEntity.getSheetName());
        
//        String[] headKey = ParseExcelToListMap.getExcelRowColData(sheet, 0);
        //从第三行开始读取
//        List<Map<String, Object>> contents = ParseExcelToListMap.parseSheetToListMap(sheet, headKey, excelEntity.getIndexRow());
        //读取第7行 到第10行  第4列 到第10列的数据 头部也应这样截取
        String[] headKey = ParseExcelListMap.getExcelRowColData(sheet,0, excelEntity.getStartColIndex(), excelEntity.getEndColIndex());
        List<Map<String, Object>> contents = ParseExcelListMap.parseSheetToListMapByRowCol(sheet, headKey, 
                excelEntity.getStartRowIndex(), excelEntity.getEndRowIndex(), excelEntity.getStartColIndex(), excelEntity.getEndColIndex());
        for(int i = 0; i < contents.size(); i++) {
            Map<String, Object> map = contents.get(i);
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                System.out.print(entry.getValue() + " | ");
            }
            System.out.println();
            System.out.println("===========================================================================");
        }
        
        //将contents数据保存到文件中
        BufferedWriter bWirter = DataSaveToFileUtils.getBufferedWriter(excelEntity.getSaveFilePath());
        DataSaveToFileUtils.parseDataSave(contents, headKey, bWirter);
        DataSaveToFileUtils.flushAndClose(bWirter);
    }
    
    public static void testList() {
        Test test = new Test();
        ExcelEntity excelEntity = test.excelEntityInfo();
        excelEntity.setSaveFilePath("E:\\营业厅信息List.txt");
        Sheet sheet = ParseExcelPubUtils.getSheet(ParseExcelPubUtils.readWorkBookeType(excelEntity.getSourceFilePath()), excelEntity.getSheetName());
        //读取第7行 到第10行  第4列 到第10列的数据
        List<List<String>> data = ParseExcelListList.parseSheetToListByRowCol(sheet, 
                excelEntity.getStartRowIndex(), excelEntity.getEndRowIndex(), excelEntity.getStartColIndex(), excelEntity.getEndColIndex());
        
        BufferedWriter bWirter = DataSaveToFileUtils.getBufferedWriter(excelEntity.getSaveFilePath());
        DataSaveToFileUtils.parseDataSave(data, bWirter);
        DataSaveToFileUtils.flushAndClose(bWirter);
    }
    /**
     * 设置Excel参数实体(可放在配置文件中)
     * @return
     * 2020年2月29日 上午10:16:27
     */
    public ExcelEntity excelEntityInfo() {
        ExcelEntity excelEntity = new ExcelEntity();
        excelEntity.setSourceFilePath("E:\\TestData.xlsx");
        excelEntity.setSaveFilePath("E:\\营业厅信息.txt");
        excelEntity.setSheetIndex(0);
        excelEntity.setSheetName("营业厅数据");
        excelEntity.setIndexRow(2);
        
        excelEntity.setStartRowIndex(7);
        excelEntity.setEndRowIndex(10);
        excelEntity.setStartColIndex(4);
        excelEntity.setEndColIndex(11);
        return excelEntity;
    }

}

 

5.测试结果如下:

控制台打印的消息:

    

生成的文件信息:

   

 

posted @ 2020-02-29 13:18  黄小葱  阅读(999)  评论(0编辑  收藏  举报