zoukankan      html  css  js  c++  java
  • JavaPOI处理Excel

       java处理excel,心得分享如下,如有不妥或者需要补充的地方,敬请指出,欢迎随时交流

      1.加载excel,获得workbook对象

    fileTemp = new File(pathOfMExcel);
    ins = new FileInputStream(fileTemp);
    wb = WorkbookFactory.create(ins);

    ins.close();

     2.获得workbook对象后,既可以操作sheet和单元格了

    获得sheet对象

    Sheet sheet = wb.getSheetAt(k);//k=0表示第一个sheet

    获得行对象(根据行对象就可以获得单元格对象了)

    Row row = sheet.getRow(7);//第6行

    Cell cell =row.getCell(2); //第1列

    3.对于单元格的操作可以参照API即可。

    4.强制刷新sheet公式,

      excel里面可能隐含公式,更新和excel公式相关的单元格的时候需要更新。

    sheet_1.setForceFormulaRecalculation(true);//sheet_1为sheet对象
    5.对于单元格的设置值,我是如此处理的:

     先设置单元格全为String类型,然后根据需要,将某一列设置为数字,但是这列也有可能存在空和Sring类型,简单说,就是这列如果是数字需要设置为number类型,参与excel的公式计算,然后可以采用下面进行判断:

    if (cell3.getCellType() == 3) {//空类型
    continue;
    }

    if (cell3.getCellType() == 1 && cell3.getCellType() != 3) {//string类型
    if (isNumberCheck(cell3.getStringCellValue())) {//判断是否为数字
     cell3.setCellValue(Double.parseDouble(cell3.getStringCellValue()));//如果为数字,设置为number
    } else {
    continue;
    }

    if (cell3.getCellType() == 0 && cell3.getCellType() != 3) {//数字类型
        if (isNumberCheck(cell3.getStringCellValue())) {//判断是否为数字(单元格格式为数字,值不一定)
               cell3.setCellValue(Double.parseDouble(cell3.getStringCellValue()));
    } else {
    continue;
    }

    6.对于单元格日期全变为数字的处理:

    excel的日期起始业数字数字类型的一种,所以如下处理,免得最后都成为数字:

    if (0 == cell.getCellType(){//数字类型

       if (DateUtil.isCellDateFormatted(cell)) {
         // 用于转化为日期格式
          Date d = (Date) cell.getDateCellValue();
          DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
           return formater.format(d);
         }

    }

    7.对于百分号的处理,我就要显示为百分数的形式:

    double d = Double.valueOf(pertage);
    DecimalFormat df = new DecimalFormat("#%");
    df.setRoundingMode(RoundingMode.DOWN);
    return df.format(d);

    8.将已存在的Excel修改,最后写入excel:

    out = new FileOutputStream(fileTemp);//fileTemp第1点提到的
    wb.write(out);
    out.close();

    很奇怪的是,如果fileTemp使用一开始加载excel就初始化的File流,那么执行wb.write(out);是很快的,如果再new一个File流,然后用再使用FileOutputStream加载,最后wb.write(out)的时候会极度慢,这也是暂时很疑惑的一点。

  • 相关阅读:
    深入理解java:2.3.1. 并发编程concurrent包 之Atomic原子操作(循环CAS)
    深入理解java:2.3. 并发编程 java.util.concurrent包
    深入理解java:2.2. 同步锁Synchronized及其实现原理
    深入理解java:2.1. volatile的使用及其原理
    深入理解java:2. 多线程机制
    深入理解java:1.3.2 JVM监控与调优
    深入理解java:1.3.1 JVM内存区域的划分(运行时数据区)
    深入理解java:1.3. 垃圾收集
    深入理解java:1.2. 字节码执行引擎
    线程的等待与唤醒,实现if...else里面的值交互依次输出
  • 原文地址:https://www.cnblogs.com/liyunzhouts/p/7471600.html
Copyright © 2011-2022 走看看