excel导入导出需求

本文详细介绍了如何使用Apache POI库在Java后端进行Excel数据的导入与导出。在导入过程中,通过Workbook和Sheet对象解析Excel文件,检查并处理数据,对无效或缺失的数据进行提示。在导出时,创建新的Excel文件,设置标题行和数据行,并将数据写入。整个过程未涉及多线程操作,因此选择了效率更高的StringBuilder进行字符串拼接。
摘要由CSDN通过智能技术生成

需求:用excel批量导入导出数据,导入的结果要提示出来

使用org.apache.poi 解析excel文件

导入excel

前端

需要注意:enctype,input的type,而且name要和后端File对象名一致
在这里插入图片描述
在这里插入图片描述


后端

action

    private File file;//为上传临时文件.tmp 结尾与html中的必须同名
    InputStream inputStream = new FileInputStream(file);

service

Workbook workbook = WorkbookFactory.create(inputStream);  //excel对象
inputStream.close();
Sheet sheet = workbook.getSheetAt(0);  //sheet 表对象,默认获取sheet1

int rowLength = sheet.getLastRowNum();   // 总行数
Row row = sheet.getRow(0);   //行对象
int celLength = row.getLastCellNum(); //总列数
Cell cell = row.getCell(0);  // 列对象

// 第一行是标题,从第二行开始读取
int guide = 1; // 1:添加到数据库  0:跳过
for (int rowNum = 1; rowNum <= rowLength; rowNum++) {
    guide = 1;
    OrgGroupInfo orgGroupInfoImport = new OrgGroupInfo();
    //获取行
    row = sheet.getRow(rowNum);
    //获取此行数据
    for (int cellNum = 0; cellNum < celLength; cellNum++) {
        cell = row.getCell(cellNum);
        if (cell == null) {  //空值的时候,下面解析会报nullPoint,所以要创建一个单元格
             cell = row.createCell(cellNum);
        }
        cell.setCellType(Cell.CELL_TYPE_STRING);
        String stringCellValue = cell.getStringCellValue();

        // 封装数据到实体类
        String resultErrorMsg = this.setOrgGroupParameter(orgGroupInfoImport, stringCellValue);
        //关键数据为空,直接跳过这一行
        if (resultErrorMsg != null) {
            guide = 0;
            msg.append("第" + rowNum + "行" + "导入失败,原因:" + "第" + (cellNum+1) + "列--->"+ resultErrorMsg + enter);
            break;
        }
    }

    // 读取完一行,添加一次数据
    if (guide == 1) { //添加
        String addResult = addExcelGroupInfo(orgGroupInfoImport);
        if (addResult.equals("success_Update")) {  //添加一行成功
            msg.append("第" + rowNum + "行" + "导入成功: " +"数据更新"+ enter);
        } else if (addResult.equals("success_Insert")) {
            msg.append("第" + rowNum + "行" + "导入成功: " +"数据添加"+ enter);
        } else {
            msg.append("第" + rowNum + "行" + "导入成功:" + addResult + enter);
        }
    }else {  //跳过
        continue;
    }
}

导出为excel


//创建excel文件
HSSFWorkbook book = new HSSFWorkbook();
//创建excel文件中的一个页面
HSSFSheet sheet = book.createSheet("信息数据");
//设置默认宽度25
sheet.setDefaultColumnWidth(12);
//合并单元格
CellRangeAddress rangeAddress = new CellRangeAddress(0, 0, 0, 12);
//页添加单元格
sheet.addMergedRegion(rangeAddress);
//创建第1行
HSSFRow createRow = sheet.createRow(0);
//创建名称行样式
HSSFCellStyle style = creatCellStyle(book, (short) 16);
//创建标题行样式
HSSFCellStyle style1 = creatCellStyle(book, (short) 11);
//创建第0个单元格
HSSFCell Cell = createRow.createCell(0);
//设置单元格的样式
Cell.setCellStyle(style);
//创建单元格的内容
if (vicePayNumber != null) {
    //for (int i = 0; i < userBaseInfo.size(); i++) {
    Cell.setCellValue("导出订单数据:");
    //}
}
//创建第一行单元格
HSSFRow Row1 = sheet.createRow(1);
//定义标题行单元格的值
String[] tille = {字段1,字段2,字段3,字段4,字段5,字段6,字段7,字段8,字段9};// 需要导出的表单字段
//循环遍历设置第一行单元格的标题
for (int i = 0; i < tille.length; i++) {
    HSSFCell createCell = Row1.createCell(i);
    createCell.setCellStyle(style1);
    createCell.setCellValue(tille[i]);
}
//遍历List
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (vicePayNumber != null) {
    for (int i = 0; i < vicePayNumber.size(); i++) {
        VicePayNumber record = vicePayNumber.get(i);
        
        String state = record.getState();
        record.setState(state);
    
        
        String isSentMessage = record.getIsSentMessage();
        record.setIsSentMessage(isSentMessage);

        HSSFRow Row = sheet.createRow(i + 2);
        //给行添加数据
        Row.createCell(0).setCellValue(vicePayNumber.get(i).getId());
        Row.createCell(1).setCellValue(DateFormatUtil.formatToStringTime(vicePayNumber.get(i).getCreateTime()));
        Row.createCell(2).setCellValue(vicePayNumber.get(i).getOrgName());
        Row.createCell(3).setCellValue(vicePayNumber.get(i).getUserId());
        Row.createCell(4).setCellValue(vicePayNumber.get(i).getNickName());
        Row.createCell(5).setCellValue(vicePayNumber.get(i).getBak1());
        Row.createCell(6).setCellValue(vicePayNumber.get(i).getBak2()); 
        Row.createCell(7).setCellValue(vicePayNumber.get(i).getViceNumber());
        Row.createCell(8).setCellValue(vicePayNumber.get(i).getState());  
        Row.createCell(9).setCellValue(vicePayNumber.get(i).getExpressName());
        Row.createCell(10).setCellValue(vicePayNumber.get(i).getExpressPhone());
        Row.createCell(11).setCellValue(vicePayNumber.get(i).getExpressAddress());
        Row.createCell(12).setCellValue(vicePayNumber.get(i).getPayMoney());
        Row.createCell(13).setCellValue(vicePayNumber.get(i).getPayWeOrderId());
        Row.createCell(14).setCellValue(vicePayNumber.get(i).getPayWeixinOrderId());
        Row.createCell(15).setCellValue(vicePayNumber.get(i).getIsSentMessage());  
        Row.createCell(16).setCellValue(vicePayNumber.get(i).getExpressCompany());
        Row.createCell(17).setCellValue(vicePayNumber.get(i).getExpressCompanyCode());
        Row.createCell(18).setCellValue(vicePayNumber.get(i).getExpressNumber());
    }
}
    //文件写入输出流
    book.write(outputStream);
    outputStream.close();
}
}

补充

  1. 在记录导入结果的时候要进行字符串拼接添加,StringBuffer和StringBuilder都可以用,但是有区别,在这里记录一下:
  • StringBuffer:线程安全,但是效率低
  • StringBuilder:线程不安全,但是效率高

在这个需求中,没有涉及到线程安全的部分,所以使用了StringBuilder。

  1. 在业务中尽量避免使用字符串比较,效率比较低。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值