java导出excel表格workbook不可编辑

发布时间: 2023-11-27 18:06 阅读: 文章来源:1MUMB103625PS

POI概述:

 Jakarta POI 是一套用于访问微软格式文档的Java API。POI提供API给Java程序对Microsoft Office格式档案读和写的功能。在许多企业办公系统中,经常会有用户要求,需要对数据进行统计并且可以直接下载Excel文件。

HSSF - 提供读写Microsoft Excel格式档案的功能。XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。HWPF - 提供读写Microsoft Word格式档案的功能。HSLF - 提供读写Microsoft PowerPoint格式档案的功能。HDGF - 提供读写Microsoft Visio格式档案的功能

区别不止这些,详细信息可自行百度。

基本步骤:

1、用HSSFWorkbook打开或者创建“Excel文件对象”

  2、用HSSFWorkbook对象返回或者创建Sheet对象

  3、用Sheet对象返回行对象,用行对象得到Cell对象

  4、对Cell对象读写。

  5、将生成的HSSFWorkbook放入HttpServletResponse中响应到前端页面

POI依赖:

org.apache.poipoi3.17org.apache.poipoi-ooxml3.17

还有其他版本类型的依赖,根据自己需要选择。

代码:

/** * 下载Map类型数据的公共方法 EXCEL * @param mapList 需要导出的数据 * @param templateCode 模板名称或文件地址 * @param dateKey 字段名及对应的列 * @param count 开始放入数据的行 * @param fileName 下载文件名 * @param response response */public void exportUtil(List mapList, String templateCode, Map dateKey, String fileName, int count, HttpServletResponse response) {//从微服务下载模板//FileTeplResVo teplResVo = fileTemplateApi.queryFileId(ModuleConstant.MARKET, templateCode);//String fileId = teplResVo.getFileId();//FileVo fileVo = fileUploadApi.downLoad(fileId, ModuleConstant.MARKET, AuthUtil.getUserId(), false);//获取文件模板try (InputStream inStream = this.getClass().getResourceAsStream(templateCode);OutputStream outputStream = response.getOutputStream(); XSSFWorkbook wb = new XSSFWorkbook(inStream)) {//设置response属性this.setResponse(response, Optional.ofNullable(fileName).orElse("my.xlsx"));//读取了模板第一个sheet页XSSFSheet sheet = wb.getSheetAt(InternalNumConstant.ZERO);//样式XSSFCellStyle cellStyle = this.getCellStyle(wb);Row rowTemp;//循环数据的行for (Map item : mapList) {rowTemp = sheet.createRow(count);//循环列for (Map.Entry item1 : dateKey.entrySet()) {// 设置单元格内容rowTemp.createCell(item1.getKey()).setCellValue(Optional.ofNullable(item.get(item1.getValue())).map(x -> x.toString()).orElse(""));// 设置样式rowTemp.getCell(item1.getKey()).setCellStyle(cellStyle);}count++;}//设置统计时间rowTemp = sheet.createRow(count);DateTimeFormatter formatter = DateTimeFormatter.ofPattern(InternalStrConstant.DATE_FORMAT_STR);rowTemp.createCell(dateKey.size() - 1).setCellValue("统计日期:" + LocalDate.now().format(formatter));wb.write(outputStream);outputStream.flush();} catch (IOException e) {log.error(e.getMessage());}}/** * 获取cell样式 加黑色边框 * @param wb excel文件 * @return XSSFCellStyle样式 */public XSSFCellStyle getCellStyle(XSSFWorkbook wb) {//样式XSSFCellStyle cellStyle = wb.createCellStyle();cellStyle.setBorderBottom(BorderStyle.THIN);cellStyle.setBorderLeft(BorderStyle.THIN);cellStyle.setBorderTop(BorderStyle.THIN);cellStyle.setBorderRight(BorderStyle.THIN);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellStyle.setAlignment(HorizontalAlignment.CENTER);return cellStyle;}/** * 设置response属性 * @param response response * @param fileName 模板文件名 * @exception UnsupportedEncodingException 异常 */public static void setResponse(HttpServletResponse response, String fileName) throws UnsupportedEncodingException {// 清空输出流response.reset();// 定义输出类型response.setContentType(InternalStrConstant.CONTENT_TYPE);// 定义输出类型;charset=UTF-8response.setContentType(InternalStrConstant.CONTENT_TYPE_UTF_8);//设置Http响应头告诉浏览器下载这个附件response.setHeader("content-disposition","attachment; filename=" + URLEncoder.encode(fileName, InternalStrConstant.UTF_8));}

如果有导出实体类的需求,可先将实体类转成map,数据量较小时可用,大数据量可能会有性能问题。

/** *实体转map通用方法 * @param bean 实体 * @return map集合 * @throws IntrospectionExceptionIntrospectionException * @throws InvocationTargetException InvocationTargetException * @throws IllegalAccessException IllegalAccessException */public static Map convertBean(Object bean) throws IntrospectionException, InvocationTargetException, IllegalAccessException {Class type = bean.getClass();Map returnMap = new HashMap();BeanInfo beanInfo = Introspector.getBeanInfo(type);PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();for (PropertyDescriptor descriptor : propertyDescriptors) {String propertyName = descriptor.getName();if (!"class".equals(propertyName)) {Method readMethod = descriptor.getReadMethod();Object result = readMethod.invoke(bean);if (result != null) {returnMap.put(propertyName, result);} else {returnMap.put(propertyName, "");}}}return returnMap;}

使用方法举例:

public void download(String unitId, String period, HttpServletResponse response) {//查询数据List queryList = this.differenceAnalysis(unitId, period).getItems();//生成序号列int oderNumber = InternalNumConstant.ONE;for (Map item : queryList) {item.put("oderNumber", oderNumber);oderNumber++;}//设置地段对应的列Map mapKey = new HashMap();mapKey.put(0, "oderNumber");mapKey.put(1, "unitName");mapKey.put(2, "byUnit");mapKey.put(3, "byPostCategory");mapKey.put(4, "byMajor");mapKey.put(5, "unitAndPostCategory");mapKey.put(6, "unitAndMajor");mapKey.put(7, "majorAndPostCategory");//导出excelthis.exportUtil(queryList, "模板名称或文件地址", mapKey, "导出的文件名称.xlsx", 2, response);}

POI导出不满足性能需求的时候,可以尝试使用阿里巴巴的easyExcel。

•••展开全文