zoukankan      html  css  js  c++  java
  • ExeclUtil 工具类(poi + jxl)

    jxl 包:

    poi 包:

      使用:List<List<List<String>>> dataList = ExcelUtil.readExcelByPoi(file);//解析文件

      结构:sheet—列—行—String

    List<List<List<String>>> dataList = ExcelUtil.readExcelByPoi(file);

    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.text.DecimalFormat;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletResponse;
    
    import jxl.Cell;
    import jxl.CellType;
    import jxl.FormulaCell;
    import jxl.NumberCell;
    import jxl.Sheet;
    import jxl.SheetSettings;
    import jxl.Workbook;
    import jxl.format.Alignment;
    import jxl.format.Colour;
    import jxl.format.VerticalAlignment;
    import jxl.read.biff.BiffException;
    import jxl.write.Label;
    import jxl.write.WritableCellFormat;
    import jxl.write.WritableFont;
    import jxl.write.WritableSheet;
    import jxl.write.WritableWorkbook;
    import net.sf.jxls.exception.ParsePropertyException;
    import net.sf.jxls.transformer.XLSTransformer;
    
    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.openxml4j.exceptions.InvalidFormatException;
    import org.apache.poi.ss.usermodel.CellValue;
    import org.apache.poi.ss.usermodel.FormulaEvaluator;
    
    /**
     * @ClassName: ExcelUtil
     * @Description: jxl操作excel的工具类
     */
    public class ExcelUtil {
    
        private static DecimalFormat decimalFormat = new DecimalFormat("###################.###########");
        
        /**
         * @Title: exportToExcel
         * @Description: 导出excel
         * @param response
         * @param objData
         *            导出内容数组
         * @param sheetName
         *            导出工作表的名称
         * @param heads
         *            列对应的数据在Map中的key
         * @param columns
         *            导出Excel的表头数组
         * @return
         */
        public static int exportToExcel(HttpServletResponse response,
                List<Map<String, Object>> objData, String sheetName,
                List<String> columns, List<String> heads) {
            int flag = 0;
            // 声明工作簿jxl.write.WritableWorkbook
            WritableWorkbook wwb;
            try {
                // 根据传进来的file对象创建可写入的Excel工作薄
                OutputStream os = response.getOutputStream();
    
                wwb = Workbook.createWorkbook(os);
    
                /*
                 * 创建一个工作表、sheetName为工作表的名称、"0"为第一个工作表
                 * 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"
                 * 这样代码中的"0"就是sheet1、其它的一一对应 createSheet(sheetName,
                 * 0)一个是工作表的名称,另一个是工作表在工作薄中的位置
                 */
                WritableSheet ws = wwb.createSheet(sheetName, 0);
    
                SheetSettings ss = ws.getSettings();
                ss.setVerticalFreeze(1);// 冻结表头
    
                WritableFont font1 = new WritableFont(
                        WritableFont.createFont("微软雅黑"), 10, WritableFont.BOLD);
                WritableFont font2 = new WritableFont(
                        WritableFont.createFont("微软雅黑"), 9, WritableFont.NO_BOLD);
                WritableCellFormat wcf = new WritableCellFormat(font1);
                WritableCellFormat wcf2 = new WritableCellFormat(font2);
                WritableCellFormat wcf3 = new WritableCellFormat(font2);// 设置样式,字体
    
                // 创建单元格样式
                // WritableCellFormat wcf = new WritableCellFormat();
    
                // 背景颜色
                wcf.setBackground(jxl.format.Colour.YELLOW);
                wcf.setAlignment(Alignment.CENTRE); // 平行居中
                wcf.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直居中
                wcf3.setAlignment(Alignment.CENTRE); // 平行居中
                wcf3.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直居中
                wcf3.setBackground(Colour.LIGHT_ORANGE);
                wcf2.setAlignment(Alignment.CENTRE); // 平行居中
                wcf2.setVerticalAlignment(VerticalAlignment.CENTRE); // 垂直居中
    
                /*
                 * 这个是单元格内容居中显示 还有很多很多样式
                 */
                wcf.setAlignment(Alignment.CENTRE);
    
                // 判断一下表头数组是否有数据
                if (columns != null && columns.size() > 0) {
    
                    // 循环写入表头
                    for (int i = 0; i < columns.size(); i++) {
    
                        /*
                         * 添加单元格(Cell)内容addCell() 添加Label对象Label()
                         * 数据的类型有很多种、在这里你需要什么类型就导入什么类型 如:jxl.write.DateTime
                         * 、jxl.write.Number、jxl.write.Label Label(i, 0, columns[i],
                         * wcf) 其中i为列、0为行、columns[i]为数据、wcf为样式
                         * 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
                         */
                        ws.addCell(new Label(i, 0, columns.get(i), wcf));
                    }
    
                    // 判断表中是否有数据
                    if (objData != null && objData.size() > 0) {
                        // 循环写入表中数据
                        for (int i = 0; i < objData.size(); i++) {
    
                            // 转换成map集合{activyName:测试功能,count:2}
                            Map<String, Object> map = (Map<String, Object>) objData
                                    .get(i);
    
                            // 循环输出map中的子集:既列值
                            for (int j = 0; j < heads.size(); j++) {
                                ws.addCell(new Label(j, i + 1, String.valueOf(map
                                        .get(heads.get(j)) == null ? "" : map
                                        .get(heads.get(j)))));
                            }
                        }
                    } else {
                        flag = -1;
                    }
    
                    // 写入Exel工作表
                    wwb.write();
    
                    // 关闭Excel工作薄对象
                    wwb.close();
    
                    // 关闭流
                    os.flush();
                    os.close();
    
                    os = null;
                }
            } catch (IllegalStateException e) {
                System.err.println(e.getMessage());
            } catch (Exception ex) {
                flag = 0;
                ex.printStackTrace();
            }
    
            return flag;
        }
    
        /**
         * @Title: exportexcle
         * @Description: 下载excel
         * @param response
         * @param filename
         *            文件名 ,如:20110808.xls
         * @param listData
         *            数据源
         * @param sheetName
         *            表头名称
         * @param heads
         *            列对应的数据在Map中的key
         * @param columns
         *            列名称集合,如:{物品名称,数量,单价}
         */
        public static void exportexcle(HttpServletResponse response,
                String filename, List<Map<String, Object>> listData,
                String sheetName, List<String> columns, List<String> heads) {
            // 调用上面的方法、生成Excel文件
            response.setContentType("application/vnd.ms-excel");
            try {
                response.setHeader("Content-Disposition", "attachment;filename="
                // + new String(filename.getBytes("gb2312"), "ISO8859-1")
                        + filename + ".xls");
    
                exportToExcel(response, listData, sheetName, columns, heads);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        
        /**
         * @Title: exportExcleByTemplate 
         * @Description: 根据模板导出Excel文件
         * @param response
         * @param templateFilePath 模板文件路径包括模板名称和扩展名
         * @param beanParams 导出数据
         * @param resultFileName 导出文件名称和扩展名
         * @throws UnsupportedEncodingException 
         */
        public static void exportExcleByTemplate(HttpServletResponse response, String templateFilePath, Map<String,Object> beanParams, String resultFileName) throws UnsupportedEncodingException {
            //设置响应  
            response.setHeader("Content-Disposition", "attachment;filename=" + new String(resultFileName.getBytes("UTF-8"), "ISO8859-1" ));  
            response.setContentType("application/vnd.ms-excel");
            
            //创建XLSTransformer对象  
            XLSTransformer transformer = new XLSTransformer();  
            
            InputStream in=null;  
            OutputStream out=null;  
            
            try {  
                in=new BufferedInputStream(new FileInputStream(templateFilePath));  
                org.apache.poi.ss.usermodel.Workbook workbook=transformer.transformXLS(in, beanParams);  
                out=response.getOutputStream();  
                //将内容写入输出流并把缓存的内容全部发出去  
                workbook.write(out);  
                out.flush();  
            } catch (InvalidFormatException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            } finally {  
                if (in!=null){try {in.close();} catch (IOException e) {}}  
                if (out!=null){try {out.close();} catch (IOException e) {}}  
            } 
            
        }
        
        /**
         * @Title: createExcel 
         * @Description: 根据模板生成Excel文件
         * @param srcFilePath 模板文件路径
         * @param beanParams 模板中存放的数据
         * @param destFilePath 生成的文件路径
         */
        public static void createExcel(String srcFilePath, Map<String,Object> beanParams, String destFilePath){  
            //创建XLSTransformer对象  
            XLSTransformer transformer = new XLSTransformer();  
            try {  
                //生成Excel文件  
                transformer.transformXLS(srcFilePath, beanParams, destFilePath);  
            } catch (ParsePropertyException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            } catch (InvalidFormatException e) {
                e.printStackTrace();
            }  
        }
    
        /**
         * @Title: readExcel
         * @Description: 读取Excel文件的内容
         * @param file
         *            待读取的文件
         * @return
         */
        public static List<List<List<String>>> readExcel(File file)
                throws BiffException, IOException {
            Workbook workBook = Workbook.getWorkbook(file);
    
            if (workBook == null)
                return null;
    
            return getDataInWorkbook(workBook);
        }
    
        private static List<List<List<String>>> getDataInWorkbook(Workbook workBook) {
            // 获得了Workbook对象之后,就可以通过它得到Sheet(工作表)对象了
            Sheet[] sheet = workBook.getSheets();
    
            List<List<List<String>>> dataList = new ArrayList<List<List<String>>>();
    
            if (sheet != null && sheet.length > 0) {
                // 对每个工作表进行循环
                for (int i = 0; i < sheet.length; i++) {
                    List<List<String>> rowList = new ArrayList<List<String>>();
                    // 得到当前工作表的行数
                    int rowNum = sheet[i].getRows();
                    int colNum = sheet[i].getColumns();
                    for (int j = 0; j < rowNum; j++) {
                        // 得到当前行的所有单元格
                        Cell[] cells = sheet[i].getRow(j);
                        if (cells != null && cells.length > 0) {
                            List<String> cellList = new ArrayList<String>();
                            // 对每个单元格进行循环
                            for (int k = 0; k < colNum; k++) {
                                Cell cell = sheet[i].getCell(k, j);
                                String cellValue = "";
                                // 判断单元格的值是否是数字
                                if (cell.getType() == CellType.NUMBER) {
                                    NumberCell numberCell = (NumberCell) cell;
                                    double value = numberCell.getValue();
                                    cellValue = decimalFormat.format(value);
                                } else if (cell.getType() == CellType.NUMBER_FORMULA
                                        || cell.getType() == CellType.STRING_FORMULA
                                        || cell.getType() == CellType.BOOLEAN_FORMULA
                                        || cell.getType() == CellType.DATE_FORMULA
                                        || cell.getType() == CellType.FORMULA_ERROR) {
                                    FormulaCell nfc = (FormulaCell) cell;
                                    cellValue = nfc.getContents();
                                } else {
                                    // 读取当前单元格的值
                                    cellValue = cell.getContents();
                                    // 特殊字符处理
                                    cellValue = excelCharaterDeal(cellValue);
                                }
                                // 去掉空格
                                cellList.add(cellValue.trim());
                            }
                            rowList.add(cellList);
                        }
                    }
                    dataList.add(rowList);
                }
            }
            // 最后关闭资源,释放内存
            workBook.close();
    
            return dataList;
        }
    
        /**
         * @Title: toToken
         * @Description: 除去字符串中指定的分隔符
         * @param s
         *            字符串
         * @param val
         *            指定的分隔符
         * @return
         */
        private static String toToken(String s, String val) {
            if (s == null || s.trim().equals("")) {
                return s;
            }
            if (val == null || val.equals("")) {
                return s;
            }
            StringBuffer stringBuffer = new StringBuffer();
            String[] result = s.split(val);
            for (int x = 0; x < result.length; x++) {
                stringBuffer.append(" ").append(result[x]);
            }
            return stringBuffer.toString();
    
        }
    
        /**
         * @Title: excelCharaterDeal
         * @Description: Excel特殊字符处理
         * @param str
         *            字符串
         * @return
         */
        private static String excelCharaterDeal(String str) {
            String[] val = { "-", "_", "/" };// 定义特殊字符
            for (String i : val) {
                str = toToken(str, i);
            }
            return str;
        }
        
        /**
         * @Title: readExcelTitle 
         * @Description: 读取Excel表格表头的内容
         * @param file 待读取的文件
         * @return 表头内容的数组
         * @throws Exception
         */
        public String[] readExcelTitle(File file) throws Exception {
            InputStream is = new FileInputStream(file);
            HSSFWorkbook wb = new HSSFWorkbook(is);
            HSSFSheet sheet = wb.getSheetAt(0);
            HSSFRow row = sheet.getRow(0);
            // 标题总列数
            int colNum = row.getPhysicalNumberOfCells();
            String[] title = new String[colNum];
            for (int i = 0; i < colNum; i++) {
                title[i] = getCellFormatValue(row.getCell(i));
            }
            return title;
        }
    
        /**
         * @Title: readExcelByPoi 
         * @Description: 通过POI读取Excel文件的内容
         * @param file 待读取的文件
         * @return
         * @throws Exception
         */
        public static List<List<List<String>>> readExcelByPoi(File file) throws Exception {
            List<List<List<String>>> dataList = new ArrayList<List<List<String>>>();
            
            InputStream is = new FileInputStream(file);
            HSSFWorkbook wb = new HSSFWorkbook(is);
            
            int sheetNum = wb.getNumberOfSheets();
            
            for (int i = 0; i < sheetNum; i++) {
                HSSFSheet sheet = wb.getSheetAt(i);
                if (sheet == null) {
                    continue;
                }
                // 得到总行数
                int rowNum = sheet.getLastRowNum();
                
                HSSFRow row = sheet.getRow(0);
                if (row == null) {
                    continue;
                }
                // 得到总列数
                int colNum = row.getPhysicalNumberOfCells();
                
                List<List<String>> rowList = new ArrayList<List<String>>();
                // 循环行Row
                for (int j = 0; j <= rowNum; j++) {
                    row = sheet.getRow(j);
                    if (row == null) {
                        continue;
                    }
                    List<String> cellList = new ArrayList<String>();
                    int k = 0;
                    while (k < colNum) {
                        String cellValue = getCellFormatValue(row.getCell(k)).trim();
                        cellList.add(cellValue);
                        k++;
                    }
                    rowList.add(cellList);
                }
                dataList.add(rowList);
            }
            
            return dataList;
        }
    
        /**
         * @Title: getCellFormatValue 
         * @Description: 获取单元格数据内容为字符串类型的数据
         * @param cell Excel单元格
         * @return 单元格数据内容
         */
        private static String getCellFormatValue(HSSFCell cell) {
            String cellvalue = "";
            if (cell != null) {
                // 判断当前Cell的Type
                switch (cell.getCellType()) {
                // 如果当前Cell的Type为NUMERIC
                case HSSFCell.CELL_TYPE_NUMERIC:
                    // 取得当前Cell的数值
                    cellvalue = decimalFormat.format(cell.getNumericCellValue());
                    break;
                case HSSFCell.CELL_TYPE_FORMULA: {
                    // 判断当前的cell是否为Date
                    if (HSSFDateUtil.isCellDateFormatted(cell)) {
                        // 如果是Date类型则,转化为Data格式
                        
                        //方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00
                        //cellvalue = cell.getDateCellValue().toLocaleString();
                        
                        //方法2:这样子的data格式是不带带时分秒的:2011-10-12
                        Date date = cell.getDateCellValue();
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                        cellvalue = sdf.format(date);
                    }
                    else {
                        FormulaEvaluator evaluator = cell.getSheet().getWorkbook().getCreationHelper().createFormulaEvaluator();
                        CellValue cellValue = evaluator.evaluate(cell);
                        switch (cellValue.getCellType()) {
                        case org.apache.poi.ss.usermodel.Cell.CELL_TYPE_BOOLEAN:
                            cellvalue = String.valueOf(cellValue.getBooleanValue());
                            break;
                        case org.apache.poi.ss.usermodel.Cell.CELL_TYPE_NUMERIC:
                            cellvalue = decimalFormat.format(cellValue.getNumberValue());
                            break;
                        case org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING:
                            cellvalue = String.valueOf(cellValue.getStringValue());
                            break;
                        case org.apache.poi.ss.usermodel.Cell.CELL_TYPE_BLANK:
                            break;
                        case org.apache.poi.ss.usermodel.Cell.CELL_TYPE_ERROR:
                            break;
                        }
                    }
                    break;
                }
                // 如果当前Cell的Type为STRIN
                case HSSFCell.CELL_TYPE_STRING:
                    // 取得当前的Cell字符串
                    cellvalue = cell.getRichStringCellValue().getString();
                    break;
                // 默认的Cell值
                default:
                    cellvalue = "";
                }
            } else {
                cellvalue = "";
            }
            return cellvalue;
        }
    }
  • 相关阅读:
    use paramiko to connect remote server and execute command
    protect golang source code
    adjust jedi vim to python2 and python3
    install vim plugin local file offline
    add swap file if you only have 1G RAM
    datatables hyperlink in td
    django rest framework custom json format
    【JAVA基础】网络编程
    【JAVA基础】多线程
    【JAVA基础】String类的概述和使用
  • 原文地址:https://www.cnblogs.com/ai211234/p/5945087.html
Copyright © 2011-2022 走看看