java Excel导入导出工具类

本文章,导入导出依赖提前定义好的模板

package com.jd.nb.wishplat.man.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
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 org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/**
 * 
 * @author zhenwei.shi
 *
 */
public class ImpAndExpExcel {
   
    public static JSONArray doImpXlsx(MultipartFile file, String[] fields, String[] requiredFields, Integer docReadStartRowIndex) throws IOException {
        XSSFWorkbook wb = new XSSFWorkbook(file.getInputStream());
        
        JSONArray jsonArray = new JSONArray();        
        int startRowIndex = (null == docReadStartRowIndex?2:docReadStartRowIndex);
        
        XSSFSheet sheet = wb.getSheetAt(0);
        
        // 遍历所有行记录,sheet.getLastRowNum()获取的是最后一行的index
        for (int startRow = startRowIndex; startRow <= sheet.getLastRowNum(); startRow++) {
            // 遍历记录所有列
            JSONObject jsonObj = new JSONObject();
            boolean isErrorObj = false;
            
            for (int columnIndex = 0; columnIndex < fields.length; columnIndex++) {
                XSSFCell nowCell = getXssfCell(sheet, startRow, columnIndex);
                String cellValue = getXssfCellValue(nowCell);
                if(isRequired(fields[columnIndex],requiredFields) && StringUtils.isEmpty(cellValue)){
                    isErrorObj = true;
                    break;
                }
                jsonObj.put(fields[columnIndex], cellValue);
            }
            
            if(!isErrorObj){
                jsonArray.add(jsonObj);
            }
        }
        wb.close();
        return jsonArray;
    }
    
    /**
     * 导入03版Excel .xls
     * 依据上传文件返还JSON数组对象,JSON属性为heads
     * @param file 导入的文件
     * @param heads 定义对象的列名
     * @param rowStartIndex 从第几行开始读取
     * @return
     * @throws IOException 
     */
    @SuppressWarnings("resource")
    public static JSONArray doImpXls(MultipartFile file, String[] fields, Integer docReadStartRowIndex) throws IOException {
        POIFSFileSystem fs = new POIFSFileSystem(file.getInputStream());
        HSSFWorkbook wb = new HSSFWorkbook(fs);
        
        JSONArray jsonArray = new JSONArray();        
        int startRowIndex = (null == docReadStartRowIndex?2:docReadStartRowIndex);
        
        HSSFSheet sheet = wb.getSheetAt(0);//只导入sheet第一页
            
        // 遍历所有行记录,sheet.getLastRowNum()获取的是最后一行的index
        for (int startRow = startRowIndex; startRow <= sheet.getLastRowNum(); startRow++) {
            // 遍历记录所有列
            JSONObject jsonObj = new JSONObject();
            boolean isBlankObj = true;
            for (int columnIndex = 0; columnIndex < fields.length; columnIndex++) {
                HSSFCell nowCell = getHssfCell(sheet, startRow, columnIndex, true);
                String value = getHssfCellStringValue(nowCell);
                if(null!=value){
                    value=value.trim();
                }
                jsonObj.put(fields[columnIndex], value);
                if(!StringUtils.isEmpty(value) && !"0".equals(value)){
                    isBlankObj = false;
                }
            }
            
            if(!isBlankObj){
                jsonArray.add(jsonObj);
            }
        }
        return jsonArray;
    }

    /**
     * 导出03版Excel .xls
     * @param object//导出对象,可以是数组可以是对象
     * @param fields//要导出对象的所需要的属性,注意跟模板书序一直
     * @param docTemplatePath 如  1:/D:/saw_workspace/property/property-manage-ui/target/classes//templates/supplier/设施设备管理导入模板.xls
     *                      2:/templates/supplier/供应商管理导入模板.xls
     *                     docTemplatePath = this.getClass().getResource("/").getPath()+/templates/supplier/供应商管理导入模板.xls";
     * @param docWriteStartRowIndex//从模板第几行开始写入
     * @return
     * @throws FileNotFoundException
     * @throws IOException
     */
    public static void doExpXls(Object object,String[] fields,String docTemplatePath,Integer docWriteStartRowIndex) throws IOException{
        doExpXls(object, fields, docTemplatePath, docWriteStartRowIndex,null);
    }
    
    /**
     * 导出03版Excel .xls
     * @param object//导出对象,可以是数组可以是对象
     * @param fields//要导出对象的所需要的属性,注意跟模板书序一直
     * @param docTemplatePath 如  1:/D:/saw_workspace/property/property-manage-ui/target/classes//templates/supplier/设施设备管理导入模板.xls
     *                      2:/templates/supplier/供应商管理导入模板.xls
     *                     docTemplatePath = this.getClass().getResource("/").getPath()+/templates/supplier/供应商管理导入模板.xls";
     * @param docWriteStartRowIndex//从模板第几行开始写入
     * @param sheetRowsCount//sheet页数据最大行数
     * @return
     * @throws IOException
     */
    @SuppressWarnings("resource")
    public static void doExpXls(Object object,String[] fields,String docTemplatePath,Integer docWriteStartRowIndex,Integer sheetRowsCount) throws IOException{
        docTemplatePath = docTemplatePath.replaceAll("\\", "/");
        String projectPath = ImpAndExpExcel.class.getResource("/").getPath().replaceAll("\\", "/");
        if(!docTemplatePath.contains(projectPath)){
            docTemplatePath = projectPath+"/"+docTemplatePath;
        }
        FileInputStream inputStream = new FileInputStream(new File(docTemplatePath));;
       
        HSSFWorkbook workbook = new HSSFWorkbook(new POIFSFileSystem(inputStream));
        
        JSONArray jsonArr = (JSONArray) JSONArray.toJSON(object);
        int everyCount = null==sheetRowsCount?50000:sheetRowsCount;
        int pageCount = (int)Math.ceil(jsonArr.size()/(everyCount*1.0));
        //创建SHEET页
        for(int i=0; i<pageCount; i++){
            HSSFSheet sheet = null;
            if(0==i){
                sheet = workbook.getSheetAt(0);
            }else{
                sheet = workbook.cloneSheet(0);
            }
            
            int index = workbook.getSheetIndex(sheet);
            workbook.setSheetName(index, "第"+(i+1)+"页");
            workbook.setSheetOrder(sheet.getSheetName(), i);
        }
        //sheet页赋值数据
        for(int i=0; i<pageCount; i++){
            int startIndex = i*everyCount;
            int endIndex = startIndex+everyCount;
            if(i==pageCount-1){
                endIndex = jsonArr.size();
            }
            JSONArray subjsonArr = (JSONArray)JSONArray.toJSON(jsonArr.subList(startIndex, endIndex));
            int startRowIndex = (null == docWriteStartRowIndex?2:docWriteStartRowIndex);
            
            HSSFSheet sheet = workbook.getSheetAt(i);
            
            for (int j = 0; j < subjsonArr.size(); j++,startRowIndex++) {
                JSONObject jsonObj  = subjsonArr.getJSONObject(j);
                for (int colIndex = 0; colIndex < fields.length; colIndex++) {
                    HSSFCell tempCell = getHssfCell(sheet, startRowIndex, colIndex, true);
                    tempCell.setCellValue(jsonObj.getString(fields[colIndex]));    
                }
            }
        }
        
        ServletOutputStream out = null;
        String excName = docTemplatePath.substring(docTemplatePath.lastIndexOf("/")+1);
        try {
            HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/octet-stream; charset=UTF-8");
            response.addHeader("Content-Disposition", "attachment; filename=""+new String(excName.getBytes("GB2312"),"ISO8859-1")+"";");// 
            out = response.getOutputStream();
            workbook.write(out);
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            try {
                out.close();
                inputStream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 获取导出03版Excel .xls的workbook
     * @param object//导出对象,可以是数组可以是对象
     * @param fields//要导出对象的所需要的属性,注意跟模板书序一直
     * @param docTemplatePath 如  1:/D:/saw_workspace/property/property-manage-ui/target/classes//templates/supplier/设施设备管理导入模板.xls
     *                      2:/templates/supplier/供应商管理导入模板.xls
     *                     docTemplatePath = this.getClass().getResource("/").getPath()+/templates/supplier/供应商管理导入模板.xls";
     * @param docWriteStartRowIndex//从模板第几行开始写入
     * @return
     * @throws FileNotFoundException
     * @throws IOException
     */
    public static HSSFWorkbook getHSSFWorkbook(Object object,String[] fields,String docTemplatePath,Integer docWriteStartRowIndex) throws FileNotFoundException,IOException {
        docTemplatePath = docTemplatePath.replaceAll("\\", "/");
        String projectPath = ImpAndExpExcel.class.getResource("/").getPath().replaceAll("\\", "/");
        if(!docTemplatePath.contains(projectPath)){
            docTemplatePath = projectPath+"/"+docTemplatePath;
        }
        FileInputStream inputStream = new FileInputStream(new File(docTemplatePath));
        HSSFWorkbook workbook = new HSSFWorkbook(new POIFSFileSystem(inputStream));    
        HSSFSheet sheet = workbook.getSheetAt(0);
        
        int startRowIndex = (null == docWriteStartRowIndex?2:docWriteStartRowIndex);
        
        JSONArray jsonArr = (JSONArray) JSONArray.toJSON(object);
        for (int i = 0; i < jsonArr.size(); i++,startRowIndex++) {
            JSONObject jsonObj  = jsonArr.getJSONObject(i);
            for (int colIndex = 0; colIndex < fields.length; colIndex++) {
                HSSFCell tempCell = getHssfCell(sheet, startRowIndex, colIndex, true);
                
                tempCell.setCellValue(jsonObj.getString(fields[colIndex]));    
            }
        }

        return workbook;
    }
    /**
     * 此方法用于下载指定文件。
     * @param response 用于防止下载乱码,设置输出流的相关信息
     * @param filePath 如  1:/D:/saw_workspace/property/property-manage-ui/target/classes//templates/supplier/设施设备管理导入模板.xls
     *                      2:/templates/supplier/供应商管理导入模板.xls
     *                     filePath = this.getClass().getResource("/").getPath()+/templates/supplier/供应商管理导入模板.xls";
     * @return true 下载成功, false 下载失败
     */
    public static void download(String filePath){
        ServletOutputStream out = null;
        FileInputStream inputStream = null;
        filePath = filePath.replaceAll("\\", "/");
        String projectPath = ImpAndExpExcel.class.getResource("/").getPath().replaceAll("\\", "/");
        if(!filePath.contains(projectPath)){
            filePath = projectPath+"/"+filePath;
        }
        String fileName = filePath.substring(filePath.lastIndexOf("/")+1, filePath.length());
        try{
            inputStream = new FileInputStream(new File(filePath)); 
            HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/octet-stream; charset=UTF-8");
            response.addHeader("Content-Disposition", "attachment; filename=""+new String(fileName.getBytes("GB2312"),"ISO8859-1")+"";");// 
              
            out = response.getOutputStream();  
  
            int b = 0;  
            byte[] buffer = new byte[512];  
            while ((b=inputStream.read(buffer)) != -1){  
                out.write(buffer,0,b);  
            }  
            out.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                 if(inputStream != null){
                     inputStream.close();
                 }
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            try {
                if(out != null){
                    out.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }  
        }
    }
    
    // 获取xlsx单元格,不存在是否创建
    public static XSSFCell getXssfCell(XSSFSheet sheet, int rowIndex, int colIndex,
            boolean isCreate) {
        if (isCreate) {
            XSSFRow row = sheet.getRow(rowIndex);
            if (row == null) {
                row = sheet.createRow(rowIndex);
                row.setHeightInPoints(24);// 设置行的高度(单元格的高度)
            }
            XSSFCell cell = row.getCell(colIndex);
            if (cell == null) {
                cell = row.createCell(colIndex);
            }
            return cell;
        } else {
            return getXssfCell(sheet, rowIndex, colIndex);
        }
    }

    // 获取xlsx单元格
    public static XSSFCell getXssfCell(XSSFSheet sheet, int rowIndex, int colIndex) {
        XSSFRow row = sheet.getRow(rowIndex);
        if (row != null) {
            XSSFCell cell = row.getCell(colIndex);
            if (cell != null) {
                return cell;
            }
        }
        return null;
    }
    
    // 获取xlsx单元格Cell里面的值
    // 因为cell单元格有格式,所以针对不同的格式取值
    public static String getXssfCellValue(XSSFCell cell) {
        String cellValue = "";
        if(null==cell) {
            return cellValue;
        }
        switch (cell.getCellType()) {
            case XSSFCell.CELL_TYPE_STRING:// 字符串类型
                cellValue = cell.getStringCellValue();
                if (cellValue.trim().equals("") || cellValue.trim().length() <= 0)
                    cellValue = "";
                break;
            case XSSFCell.CELL_TYPE_NUMERIC: // 数值类型
                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                    Date d = cell.getDateCellValue();
                    if (d != null) {
                        cellValue = DateTimeUtils.getDate(d);
                    } else {
                        cellValue = "";
                    }
                } else {
                    cellValue = cell.getNumericCellValue() + "";
                    if(cellValue.contains(".")){
                        cellValue = cellValue.substring(0, cellValue.indexOf("."));
                    }
                }
                break;
            case HSSFCell.CELL_TYPE_FORMULA: // 公式
                try{
                    cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
                    cellValue = String.valueOf(cell.getNumericCellValue());
                }catch (Exception e) {
                    try{
                        cellValue = String.valueOf(cell.getStringCellValue());
                    }catch(Exception e2){
                        cellValue ="";
                    }
                }
                break;
            case HSSFCell.CELL_TYPE_BLANK:
                break;
            case HSSFCell.CELL_TYPE_BOOLEAN:
                cellValue = String.valueOf(cell.getBooleanCellValue());
                break;
            case HSSFCell.CELL_TYPE_ERROR:
                break;
            default:
                break;
        }
        if(cellValue!=null) {
            cellValue = cellValue.trim();
        }
        return cellValue;
    }
    
    // 获取xls单元格,不存在是否创建
    public static HSSFCell getHssfCell(HSSFSheet sheet, int rowIndex, int colIndex,
            boolean isCreate) {
        if (isCreate) {
            HSSFRow row = sheet.getRow(rowIndex);
            if (row == null) {
                row = sheet.createRow(rowIndex);
                row.setHeightInPoints(24);// 设置行的高度(单元格的高度)
            }
            HSSFCell cell = row.getCell(colIndex);
            if (cell == null) {
                cell = row.createCell(colIndex);
            }
            return cell;
        } else {
            return getHssfCell(sheet, rowIndex, colIndex);
        }
    }

    // 获取xls单元格
    public static HSSFCell getHssfCell(HSSFSheet sheet, int rowIndex, int colIndex) {
        HSSFRow row = sheet.getRow(rowIndex);
        if (row != null) {
            HSSFCell cell = row.getCell(colIndex);
            if (cell != null) {
                return cell;
            }
        }
        return null;
    }

    // 获取xls单元格Cell里面的值
    // 因为cell单元格有格式,所以针对不同的格式取值
    public static String getHssfCellStringValue(HSSFCell cell) {
        String cellValue = "";
        switch (cell.getCellType()) {
        case HSSFCell.CELL_TYPE_STRING:// 字符串类型
            cellValue = cell.getStringCellValue();
            if (cellValue.trim().equals("") || cellValue.trim().length() <= 0)
                cellValue = " ";
            break;
        case HSSFCell.CELL_TYPE_NUMERIC: // 数值类型
            if (HSSFDateUtil.isCellDateFormatted(cell)) {
                Date d = cell.getDateCellValue();
                if (d != null) {
                    cellValue = DateTimeUtils.getDate(d);
                } else {
                    cellValue = "";
                }
            } else {
                cellValue = cell.getNumericCellValue() + "";
                if(cellValue.contains(".")){
                    cellValue = cellValue.substring(0, cellValue.indexOf("."));
                }
            }
            break;
        case HSSFCell.CELL_TYPE_FORMULA: // 公式
            try{
                cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
                cellValue = String.valueOf(cell.getNumericCellValue());
            }catch (Exception e) {
                try{
                    cellValue = String.valueOf(cell.getStringCellValue());
                }catch(Exception e2){
                    cellValue ="";
                }
            }
            break;
        case HSSFCell.CELL_TYPE_BLANK:
            cellValue = " ";
            break;
        case HSSFCell.CELL_TYPE_BOOLEAN:
            break;
        case HSSFCell.CELL_TYPE_ERROR:
            break;
        default:
            break;
        }
        return cellValue;
    }
    
    public static boolean isRequired(String checkFiled, String[] requireds) {
        if(StringUtils.isEmpty(checkFiled) || ArrayUtils.isEmpty(requireds)) {
            return false;
        }
        for(String required : requireds) {
            if(required.equals(checkFiled)) {
                return true;
            }
        }
        return false;
    }
}

模板样子

原文地址:https://www.cnblogs.com/zwcry/p/8484147.html