Apache POI操作Excel表格

Apache POI操作Excel表格

1、引入依赖包

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.15</version>
</dependency>

2、使用封装类生成Excel文件

package edu.beihua.crm.Commons;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.HorizontalAlignment;

import java.io.*;

public class Apache_POI {
    public static void main(String[] args) {
        //创建HSSFWorkbook对象,对应一个excel文件
        HSSFWorkbook wb = new HSSFWorkbook();
        //创建sheet页面
        HSSFSheet sheet = wb.createSheet("学生列表");
        //创建行 使用sheet创建HSSFRow对象,对应sheet中的一行
        HSSFRow row = sheet.createRow(0);//行号:从0 开始,依次增加
        //使用行对象 创建HSSFCell列对象,对应行row中的列
        HSSFCell cell = row.createCell(0);//列的编号:从0开始,依次增加
        cell.setCellValue("学号");

        cell = row.createCell(1);
        cell.setCellValue("姓名");

        cell = row.createCell(2);
        cell.setCellValue("年龄");

        cell = row.createCell(3);
        cell.setCellValue("班级");

        HSSFCellStyle cellStyle = wb.createCellStyle();
                      cellStyle.setAlignment(HorizontalAlignment.CENTER);


        for (int i = 1; i < 11 ; i++) {
            row = sheet.createRow(i);

             cell = row.createCell(0);
             cell.setCellStyle(cellStyle);
             cell.setCellValue(101+i);

            cell = row.createCell(1);
            cell.setCellValue("TomCAT LINA"+i);

            cell = row.createCell(2);
            cell.setCellValue(20+i);

            cell = row.createCell(3);
            cell.setCellValue("A"+i);
        }
        //调用工具函数生成excel文件
        FileOutputStream of = null;
        try {
            //目录必须实现存在 否者会出错
           of =  new FileOutputStream("E:\\实习技术复习\\CRM\\crm_project\\src\\test\\java\\student.xls");
            wb.write(of);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

3、使用POI读入时间时出现了double类型数据,时间导入格式被转化成double格式

错误描述:之前使用的是获取cell里面的类型只要等于 HSSFCell.CELL_TYPE_NUMERIC,就直接返回成 cell.getNumericCellValue()+""

return cell.getNumericCellValue()+"";

image-20230504143508595

如同这样的日期被上传成了4893.0这样的Double数字。解决方式,编写一个单独的cell类型读取公共类。

 public static String getCellValueForString(HSSFCell cell){
        int ty = cell.getCellType();
        if (ty == HSSFCell.CELL_TYPE_STRING){
            return cell.getStringCellValue();
        }else if (ty == HSSFCell.CELL_TYPE_NUMERIC){
            String value = "";
            if (HSSFDateUtil.isCellDateFormatted(cell)) {// 日期类型
                // 短日期转化为字符串
                Date date = cell.getDateCellValue();
                if (date != null) {
                    // 标准0点 1970/01/01 08:00:00
                    if (date.getTime() % 86400000 == 16 * 3600 * 1000 && cell.getCellStyle().getDataFormat() == 14) {
                        value = new SimpleDateFormat("yyyy-MM-dd").format(date);
                    } else {
                        value = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
                    }
                }
            } else {// 数值
                //System.out.println("Value:"+cell.getNumericCellValue());
                String numberStr = new HSSFDataFormatter().formatCellValue(cell);
                // 货币格式,如:1,200.00
                if (numberStr.contains(",")) {
                    numberStr = numberStr.replace(",", "");
                }
                if (numberStr.contains("E")) {    // 科学计算法
                    numberStr = new DecimalFormat("0").format(cell.getNumericCellValue());    //4.89481368464913E14还原为长整数
                    value = Long.parseLong(numberStr)+"";
                } else {
                    if (numberStr.contains(".")) {    // 小数
                        value = Double.parseDouble(numberStr) + "";
                    } else {    // 转换为整数
                        value = Long.parseLong(numberStr)+ "";
                    }
                }
            }
            return value;
        }else if (ty == HSSFCell.CELL_TYPE_BOOLEAN){
           
            return cell.getBooleanCellValue()+"";
        } else if (ty == HSSFCell.CELL_TYPE_FORMULA) {
            return cell.getCellFormula();
        }else {
            return "";
        }
    }

根据资料可知,CELL_TYPE_NUMERIC总的包含了以下类型,我们需要单独的进行单独处理

CELL_TYPE_NUMERIC是Apache POI中单元格类型之一,表示数值类型的单元格。具体包含以下类型:

  1. 整型数值类型,例如:1、2、3等。
  2. 浮点数值类型,例如:1.2、3.14159等。
  3. 百分数类型,例如:0.75、1.23%等。
  4. 科学计数法类型,例如:3.14E+2、2.0E-3等。
  5. 日期和时间类型,例如:42050.5、0.25等。

需要注意的是,虽然日期和时间值可以被表示为数值类型,但是它们的值和含义与普通的数值类型不同。因此,在读取单元格时,需要通过调用DateUtil类中的静态方法来判断单元格是否包含日期或时间类型的值,然后使用相应的方法来获取日期或时间值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明天码上有钱啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值