poi处理Excel数据

news/2024/7/21 6:46:36 标签: mysql, java, excel

最近做项目,有一个上传excel文件,将文件中的数据存储到数据库中,遇到几个问题。

1.批量插入数据报错

如果列表为空,MYSQL执行批量插入时会报错,在进行批量插入之前,需要进行判断,如果需要保存的数据列表为空或者是list.size()=0,则不要进行插入操作

2.批量插入数据,对于重复数据,如果不想重复保存的情况(唯一性约束)

唯一性约束:如果不是主键的话,可以选择唯一性约束,可以选择一个护着多个变量来确定数据的唯一性

<!--唯一性约束-->
alter table 表名 add CONSTRAINT billId UNIQUE(bill_id);

alter table 表名 add CONSTRAINT uniqueKey UNIQUE(user_id,bill_id);

insert into 表名 
  (col1,col2...) 
values
  (val1,val2...)
on DUPLICATE key UPDATE user_id,bill_id

3.Excel单元格日期格式的判断

java">CellType cellType = cell.getCellTypeEnum();
if (cellType == CellType.NUMERIC){
	//条件为真,是日期格式数据
    if (DateUtil.isCellDateFormatted(cell)){
    	//返回数据是java.util.Date类型
        return cell.getDateCellValue();
    }
    //返回数据是double类型
    return cell.getNumericCellValue();
}

4.BigDecimal与double的坑

直接拿double类型数据来初始化BigDecimal类型的变量,会导致精度问题

java">double num = 3.3;
BigDecimal bigDecimal = new BigDecimal(num);
//输出结果是
//3.2999999999999.。。。。。。

从网上找了一通,算是找到一个方案吧
将double类型转换为字符串,用它来初始化BigDecimal类型的变量,不会出现精度问题

java">BigDecimal bigDecimal = new BigDecimal(Double.toString(num));
//输出结果
//3.3

5.时间格式化

在格式化时间时,把模板yyyy-MM-dd HH:mm:ss写成了yyyy-MM-dd hh:mm:ss,导致输出一直12小时制,这个需要注意,HH是24小时制,hh是12小时制时间

6.数据上下转型的问题

用poi工具包导入Excel文件里的数据时,由于写了工具类,每个单元格返回数据都向上转型成了Object类型,而对具体数据进行操作时,又需要进行向下转型。
向上转型是安全的,不会有问题,因为任何类型都继承自Object(向上转型不一定是转型成Object类,只要是相应的父类就可以),但是向下转型不是,容易出错,而且也不能保证客户一定按照要求对单元格进行书写,所以需要对数据进行类型判断instanceof,才能向下转型,否则容易出错,例如:

java">if (object instanceof Double){
   return (double)object;
} 

http://www.niftyadmin.cn/n/875905.html

相关文章

java判断单链表是否是回文链表

判断一个链表是不是回文链表&#xff0c;可以借助栈或者是快慢指针的方法 这些都是根据左程云的算法课程整理出来的代码 1.借助栈结构&#xff0c;先进后出的特性 将链表遍历并且一次入栈&#xff0c;再将链表重新遍历&#xff0c;并将栈弹出&#xff0c;依次作对比&#xff…

java打印有序链表的公共部分

【题目】 给定2个有序链表的头指针head1和head2&#xff0c;打印两个链表的公共部分 【要求】 两个量表总长度为N&#xff0c;时间复杂度为O(N),二娃空间复杂度O(1) public class Node{public int value;public Node next;public Node(int value) {this.value value;} }pri…

mac全选文字的快捷键_Mac隐藏的文本操作技巧

Mac的快捷键技巧非常多&#xff0c;很多人也只是知道一些自己常用到的快捷键。本篇文章主要总结了文本编辑的相关快捷键操作&#xff0c;可能对经常写作或处理文本信息的Mac用户来说比较有帮助&#xff0c;对普通用户来说用处不大&#xff0c;所以大家根据需求阅读~光标移动Mac…

java单向链表按某值划分成左边小,中间相等,右边大的形式

【题目】 给定一个单链表的头节点head&#xff0c;节点值类型是整型&#xff0c;在给定一个整数pivot&#xff0c;实现一个调整链表的函数&#xff0c;将链表调整为&#xff0c;左边部分是小于pivot的节点&#xff0c;中间是等于的&#xff0c;右侧是大于的 【要求】 调整后节点…

java复制含有随机指针节点的链表

【题目】 有一种特殊的链表节点类&#xff0c;如下所示 class Node{int value;Node next;Node rand;Node(int val){value val;} }rand指针是单链表节点结构中新增的指针&#xff0c;rand可能指向链表中的任意一个结点&#xff0c;或者是null&#xff0c; 给定一个由Node节点类…

java两个单链表相交问题

【题目】 给定2个可能有环&#xff0c;可能无环的单链表&#xff0c;头节点head1和head2,请实现一个函数&#xff0c; 如果两链表相交&#xff0c;返回相交的第一个节点&#xff0c;如果不相交&#xff0c;返回null 【要求】 如果两个链表的总长度是N&#xff0c;时间复杂度是O…

修改表的state值_[SwiftUI 知识碎片] 修改程序状态

译自 Modifying program state更多内容&#xff0c;欢迎关注公众号&#xff1a;Swift花园喜欢文章&#xff1f;不如来个 ➕三连&#xff1f;关注专栏&#xff0c;关注我 修改程序状态坊间流传着“视图是它们状态的函数”的说法&#xff0c;这个描述一开始对你来说可能没有什么感…

简单排序(选择,冒泡,插入,二分查找)

选择排序 arr[0]和其余数字依次比较&#xff0c;得到最小的&#xff0c;确定好arr[0]是最小的数字 再到arr[1]的位置&#xff0c;arr[1]和剩下后面的其余数字比较&#xff0c;比它小就交换&#xff0c;直到比较到最后一个数字&#xff0c;第二小的数字确定下来 再到arr[2],以此…