如何为Apache POI SXSSFWorkbook创建的Excel设置标题属性?
如何为导出的Excel电子表格设置无障碍标题属性?
出于无障碍需求,我需要为可下载的Excel电子表格设置标题属性,但在SXSSFWorkbook API及HTTP响应属性中均未找到设置该属性的方法。以下是我们在导出控制器中创建Excel的代码,请问该如何实现?

// 创建空白工作簿 SXSSFWorkbook workbook = new SXSSFWorkbook(); // 创建空白工作表 SXSSFSheet spreadsheet = workbook.createSheet(form.getSelectedProviderId() + " - " + form.getSelectedConfigYear()); // 创建行对象 SXSSFRow row; // 需要写入的数据(Object数组) List<Object[]> xssinfo = new ArrayList<Object[]>(); int rowIndex = 0; row = spreadsheet.createRow(rowIndex++); String[] headers = info.isActive() ? PTNT_PNL_ACTIVE_HEADERS : PTNT_PNL_INACTIVE_HEADERS; xssinfo.add(headers); for(int i = 0; i < headers.length; i++) { XSSFCell cell = row.createCell(i); cell.setCellValue(headers[i]); } /**** 生成数据行的迭代代码 ****/ // 将文件写入响应 writeTo(workbook, "PatientPanel_" + form.getSelectedProviderId() + "_" + form.getSelectedConfigYear() + ".xlsx", response); // 配置响应并写入工作簿 private void writeTo(SXSSFWorkbook workbook, String filename, HttpServletResponse response) throws Exception { try { response.reset(); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\""); ByteArrayOutputStream bos = new ByteArrayOutputStream(); workbook.write(bos); response.setContentLength(bos.size()); response.getOutputStream().write(bos.toByteArray(), 0, bos.size()); response.getOutputStream().flush(); response.getOutputStream().close(); workbook.dispose(); } catch (Exception e) { logger.info("导出代码集合 - 写入出错"); throw e; } }
解决方案
你需要设置的是Excel文档的核心元数据标题,该属性会被屏幕阅读器等无障碍工具识别。SXSSFWorkbook本身没有直接的setTitle方法,但可通过POI提供的元数据操作API实现:
- 设置Excel内部的文档标题
在创建SXSSFWorkbook之后,添加以下代码配置文档标题:
// 获取文档核心属性对象 POIXMLProperties properties = workbook.getProperties(); POIXMLProperties.CoreProperties coreProps = properties.getCoreProperties(); // 设置无障碍工具可读取的文档标题 coreProps.setTitle("患者面板_" + form.getSelectedProviderId() + "_" + form.getSelectedConfigYear());
该标题会被写入Excel文件的元数据中,屏幕阅读器打开文件时会读取该标题,满足无障碍需求。
- 保留现有HTTP响应设置
你当前代码中Content-Disposition头设置的filename是下载时显示的文件名,和文档内部标题不冲突,可继续保留——它负责用户下载时看到的文件名,而内部标题负责无障碍工具识别的文档标识。
内容的提问来源于stack exchange,提问作者Alison Graham
相关产品推荐
相关产品推荐

