如何使用apche POI在excel中只读专栏

我正在使用apache poi生成一个excel文件,而且我想只在该excel文件中使最后两列读取。 所以我尝试了poi的lockingfunction,但是它使得所有的单元只读,我想在最后两个只读。在这里,我发布了我迄今为止所做的

HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(); sheet.protectSheet("password"); HSSFRow row = null; HSSFCell cell = null; /* cell style for locking */ CellStyle lockedCellStyle = wb.createCellStyle(); lockedCellStyle.setLocked(true); /* cell style for editable cells */ CellStyle unlockedCellStyle = wb.createCellStyle(); unlockedCellStyle.setLocked(false); cell = row.createCell(columnNo); if (null != taskDiaryItem.getDueDate()) { SimpleDateFormat formater = new java.text.SimpleDateFormat(InboxItemValue.INBOX_DATE_FORMAT.value()); cell.setCellValue(new HSSFRichTextString(formater.format(taskDiaryItem.getDueDate()))); } else { cell.setCellValue(new HSSFRichTextString(" ")); } columnNo = columnNo + 1; /*** End Change : CR#20 CQ#fklnp00272463 ***/ cell = row.createCell(columnNo); if (null != taskDiaryItem.getTaskPriorityDescription()) { cell.setCellValue(new HSSFRichTextString(taskDiaryItem.getTaskPriorityDescription())); } else { cell.setCellValue(new HSSFRichTextString(" ")); } columnNo = columnNo + 1; cell = row.createCell(columnNo); if (null == taskDiaryItem.getContractNumber() || (taskDiaryItem.getContractNumber().isEmpty())) { cell.setCellValue(new HSSFRichTextString(taskDiaryItem.getContractNumber())); } else { cell.setCellValue(new HSSFRichTextString(" ")); } columnNo = columnNo + 1; cell = row.createCell(columnNo); if (null != taskDiaryItem.getTaskStatusDescription()) { cell.setCellValue(new HSSFRichTextString(taskDiaryItem.getTaskStatusDescription())); } else { cell.setCellValue(new HSSFRichTextString(" ")); } columnNo = columnNo + 1; if (!fromContext.equals(InboxItemValue.USER_INBOX.value()) && !fromContext.equals(InboxItemValue.TEAM_MEMBER.value())) { cell = row.createCell(columnNo); if (null != taskDiaryItem.getAssignedToName()) { cell.setCellValue(new HSSFRichTextString(taskDiaryItem.getAssignedToName())); cell.setCellStyle(unlockedCellStyle); } else { cell.setCellValue(new HSSFRichTextString(" ")); } columnNo = columnNo + 1; } cell = row.createCell(columnNo); if (null != taskDiaryItem.getAssignedBy()) { cell.setCellValue(new HSSFRichTextString(taskDiaryItem.getAssignedBy())); cell.setCellStyle(lockedCellStyle); } else { cell.setCellValue(new HSSFRichTextString(" ")); } } else if(InboxItemValue.PST_INBOX.value().equals(fromContext)) { cell = tasksForPSTAndPlacement(taskDiaryItem, cell, row, columnNo, fromContext); } else if(InboxItemValue.PLACEMENT_INBOX.value().equals(fromContext)) { cell = tasksForPSTAndPlacement(taskDiaryItem, cell, row, columnNo, fromContext); } j++; } response.setHeader("Content-Disposition", "attachment; filename=Inbox.xls"); response.setHeader("Content-type", "application/vnd.ms-excel"); ServletOutputStream fileOut = response.getOutputStream(); wb.write(fileOut); fileOut.close(); 

你可能不得不尝试相反的工作。

保护整张表格,并为应该可编辑的单元setLocked(false)

我已经在这里试过这个示例代码,如果你运行这个,你会发现单元格havinf TEST是可编辑的,因为具有值TEST2的单元格是只读的,你可以使用这个代码来构build你的逻辑。

 String file = "C:\\poitest.xlsx"; FileOutputStream outputStream = new FileOutputStream(file); Workbook wb = new XSSFWorkbook(); CellStyle unlockedCellStyle = wb.createCellStyle(); unlockedCellStyle.setLocked(false); Sheet sheet = wb.createSheet(); sheet.protectSheet("password"); Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("TEST"); cell.setCellStyle(unlockedCellStyle); Cell cell2 = row.createCell(1); cell2.setCellValue("TEST2"); wb.write(outputStream); outputStream.close();