导入导出Excel-JAVA

/**
 * 封装对excel的操作,包括本地读写excel和流中输出excel 有参构造函数参数为excel的全路径
 * 
 */
public class ExcelUtils {

    // excel文件路径
    private String path = "";

    /**
     * 无参构造函数 默认
     */
    public ExcelUtils() {

    }

    /**
     * 有参构造函数
     * 
     * @param path
     *            excel路径
     */
    public ExcelUtils(String path) {
        this.path = path;
    }

    /**
     * 在磁盘生成一个含有内容的excel,路径为path属性
     * 
     * @param sheetName
     *            导出的sheet名称
     * @param fieldName
     *            列名数组
     * @param data
     *            数据组
     * @throws IOException
     */
    public void makeExcel(String sheetName, String[] fieldName, List data, List counts) throws IOException {
        // 在内存中生成工作薄
        HSSFWorkbook workbook = makeWorkBook(sheetName, fieldName, data, counts);
        // 截取文件夹路径
        String filePath = path.substring(0, path.lastIndexOf("\\"));
        // 如果路径不存在,创建路径
        File file = new File(filePath);
        // System.out.println(path+"-----------"+file.exists());
        if (!file.exists())
            file.mkdirs();
        FileOutputStream fileOut = new FileOutputStream(path);
        workbook.write(fileOut);
        fileOut.close();
    }

