需求:用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();
}
}
补充
- 在记录导入结果的时候要进行字符串拼接和添加,StringBuffer和StringBuilder都可以用,但是有区别,在这里记录一下:
- StringBuffer:线程安全,但是效率低
- StringBuilder:线程不安全,但是效率高
在这个需求中,没有涉及到线程安全的部分,所以使用了StringBuilder。
- 在业务中尽量避免使用字符串比较,效率比较低。