通过excel导入数据

1.引入依赖

XML 复制代码
 <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.5</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.5</version>
        </dependency>
        <!--&lt;!&ndash; Poi-tl Word 模板引擎&ndash;&gt;-->
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.12.2</version>
        </dependency>

示例代码

java 复制代码
public List<Item> importItem(InputStream inputStream) throws IOException {

    Workbook wb = new XSSFWorkbook(inputStream);
    String[] titles = new String[]{"学号","姓名","性别"};
    try {
        Sheet sheet = wb.getSheet(0);
        Row titleRow = sheet.getRow(1);
        Map<String,String> rowData = getRowData(titleRow,titles);
        
for(String k:rowData.keySet()){
    String v = rowData.get(k);
if(!k.equals(v)){
    throw new RuntimeException(String.format("错误的列标题:%s,导入失败!",v));
}
}

List<Item> items = new LinkedList<>();
int rows = sheet.getPhysicalNumberOfRows();
for(int j = 2; j < rows; j++){
    Row row = sheet.getRow(j);
Map<String,String> data = getRowData(row,titles);
if(data.size()>0){
Item item = new Item();
try{
    item.setStudentId(data.get(titles[0]).trim());
    item.setName(data.get(titles[1]).trim());
    item.setSex(data.get(titles[2]).trim());


}catch(Exception e){
throw new RuntimeException(String.format("第%s,导入失败,请检查数据!",j+1));
}
items.add(item);

}


}

return new HashMap<>(){{
put("items", items);
}};

}catch(Exception e){
    throw new RuntimeException(e.getMessage());
}


}

public static Map<String,String> getRowData(Row row,String[] titles){

    if(null == row || isRowEmpty(row)){
    return new HashMap<>();
}

int cells = titles.length;
Map<String,String> data = new LinkedHashMap<>();
for(int i = 0; i < cells; i++){
Cell cell = row.getCell(i);
if(cell == null || isEmpty(cell.toString())){

    data.put(titles[i],"");

}else{

switch(cell.getCellType()){
    case NUMERIC:
        DecimalFormat df = new DecimalFormat("0.############");

        String s = df.format(cell.getNumericCellValue());
        data.put(titles[i],s);
        break;
    case STRING:
        data.put(titles[i],cell.getStringCellValue());
        break;
    case BLANK:
        data.put(titles[i],"");
        break;
    case BOOLEAN:
        data.put(titles[i],Boolean.valueOf(cell.getBooleanCellValue()).toString());
        break;
    case FORMULA:
        data.put(titles[i],cell.getRichStringCellValue().toString());
        break;
    default:
        data.put(titles[i],cell.toString());
        break;

}


}


}

return data;

}


public static boolean isRowEmpty(Row row) {

    if(null == row){
    return true;
}
for(int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++){
    Cell cell = row.getCell(i);
    
if(cell != null && cell.getCellType != CellType.BLANK)
    return false;

}
return true;


}


public static boolean isEmpty(String str){
    if(Objects.isNull(str)){
        return true;
}else{
    return str.trim().length() == 0;
}


}
相关推荐
野生技术架构师5 小时前
2026 Java 面试全套总结,八股 + 场景 + AI 相关面试考点
java·人工智能·面试
香吧香6 小时前
java服务异常日志只打印异常类型,没有堆栈定位分析
java·jvm·异常
qq_2518364576 小时前
AI 疾病自查功能SpringbootAI项目实战 · 技术实现文档
java·ai·ai编程
逆境不可逃7 小时前
Pi Agent 学习笔记:对话太长以后,如何压缩上下文
java
MetaLite7 小时前
JDK 8~26 核心特性一览:从 Stream 到 Scoped Values
java
wno7047 小时前
Spring Boot WebFlux增删改查
java·spring boot·后端
君顾17 小时前
上海24小时自助健身房系统开发实战指南:从架构设计到落地部署
java·开发语言·健身房
SL_staff9 小时前
别急着买商业规则引擎:90%风控场景根本不需要全量编码能力
java·程序员·groovy
ManageEngineITSM9 小时前
DevOps和ITIL是什么关系?是替代还是互补一文讲清
java·服务器·资产管理·变更管理
SL_staff9 小时前
ERP排程总在纸上谈兵?JVS-APS如何用真实产能约束打通计划与执行闭环
java·人工智能·开源