需求
将excel文件和csv文件进行导入数据库,然后再网页上进行增删改查,然后导出新的excel表
需要的依赖
对于excel表的导入与导出使用的是阿里提供的easyexcel包
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.0.5</version>
</dependency>
csv文件使用的是opencsv包
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>5.0</version>
</dependency>
<dependency>
<groupId>net.sourceforge.javacsv</groupId>
<artifactId>javacsv</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.2</version>
</dependency>
后端实现
导入
excel导入
主要的代码:
@Override
public int insetExcel(MultipartFile file) throws IOException {
int insert=0;
DemoDataListener<Staff> staffDemoDataListener = new DemoDataListener<Staff>();
EasyExcel.read(file.getInputStream(), Staff.class,staffDemoDataListener).sheet("稿酬发放汇总表").doRead();
List<Staff> list = staffDemoDataListener.list;
int num=list.size();
System.out.println(num);
for (Staff staff : list) {
String discrepancy="";
if (staff.getBank().equals("中国建设银行")){
staff.setBank("是");
}else {
staff.setBank("否");
}
String abnormal = judge(list, staff);
if (!abnormal.equals("")){
discrepancy="信息重复";
}
staff.setAbnormal(abnormal);
boolean isintact = staff.isintact();
if (isintact){
discrepancy+=" 信息完整";
}else {
discrepancy+=" 信息不完整";
}
staff.setDiscrepancy(discrepancy);
insert+= staffMapper.insert(staff);
}
if (num==insert){
return 1; //插入成功
}else if(insert>0&&insert<num){
return -1; //插入不完整
}
return 0; //插入失败
}
@Service
public class DemoDataListener<T> extends AnalysisEventListener<T> {
List<T> list = new ArrayList<T>();
public DemoDataListener() {}
@Override
public void invoke(T t, AnalysisContext analysisContext) { //读取一行后执行,第一个参数是一行的数据对象
list.add(t);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// System.out.println(JSON.toJSONString(list));
}
//监听器出现异常的情况下调用
@Override
public void onException(Exception exception, AnalysisContext context){
}
}
以上代码主要的功能在:
DemoDataListener<Staff> staffDemoDataListener = new DemoDataListener<>();
EasyExcel.read(file.getInputStream(), Staff.class,staffDemoDataListener).sheet("稿酬发放汇总表").doRead();
通过EasyExcel中的read方法来读取文件流,它需要三个参数,第一个就是文件流,第二个就是,读出的数据所对应的实体类对象的类,第三个是文档数据监听器,它类似于迭代器+扫描器,它可以通过invoke方法读取一行的数据,读完之后接着读取下一行,在读完文件后会执行doAfterAllAnalysed方法,这就是基本简单的录入excel文件,做简单的分页读取数据,页面呈现:
CSV导入
@Override
@Scheduled(cron ="0 35 11 * * ?") //每天11:35执行一次
public void insertPortal() throws IOException {
int i1 = portalMapper.countByExample(portalExample);
if (i1!=0){
portalMapper.deleteByExample(portalExample); //删除原有的数据
}
String realpath = "F:\\uploadfile\\user\\header" + File.separator + "门户抓取信息.csv"; //csv文件在本地的绝对路径
CsvReader csvReader = new CsvReader(realpath,',', Charset.forName("GBK")); //String.valueOf(StandardCharsets.UTF_8)
int insert=0;
int num=0;
csvReader.readHeaders();
while (csvReader.readRecord()) {
String rawRecord = csvReader.getRawRecord();
String[] split = rawRecord.split(",");
System.out.println(split.length);
if (split.length > 14) {
num++;
portal.setDate(split[0]);
portal.setTitle(split[1]);
portal.setLink(split[2]);
portal.setFontnum(split[3].equals("") ? 0 : Integer.valueOf(split[3]));
portal.setPlatform(split[4]);
portal.setPlate(split[5]);
portal.setFontauthor(split[6]);
portal.setFontauthorunit(split[7]);
portal.setImgeauthor(split[8]);
portal.setImgeauthorunit(split[9]);
portal.setImgenum(split[10].equals("") ? 0 : Integer.valueOf(split[10]));
portal.setEdit(split[11]);
portal.setEditunit(split[12]);
portal.setContributions(split[13]); //组稿
portal.setContributionsunit(split[14]); //平台编辑
String context = "";
for (int i = 15; i < split.length; i++) {
context += split[i];
}
portal.setContent(context); //内容
insert += portalMapper.insert(portal);
}
}
}
CSV导入需求是,通过抓包工具抓取数据csv文件放在服务器本地进行定时读取更新数据,opencsv读取数据没太多好说的,不过在定时器上有一个巨坑的,具体可以看我的另一篇博客:
https://blog.csdn.net/m0_57254953/article/details/128004161
excel导出
@CrossOrigin
@ResponseBody
@GetMapping("/download")
public void download(HttpServletResponse response) throws IOException {
List<Staff> staff = excelManage.selectAll();
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("GBK");
String fileName = URLEncoder.encode("测试", "GBK").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream(), Staff.class).sheet("员工信息").doWrite(staff);
}
前端实现
上传文件就是使用ElementUI组件库的上传,就不说了,讲一下文件导出下在的过程:
expor(){
this.$axios({
url:"/staff/download",
responseType: 'blob'
}).then((res)=>{
let blob=new Blob([res.data])
let a=document.createElement("a")
a.style.display='none'
a.href=URL.createObjectURL(blob)
a.setAttribute(
'download',
"导出.xlsx"
),
document.body.appendChild(a);
a.click(); //下载该文件
document.body.removeChild(a);
})
},
页面展示:
打开文件: