java Excel文件导入导出

导出

1.编写Excel 工具类

/**
	 * 导出 Excel :一个 sheet,带表头
	 *
	 * @param response
	 *            HttpServletResponse
	 * @param list
	 *            数据 list,每个元素为一个 BaseRowModel
	 * @param fileName
	 *            导出的文件名
	 * @param sheetName
	 *            导入文件的 sheet 名
	 * @param object
	 *            映射实体类,Excel 模型
	 */
	public static void writeExcel(HttpServletResponse response, List<List<String>> head,            List<List<String>> list, String fileName, String sheetName)
			throws IOException {
		// 创建本地文件
		String filePath = fileName + ".xlsx";
		File dbfFile = new File(filePath);
		if (!dbfFile.exists() || dbfFile.isDirectory()) {
			dbfFile.createNewFile();
		}
		fileName = new String(filePath.getBytes(), "ISO-8859-1");
		OutputStream out = response.getOutputStream();
		try {
			ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX);
			Sheet sheet = new Sheet(0, 1);
			sheet.setStartRow(0);
			sheet.setSheetName(sheetName);
			sheet.setHead(head);
			writer.write0(list, sheet);
			writer.finish();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				out.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

2.编写导出业务

	@RequestMapping("/export")
	public void exportCash(TaskOrderQuery taskOrderQuery, @LoginUser UserInfo userInfo, HttpServletResponse responses) throws Exception {
		responses.setContentType("application/vnd.ms-excel;charset=utf-8");
		responses.setHeader("Content-Disposition", "attachment;filename=taskOrder.xlsx");
		OutputStream out = null;
		try {
			out = responses.getOutputStream();
			List<List<String>> datas = Lists.newArrayList();
			List<List<String>> heads = Lists.newArrayList(Lists.newArrayList("列一"), Lists.newArrayList("列二"), Lists.newArrayList("列三"));
			BaseResponseVo<List<TaskOrderSpec>> taskOrder = 请求接口拿到需要导出的数据;
			// 如果导出有日期 
			DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			taskOrder.getData().forEach(t -> {
				List<String> list = Lists.newArrayList(列一值, 列二值,列三值);
				datas.add(list);
			});

			EasyExcelUtils.writeExcel(responses, heads, datas, "TaskOrder", "sheet1");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {

		}
	}

2.导入

1.编写导入工具类

    /**
	 * 读取 Excel(1个 sheet)
	 * 
	 * @return Excel 数据 list
	 */
	public static List<Object> readExcel(InputStream inputStream) {
		return readExcel((InputStream) inputStream, 1);
	}
	/**
	 * 读取 Excel指定的sheet(1个 sheet)
	 *
	 * @return Excel 数据 list
	 */
	public static List<Object> readExcel(InputStream inputStream, int sheetNo) {
		if (inputStream == null) {
			return null;
		} else {
			List data = EasyExcelFactory.read(inputStream, new Sheet(sheetNo, 0));

			try {
				inputStream.close();
			} catch (IOException var4) {
				var4.printStackTrace();
			}

			return data;
		}
	}

	/**
	 * 读取 Excel(多个 sheet)
	 *
	 * @param excel
	 *            文件
	 * @param object
	 *            实体类映射,继承 BaseRowModel 类
	 * @return Excel 数据 list
	 */
	public static List<Object> readExcel(MultipartFile excel, BaseRowModel object) {
		ExcelListener excelListener = new ExcelListener();
		ExcelReader reader = getReader(excel, excelListener);
		if (reader == null) {
			return null;
		}
		for (Sheet sheet : reader.getSheets()) {
			if (object != null) {
				sheet.setClazz(object.getClass());
			}
			reader.read(sheet);
		}
		return excelListener.getDatas();
	}

	/**
	 * 读取某个 sheet 的 Excel
	 *
	 * @param excel
	 *            文件
	 * @param object
	 *            实体类映射,继承 BaseRowModel 类
	 * @param sheetNo
	 *            sheet 的序号 当前版本中: XLS 类型文件 sheet 序号为顺序,第一个 sheet 序号为 1 XLSX 类型 sheet 序号顺序为倒序,即最后一个 sheet 序号为 1
	 * @return Excel 数据 list
	 */
	public static List<Object> readExcel(MultipartFile excel, BaseRowModel object, int sheetNo) {
		ExcelListener excelListener = new ExcelListener();
		ExcelReader reader = getReader(excel, excelListener);
		if (reader == null) {
			return null;
		}
		Sheet sheet = new Sheet(sheetNo);
		sheet.setClazz(object.getClass());
		reader.read(sheet);
		return excelListener.getDatas();
	}

2.编写导入业务

    /**
	 * 导入 如果有失败的数据就返回失败数据的具体行数
	 *
	 * @return
	 */
	@ResponseBody
	@RequestMapping(value = "/read", method = RequestMethod.POST, consumes = "multipart/form-data")
	@IgnoreLogin
	public BaseResponseVo<List<List<String>>> readPayProductExcel(@RequestParam MultipartFile file) throws Exception {
		List<List<String>> data = null;
		ImportCreditVo importCreditVo = new ImportCreditVo(null, 0, 0);
		try {
			data = (List) EasyExcelUtils.readExcel(file.getInputStream());
			// 删除第一条(表头)
			data.remove(0);

			if (null == data || data.size() < 1) {
				return BaseResponseVo.err("1", "导入的文件没有数据", null);
			}
			for (List<String> pa : data) {
				if (pa == null || pa != null && pa.size() < 3) {
					return BaseResponseVo.err("1", "导入数据为空,请检查后导入", null);
				}
			}
			// 请求接口 处理导入的业务逻辑
			importCreditVo = // 请求接口;
			String rechargeLog = null;
			if (importCreditVo != null && importCreditVo.getErr() != 0) {
				// 返回上传失败的数据
				rechargeLog = MessageFormat.format("导入完成,成功导入\"{0}\"条,失败\"{1}\"条;以下账号失败:\"{2}\";请检查失败数据是否正确并重新导入失败数据", importCreditVo.getSuccess(),
						importCreditVo.getErr(), importCreditVo.getFailList());
				log.info(rechargeLog);

				return BaseResponseVo.err("1", rechargeLog, importCreditVo.getFailList());
			}
			rechargeLog = MessageFormat.format("导入完成,成功导入\"{0}\"条,失败\"{1}\"条", importCreditVo.getSuccess(), importCreditVo.getErr());
			log.info(rechargeLog);

			return BaseResponseVo.succ("0", rechargeLog, null);
		} catch (IOException e) {
			return BaseResponseVo.err("1", "上传错误");
		}
	}

3.导入业务逻辑 (具体看自己)

public ImportCreditVo read(List<List<String>> accountCredit) throws Exception {
		List<List<String>> failList = new ArrayList<>();
		int success = 0;
		int err = 0;
		for (List<String> pa : accountCredit) {
			try {
				AccountCreditService beanByClass = ApplicationContextUtil.getBeanByClass(AccountCreditService.class);

				beanByClass.addAccountCredit(参数);
			} catch (Exception e) {
				failList.add(pa);
				err += 1;
				e.printStackTrace();
			}
		}
		// 拿到成功条数
		success = accountCredit.size() - err;

		return new ImportCreditVo(failList, success, err);
	}
处理回滚业务
@Transactional(rollbackFor = Exception.class)
	public void addAccountCredit(List<String> pa, LabelVo labelVo, CreditQo creditQo, List<List<String>> failList, int err) throws Exception {
		// 把要导入的数据添加到数据库操作
	}
发布了13 篇原创文章 · 获赞 3 · 访问量 643

猜你喜欢

转载自blog.csdn.net/weixin_45183530/article/details/103634592