zoukankan      html  css  js  c++  java
  • 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;
        }
    }

    模板样子

  • 相关阅读:
    重写DEV的DateEdit控件的类只选择年月
    C# 模拟from表单提交webservice
    xpo 条件查询
    bzoj1001 [BeiJing2006]狼抓兔子
    bzoj3631 [JLOI2014]松鼠的新家
    bzoj2456 mode
    bzoj3156防御准备
    bzoj2424 [HAOI2010]订货
    [BZOJ3473]字符串
    BZOJ 3993 [SDOI2015]星际战争
  • 原文地址:https://www.cnblogs.com/zwcry/p/8484147.html
Copyright © 2011-2022 走看看