在项目中,有很多对excel的操作,大都数时候我们都会使用poi工具类,本文将介绍poi的一些使用方法。
1.poi导入excel,并展示数据
使用poi导入excel,解析后返回List数据到前台展示。
public static List<String[]> readExcel(MultipartFile file)
throws IOException {
checkFile(file);
Workbook workbook = getWorkBook(file);
List<String[]> list = new ArrayList<String[]>();
if (workbook != null) {
for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++ ) {
Sheet sheet = workbook.getSheetAt(sheetNum);
if (sheet == null) {
continue;
}
int firstRowNum = sheet.getFirstRowNum();
int lastRowNum = sheet.getLastRowNum();
for (int rowNum = firstRowNum + 1; rowNum <= lastRowNum; rowNum++ ) {
Row row = sheet.getRow(rowNum);
if (row == null) {
continue;
}
int firstCellNum = row.getFirstCellNum();
int lastCellNum = row.getLastCellNum();
String[] cells = new String[row.getLastCellNum()];
for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++ ) {
Cell cell=row.getCell(cellNum, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL);
cells[cellNum] = getCellValue(cell);
}
list.add(cells);
}
}
}
return list;
}
public static void checkFile(MultipartFile file)
throws IOException {
if (null == file) {
throw new FileNotFoundException("文件不存在!");
}
String fileName = file.getOriginalFilename();
if (!fileName.endsWith(XLS_TYPE) && !fileName.endsWith(XLSX_TYPE)) {
throw new IOException(fileName + "不是excel文件");
}
}
public static String getCellValue(Cell cell) {
String cellValue = "";
if (cell == null) {
return cellValue;
}
if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
cell.setCellType(Cell.CELL_TYPE_STRING);
}
switch (cell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC:
cellValue = String.valueOf(cell.getNumericCellValue());
break;
case Cell.CELL_TYPE_STRING:
cellValue = String.valueOf(cell.getStringCellValue());
break;
case Cell.CELL_TYPE_BOOLEAN:
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_FORMULA:
cellValue = String.valueOf(cell.getCellFormula());
break;
case Cell.CELL_TYPE_BLANK:
cellValue = "";
break;
case Cell.CELL_TYPE_ERROR:
cellValue = "非法字符";
break;
default:
cellValue = "未知类型";
break;
}
return cellValue;
}
public static Workbook getWorkBook(MultipartFile file) {
String fileName = file.getOriginalFilename();
Workbook workbook = null;
try {
InputStream is = file.getInputStream();
if (fileName.endsWith(XLS_TYPE)) {
workbook = new HSSFWorkbook(is);
}
else if (fileName.endsWith(XLSX_TYPE)) {
workbook = new XSSFWorkbook(is);
}
}
catch (IOException e) {
e.printStackTrace();
}
return workbook;
}
2.poi导出excel并以web下载方式保存excel
将数据库中的数据组装成excel并导出,并在web下载栏中直接下载。
@PostMapping("/exportUser")
@ApiOperation(value = "导出人员excel", notes = "导出人员excel")
public void
exportUser(@ApiParam(name = "人员id", value = "人员id", required = false) @RequestBody List<SysUserVO> sysSysUserVO)
throws IOException {
List<SysUserVO> middleList = new ArrayList<>();
for (SysUserVO sysUserVO : sysSysUserVO) {
List<SysUserVO> resultListSysUser = sysUserService.querySysUserAll(sysUserVO);
userInfoUtil.completionInformation(resultListSysUser.get(0));
middleList.add(resultListSysUser.get(0));
}
String[] headers = {"用户名", "姓名", "密码", "启动状态", "岗位", "角色", "所属部门", "手机", "邮箱", "身份证号"};
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();
sheet.setDefaultColumnWidth((short)18);
HSSFRow row = sheet.createRow(0);
for (short i = 0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
for (int j = 0; j < middleList.size(); j++) {
SysUserVO export = middleList.get(j);
row = sheet.createRow(j + 1);
List<String> datas = new ArrayList<>();
String userName = export.getUsername();
String trueName = export.getTureName();
String password = export.getPassword();
String status = String.valueOf(export.getIsEnabled());
String postName = export.getPostName();
String roleName = export.getRoleName();
String organName = export.getOrganizationName();
String phone = export.getMobile();
String email = export.getEmail();
String identityCard = export.getIdentityCard();
datas.add(userName);
datas.add(trueName);
datas.add(password);
datas.add(status);
datas.add(postName);
datas.add(roleName);
datas.add(organName);
datas.add(phone);
datas.add(email);
datas.add(identityCard);
for (int k = 0; k < datas.size(); k++) {
String string = datas.get(k);
HSSFCell cell = row.createCell(k);
HSSFRichTextString richString = new HSSFRichTextString(string);
HSSFFont font3 = workbook.createFont();
font3.setColor(HSSFColor.BLUE.index);
richString.applyFont(font3);
cell.setCellValue(richString);
}
}
String fileName = "人员导出.xls";
HttpServletResponse response =
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
RequestAttributes requsetAttributes = RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = ((ServletRequestAttributes)requsetAttributes).getRequest();
final String userAgent = request.getHeader("USER-AGENT");
if (StringUtils.contains(userAgent, "MSIE") || StringUtils.contains(userAgent, "Trident")) {
fileName = URLEncoder.encode(fileName, "UTF-8");
} else if (StringUtils.contains(userAgent, "Mozilla")) {
fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
} else {
fileName = URLEncoder.encode(fileName, "UTF-8");
}
response.reset();
response.setContentType("application/octet-stream");
response.addHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
OutputStream os = response.getOutputStream();
workbook.write(os);
os.close();
}
3.poi导出并以流方式保存excel
将数据库中的数据组装成excel并导出,并以数据流方式存在指定的路径。
public class BarcodeExportlFlow implements IBarcodeExport {
@Autowired
BarcodeManageBatchSerivce barcodeManageBatchSerivce;
@Override
public OutputStream exportData() throws IOException {
BarcodeBatchManageBo input = new BarcodeBatchManageBo();
List<BarcodeBatchManageBo> middleList = barcodeManageBatchSerivce.selectBatch(input);
String[] headers = {"id", "条码批次码", "激活状态", "有效状态", "导入人", "导入时间", "激活人", "激活时间", "作废人", "作废时间", "本批次条数"};
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();
sheet.setDefaultColumnWidth((short) 18);
HSSFRow row = sheet.createRow(0);
for (short i = 0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
for (int j = 0; j < middleList.size(); j++) {
BarcodeBatchManageBo export = middleList.get(j);
row = sheet.createRow(j + 1);
List<String> datas = new ArrayList<>();
String id = export.getId().toString();
String batchCode = export.getBatchCode();
String activationStatus = export.getActivationStatus();
String effectiveStatus = export.getEffectiveStatus();
datas.add(id);
datas.add(batchCode);
datas.add(activationStatus);
datas.add(effectiveStatus);
for (int k = 0; k < datas.size(); k++) {
String string = datas.get(k);
HSSFCell cell = row.createCell(k);
HSSFRichTextString richString = new HSSFRichTextString(string);
HSSFFont font3 = workbook.createFont();
font3.setColor(HSSFColor.BLUE.index);
richString.applyFont(font3);
cell.setCellValue(richString);
}
}
FileOutputStream fos = new FileOutputStream("D:/wb.xls");
workbook.write(fos);
fos.close();
return null;
}
}
|