import com.mosukj.manage.entity.BuiPatientInfo;
import com.spire.ms.System.DateTime;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
/**
-
@author xjt
-
@version 1.0
*/
public class ReadPatientExcelUtil {
//总行数
private static int totalRows = 0;
//总条数
private static int totalCells = 0;
//错误信息接收器
private static String errorMsg;
/**
-
读EXCEL文件,获取信息集合
-
@return
*/
public static List getExcelInfo(MultipartFile mFile) {
String fileName = mFile.getOriginalFilename();//获取文件名
try {
if (!validateExcel(fileName)) {// 验证文件名是否合格
return null;
}
boolean isExcel2003 = true;// 根据文件名判断文件是2003版本还是2007版本
if (isExcel2007(fileName)) {
isExcel2003 = false;
}
List userList = createExcel(mFile.getInputStream(), isExcel2003);
return userList;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
-
根据excel里面的内容读取客户信息
-
@param is 输入流
-
@param isExcel2003 excel是2003还是2007版本
-
@return
-
@throws IOException
*/
public static List createExcel(InputStream is, boolean isExcel2003) {
try{
Workbook wb = null;
if (isExcel2003) {// 当excel是2003时,创建excel2003
wb = new HSSFWorkbook(is);
} else {// 当excel是2007时,创建excel2007
wb = new XSSFWorkbook(is);
}
List userList = readExcelValue(wb);// 读取Excel里面客户的信息
return userList;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
-
读取Excel里面客户的信息
-
@param wb
-
@return
*/
private static List readExcelValue(Workbook wb) {
//默认会跳过第一行标题
// 得到第一个shell
Sheet sheet = wb.getSheetAt(0);
// 得到Excel的行数
totalRows = sheet.getPhysicalNumberOfRows();
// 得到Excel的列数(前提是有行数)
if (totalRows > 1 && sheet.getRow(0) != null) {
totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
}
List userList = new ArrayList();
// 循环Excel行数
for (int r = 1; r < totalRows; r++) {
Row row = sheet.getRow®;
if (row == null){
continue;
}
BuiPatientInfo user = new BuiPatientInfo();
// 循环Excel的列
for (int c = 0; c < totalCells-1; c++) {
Cell cell = row.getCell©;
if (null != cell) {
if (c == 0) { //第一列
//如果是纯数字,将单元格类型转为String
if(cell.getCellTypeEnum() == CellType.NUMERIC){
cell.setCellType(CellType.STRING);
}
user.setPatientName(cell.getStringCellValue());//将单元格数据赋值给user
}
else if (c == 1){
if(cell.getCellTypeEnum() == CellType.NUMERIC){
cell.setCellType(CellType.STRING);
}
user.setPatientIdentity(cell.getStringCellValue());
}
else if (c == 2){
if(cell.getCellTypeEnum() == CellType.NUMERIC){
cell.setCellType(CellType.STRING);
}
String stringCellValue = cell.getStringCellValue();
user.setHealingId(stringCellValue);
}
else if (c == 3){
if(cell.getCellTypeEnum() == CellType.NUMERIC){
cell.setCellType(CellType.STRING);
}
user.setElseInfo(String.valueOf(cell.getStringCellValue()));
}
}
}
//将excel解析出来的数据赋值给对象添加到list中
user.setUpdateTime(LocalDateTime.now());
user.setPatientBirthdate(IdentityUtil.getPatientBirth(user.getPatientIdentity())); //拿到身份中好通过已经写好的通过身份证信息获取出生年月工具类
user.setPatientSex(IdentityUtil.getPatientSex(user.getPatientIdentity())); //通过省份证号,获取男女信息工具类
user.setPatientState(1); //当前实体类字段是固定的,不是excel数据中的。每个对象都可以再遍历完后增加固定属性值
user.setCreateId(2L);
user.setCreateTime(LocalDateTime.now());
// 添加到list
userList.add(user);
}
return userList;
}
/**
-
验证EXCEL文件
-
@param filePath
-
@return
*/
public static boolean validateExcel(String filePath) {
if (filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))) {
errorMsg = “文件名不是excel格式”;
return false;
}
return true;
}
// @描述:是否是2003的excel,返回true是2003
public static boolean isExcel2003(String filePath) {
return filePath.matches(“^.+\.(?i)(xls)$”);
}
//@描述:是否是2007的excel,返回true是2007
public static boolean isExcel2007(String filePath) {
return filePath.matches(“^.+\.(?i)(xlsx)$”);
}
}
调用getExcelInfo可以得到一个对象数组。
之后就方便导入数据库了
我拿到数组对象后的处理方式:
===========================================================================
@PostMapping(“/excelExport”)
public void test(HttpServletRequest request,HttpServletResponse response,@RequestParam(value=“file”,required = false) MultipartFile file){
long startTime = System.currentTimeMillis();
List list = new ArrayList();
Map<String,Object> res = new HashMap<>();
int row=1;
int rowSuccess=0;
Integer errorCount=0;
QueryWrapper wrapper;
// ReadExcel readExcel = new ReadExcel();
List excelInfo = ReadPatientExcelUtil.getExcelInfo(file);
for (BuiPatientInfo patientInfo : excelInfo) {
// System.out.println(patientInfo);
wrapper=new QueryWrapper<>();
row++;
patientInfo.setHealingId(patientInfo.getHealingId());
wrapper.eq(“healing_Id”, patientInfo.getHealingId());
wrapper.ne(“patient_state”, 9);
//业务代码,通过患者id查询数据库中式否有该患者,如果已存在,则不保存,跳过该患者
int patientCount = buiPatientInfoService.getBaseMapper().getPatientCount(wrapper);
if (patientCount>0){
list.add(“在第”+row+“行的<”+patientInfo.getHealingId()+“>患者已存在!!”);
errorCount++;
}else {
boolean save = buiPatientInfoService.save(patientInfo);
if (save){
rowSuccess++;
}
}
}
if (list.size()>0){
res.put(“log”, list);
}
res.put(“success”, “导入数据成功条数:”+rowSuccess);
res.put(“error”, “导入数据失败条数:”+errorCount);
long endTime = System.currentTimeMillis();
String time = String.valueOf((endTime - startTime) / 1000);
res.put(“time”, “导入数据用时:”+time+“秒”);
renderResult(response, res);
}
面试资料整理汇总
这些面试题是我朋友进阿里前狂刷七遍以上的面试资料,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考。
面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了
在这里祝大家能够拿到心仪的offer!
m.currentTimeMillis();
String time = String.valueOf((endTime - startTime) / 1000);
res.put(“time”, “导入数据用时:”+time+“秒”);
renderResult(response, res);
}
面试资料整理汇总
[外链图片转存中…(img-47qZVGx6-1714811347002)]
[外链图片转存中…(img-Huy8QC7d-1714811347002)]
这些面试题是我朋友进阿里前狂刷七遍以上的面试资料,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考。
面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了
在这里祝大家能够拿到心仪的offer!