    /**
     * 在输出流中导出excel
     * 
     * @param excelName
     *            导出的excel名称 包括扩展名
     * @param sheetName
     *            导出的sheet名称
     * @param fieldName
     *            列名数组
     * @param data
     *            数据组
     * @param counts 
     * @param response
     *            response
     */
    public static void makeStreamExcel(String excelName, String sheetName, String[] fieldName, List data, List counts, HttpServletResponse response) {
        OutputStream os = null;
        try {
            response.reset(); // 清空输出流
            os = response.getOutputStream(); // 取得输出流
            response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(excelName, "UTF-8") + ".xls"); // 设定输出文件头
            response.setContentType("application/msexcel"); // 定义输出类型
        } catch (IOException ex) {// 捕捉异常
            System.out.println("流操作错误:" + ex.getMessage());
        }
        // 在内存中生成工作薄
        HSSFWorkbook workbook = makeWorkBook(sheetName, fieldName, data, counts);
        try {
            os.flush();
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("Output is closed");
        }
        finally {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * 根据条件,生成工作薄对象到内存
     * 
     * @param sheetName
     *            工作表对象名称
     * @param fieldName
     *            首列列名称
     * @param data
     *            数据
     * @param counts 
     * @return HSSFWorkbook
     */
    public static HSSFWorkbook makeWorkBook(String sheetName, String[] fieldName, List<Object[]> data, List<Object[]> counts) {
        // 产生工作薄对象
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 产生工作表对象
        HSSFSheet sheet = workbook.createSheet();
        sheet.setDefaultRowHeightInPoints(25);
        sheet.setDefaultColumnWidth(16);
        // 为了工作表能支持中文,设置字符集为UTF_16
        workbook.setSheetName(0, sheetName);
        // 产生一行
        HSSFRow row = sheet.createRow(0);
        // 产生单元格
        HSSFCell cell;
        //设置样式 
        HSSFCellStyle style = workbook.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        HSSFFont font = workbook.createFont();
        font.setFontHeightInPoints((short) 12);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        style.setFont(font);
        HSSFDataFormat format = workbook.createDataFormat();
        style.setDataFormat(format.getFormat("@"));

        // 写入各个字段的名称
        for (int i = 0; i < fieldName.length; i++) {
            // 创建第一行各个字段名称的单元格
            cell = row.createCell(i);
            // 为了能在单元格中输入中文,设置字符集为UTF_16
            // cell.setEncoding(HSSFCell.ENCODING_UTF_16);
            // 给单元格内容赋值
            cell.setCellStyle(style);
            cell.setCellValue(new HSSFRichTextString(fieldName[i]));
        }
        HSSFCellStyle style2 = workbook.createCellStyle();
        style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
        HSSFFont font2 = workbook.createFont();
        font2.setFontHeightInPoints((short) 11);
        font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
        style2.setFont(font2);
        style2.setDataFormat(format.getFormat("@"));
        // 写入各条记录,每条记录对应excel表中的一行
        for (int i = 0; i < data.size(); i++) {
            Object[] tmp = data.get(i);
            // 生成一行
            row = sheet.createRow(i + 1);
            for (int j = 0; j < tmp.length; j++) {
                cell = row.createCell(j);

                if(tmp[j] == null){
                    cell.setCellType(HSSFCell.CELL_TYPE_BLANK);
                } else if(tmp[j] instanceof Boolean){
                    cell.setCellType(HSSFCell.CELL_TYPE_BOOLEAN);
                    cell.setCellValue((Boolean)tmp[j]);
                }else if(tmp[j] instanceof Number){
                    Number value = (Number)tmp[j];
                    cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
                    cell.setCellValue(value.doubleValue());
                }else{
                    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                    cell.setCellValue(String.valueOf(tmp[j]));
                }
                cell.setCellStyle(style2);
            }
        }
        //写入统计数据
        if (counts != null) {
            int rowNum = sheet.getLastRowNum();
            for (int i = 0; i < counts.size(); i++) {
                Object[] temp = counts.get(i);
                row = sheet.createRow(rowNum + i + 2);
                cell = row.createCell(0);
                cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                cell.setCellValue(temp[0] == null ? "" : String.valueOf(temp[0]));
                cell.setCellStyle(style);

                cell = row.createCell(1);
                cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                cell.setCellValue(temp[1] == null ? "" : String.valueOf(temp[1]));
                cell.setCellStyle(style2);
            }
        }
        return workbook;

    }

    public void write(int sheetOrder, int colum, int row, String content) throws Exception {
        Workbook workbook = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(path)));
        Sheet sheet = workbook.getSheetAt(sheetOrder);
        Row rows = sheet.createRow(row);
        Cell cell = rows.createCell(colum);
        cell.setCellValue(content);
        FileOutputStream fileOut = new FileOutputStream(path);
        workbook.write(fileOut);
        fileOut.close();

    }

    /**
     * 得到一个工作区最后一条记录的序号
     * 
     * @param sheetOrder
     *            工作区序号
     * @return int
     * @throws IOException
     */
    public int getSheetLastRowNum(int sheetOrder) throws IOException {
        Workbook workbook = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(path)));
        Sheet sheet = workbook.getSheetAt(sheetOrder);
        return sheet.getLastRowNum();
    }

    public String read(int sheetOrder, int colum, int row) throws Exception {
        Workbook workbook = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(path)));
        Sheet sheet = workbook.getSheetAt(sheetOrder);
        Row rows = sheet.getRow(row);
        Cell cell = rows.getCell(colum);
        String content = cell.getStringCellValue();
        return content;
    }

    /**
     * 根据path属性,在磁盘生成一个新的excel
     * 
     * @throws IOException
     */
    public void makeEmptyExcel() throws IOException {
        Workbook wb = new HSSFWorkbook();
        // 截取文件夹路径
        String filePath = path.substring(0, path.lastIndexOf("\\"));
        // 如果路径不存在,创建路径
        File file = new File(filePath);
        if (!file.exists())
            file.mkdirs();
        FileOutputStream fileOut = new FileOutputStream(filePath + "\\" + path.substring(path.lastIndexOf("\\") + 1));
        wb.write(fileOut);
        fileOut.close();
    }

    /**
     * 根据工作区序号,读取该工作去下的所有记录,每一条记录是一个String[]<br/>
     * 注意如果单元格中的数据为数字将会被自动转换为字符串<br/>
     * 如果单元格中存在除数字,字符串以外的其他类型数据,将会产生错误
     * 
     * @param sheetOrder
     *            工作区序号
     * @return
     * @throws IOException
     * @throws
     */
    public List<String[]> getDataFromSheet(int sheetOrder) throws IOException {
        Workbook workbook = new HSSFWorkbook(new POIFSFileSystem(new FileInputStream(path)));
        Sheet sheet = workbook.getSheetAt(sheetOrder);
        List<String[]> strs = new ArrayList<String[]>();
        // 注意得到的行数是基于0的索引 遍历所有的行
        // System.out.println(sheet.getLastRowNum());
        for (int i = 0; i <= sheet.getLastRowNum(); i++) {
            Row rows = sheet.getRow(i);
            String[] str = new String[rows.getLastCellNum()];
            // 遍历每一列
            for (int k = 0; k < rows.getLastCellNum(); k++) {
                Cell cell = rows.getCell(k);
                // 数字类型时
                if (0 == cell.getCellType()) {
                    // 用于格式化数字,只保留数字的整数部分
                    DecimalFormat df = new DecimalFormat("########");
                    str[k] = df.format(cell.getNumericCellValue());
                } else
                    str[k] = cell.getStringCellValue();
                // System.out.println(cell.getCellType()+"-------------"+str[k]);
            }
            strs.add(str);
        }
        return strs;
    }

    /**
     * 获得单元格内容
     * 
     * @param cell
     * @return
     */
    public static String getCellData(Cell cell) {
        String value = "";
        if (cell != null) {
            // 数字类型时
            if (0 == cell.getCellType()) {
                // 用于格式化数字,只保留数字的整数部分
                DecimalFormat df = new DecimalFormat("########");
                value = df.format(cell.getNumericCellValue());
            } else if (2 == cell.getCellType())
                return "";
            else
                value = cell.getStringCellValue();
            value = value.trim();
            if ("/".equals(value))
                value = "";
        }
        return value;
    }

    // 获取邮编
    public static String getCellYB(Cell cell) {
        String value = "";
        if (cell != null) {
            // 数字类型时
            if (0 == cell.getCellType()) {
                // 用于格式化数字,只保留数字的整数部分
                DecimalFormat df = new DecimalFormat("000000");
                value = df.format(cell.getNumericCellValue());
            } else if (2 == cell.getCellType())
                return "";
            else
                value = cell.getStringCellValue();
            value = value.trim();
            if ("/".equals(value))
                value = "";
        }
        return value;
    }

    public static List<Object[]> stringList2Object(List<String[]> data){
        List<Object[]> objList = new ArrayList<Object[]>();
        if(data != null && data.size() > 0){
            for(String[] row : data){
                objList.add(row);
            }
        }
        return objList;
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值