POI-导入jar包

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>

这里使用的版本是3.14。自行选择适合自己的版本。

POI-导入功能

工具类的编写,来源于网上大佬,找不到出处了……

这里是文件上传时,立马可以解析导入的数据。参数使用的是MultipartFile

package com.study.utils;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

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.web.multipart.MultipartFile;

/*excel读写工具类 */
public class POIUtil {
    private static Logger logger = LoggerFactory.getLogger(POIUtil.class);
    private final static String xls = "xls";
    private final static String xlsx = "xlsx";

    /**
     * 读入excel文件,解析后返回
     *
     * @param file
     * @throws IOException
     */
    public static List<String[]> readExcel(MultipartFile file) throws IOException {
        //检查文件
        //checkFile(file);
        //获得Workbook工作薄对象
        Workbook workbook = getWorkBook(file);
        //创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回
        List<String[]> list = new ArrayList<String[]>();
        if (workbook != null) {
            for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
                //获得当前sheet工作表
                Sheet sheet = workbook.getSheetAt(sheetNum);
                if (sheet == null) {
                    continue;
                }
                //获得当前sheet的开始行
                int firstRowNum = sheet.getFirstRowNum();
                //获得当前sheet的结束行
                int lastRowNum = sheet.getLastRowNum();
                //循环除了第一行的所有行
                for (int rowNum = firstRowNum + 1; rowNum <= lastRowNum; rowNum++) {
                    //获得当前行
                    Row row = sheet.getRow(rowNum);
                    if (row == null) {
                        continue;
                    }
                    //获得当前行的开始列
                    int firstCellNum = row.getFirstCellNum();
                    //获得当前行的列数
                    //int lastCellNum = row.getPhysicalNumberOfCells();
                    //String[] cells = new String[row.getPhysicalNumberOfCells()];
                    //上面的获取方法,遇到空单元格就会自动停止解析!
                    int lastCellNum = row.getLastCellNum();
                    String[] cells = new String[row.getLastCellNum()];
                    //循环当前行
                    for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
                        Cell cell = row.getCell(cellNum);
                        cells[cellNum] = getCellValue(cell);
                    }
                    list.add(cells);
                }
            }
            workbook.close();
        }
        return list;
    }

    public static void checkFile(MultipartFile file) throws IOException {
        //判断文件是否存在
        if (null == file) {
            logger.error("文件不存在!");
            throw new FileNotFoundException("文件不存在!");
        }
        //获得文件名
        String fileName = file.getOriginalFilename();
        //判断文件是否是excel文件
        if (!fileName.endsWith(xls) && !fileName.endsWith(xlsx)) {
            logger.error(fileName + "不是excel文件");
            throw new IOException(fileName + "不是excel文件");
        }
    }

    public static Workbook getWorkBook(MultipartFile file) {
        //获得文件名
        String fileName = file.getOriginalFilename();
        //创建Workbook工作薄对象,表示整个excel
        Workbook workbook = null;
        try {
            //获取excel文件的io流
            InputStream is = file.getInputStream();
            //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
            if (fileName.endsWith(xls)) {
                //2003
                workbook = new HSSFWorkbook(is);
            } else if (fileName.endsWith(xlsx)) {
                //2007
                workbook = new XSSFWorkbook(is);
            }
        } catch (IOException e) {
            logger.info(e.getMessage());
        }
        return workbook;
    }

    public static String getCellValue(Cell cell) {
        String cellValue = "";
        if (cell == null) {
            return cellValue;
        }
        //把数字当成String来读,避免出现1读成1.0的情况
        if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
            cell.setCellType(Cell.CELL_TYPE_STRING);
        }
        //判断数据的类型
        switch (cell.getCellType()) {
            case Cell.CELL_TYPE_NUMERIC: //数字
                cellValue = String.valueOf(cell.getNumericCellValue());
                break;
            case Cell.CELL_TYPE_STRING: //字符串
                cellValue = String.valueOf(cell.getStringCellValue());
                break;
            case Cell.CELL_TYPE_BOOLEAN: //Boolean
                cellValue = String.valueOf(cell.getBooleanCellValue());
                break;
            case Cell.CELL_TYPE_FORMULA: //公式
                cellValue = String.valueOf(cell.getCellFormula());
                break;
            case Cell.CELL_TYPE_BLANK: //空值
                cellValue = "";
                break;
            case Cell.CELL_TYPE_ERROR: //故障
                cellValue = "非法字符";
                break;
            default:
                cellValue = "未知类型";
                break;
        }
        return cellValue;
    }
}

POI-导出功能

这里是直接写在具体的controller层中,如果有需要可以封装一个util工具类。

@SuppressWarnings("resource")是用来压制资源泄露警告的。比如使用io类,最后没有关闭。

@SuppressWarnings("resource")
@RequestMapping("/export.do")
public void exportExcel(HttpServletResponse response, HttpSession session, String name) throws Exception {
    Map<Integer, String> categoryMap = MemberCategoryTagDic.getMap();
    List<Manager> managerList = managerService.getListByParams(1, ManagerRoleDic.SELLER.getValue(), 1, 100);
    Map<Integer, String> managerNameMap = new HashMap<Integer, String>();
    for (int i = 0; i < managerList.size(); i++) {
        Manager manager = managerList.get(i);
        managerNameMap.put(manager.getId(), manager.getRealName());
    }
    //获取前1000条数据-待定
    List<PotentialCustomer> customers = potentialCustomerService.getListByParams(null, null, null, null, 1000);

    String[] tableHeaders = {"时间", "所属销售", "客户类型", "公司名称", "主营产品", "联系人", "电话", "跟进情况"};
    HSSFWorkbook workbook = new HSSFWorkbook();
    HSSFSheet sheet = workbook.createSheet("Sheet1");

    //单元格样式设置
    HSSFCellStyle cellStyle = workbook.createCellStyle();
    //设置边框
    cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
    cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);//下边框
    cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
    cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
    //设置居中
    cellStyle.setAlignment(HorizontalAlignment.CENTER);//设置居中
    cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
    //设置单元格内容格式为文本格式
    HSSFDataFormat format = workbook.createDataFormat();
    cellStyle.setDataFormat(format.getFormat("@"));


    //字体设置
    Font font = workbook.createFont();
    //font.setColor(HSSFColor.RED.index);
    font.setBold(true);
    //font.setItalic(true);
    //font.setUnderline(HSSFFont.U_SINGLE);
    //设置单元格内容字体
    cellStyle.setFont(font);

    // 将第一行的八个单元格给合并
    sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 7));
    HSSFRow row = sheet.createRow(0);
    HSSFCell beginCell = row.createCell(0);
    beginCell.setCellValue("意向客户累积表");
    // 设置第一行单元格样式
    beginCell.setCellStyle(cellStyle);

    row = sheet.createRow(1);

    // 创建表头
    for (int i = 0; i < tableHeaders.length; i++) {
        HSSFCell cell = row.createCell(i);
        cell.setCellValue(tableHeaders[i]);
        cell.setCellStyle(cellStyle);
    }

    for (int i = 0; i < customers.size(); i++) {
        row = sheet.createRow(i + 2);

        PotentialCustomer customer = customers.get(i);
        row.createCell(0).setCellValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(customer.getCreateTime()));
        row.createCell(1).setCellValue(managerNameMap.get(customer.getOwner()));
        row.createCell(2).setCellValue(categoryMap.get(customer.getType()));
        row.createCell(3).setCellValue(customer.getCompany());
        row.createCell(4).setCellValue(customer.getMainProduct());
        row.createCell(5).setCellValue(customer.getUsername());
        row.createCell(6).setCellValue(customer.getMobile());
        row.createCell(7).setCellValue(customer.getMark());
    }

    OutputStream outputStream = response.getOutputStream();
    response.reset();
    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-disposition", "attachment;filename=template.xls");

    workbook.write(outputStream);
    outputStream.flush();
    outputStream.close();
}
原文链接: https://marshucheng1.github.io/2017/03/06/POI-%E5%AF%BC%E5%85%A5%E5%AF%BC%E5%87%BAExcel/