2016-10-14 35 views
0

我正在使用apache poi生成一个excel文件,并且我想仅使该excel文件中的最后两列为只读。这就是我一直的兴趣点锁定的功能,但它正在只读的所有单元格,在这里我想最后两个只读。在这里我张贴我做了什么至今如何在excel中使用apche只读只读专栏POI

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(); 

回答

1

您可能必须尝试相反使其工作。

保护整张纸并为应该可编辑的单元呼叫setLocked(false)

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

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(); 
+0

我已经试过alreday看到我的代码,如果(空= taskDiaryItem.getAssignedToName()!){ cell.setCellValue(新HSSFRichTextString(taskDiaryItem.getAssignedToName())); cell.setCellStyle(unlockedCellStyle); } – storyteller

+0

你可以编辑我的代码我已经尝试过你说的解决方案。请 – storyteller

+0

您是否使用Sheet sheet = wb.createSheet()创建了受保护的表单? sheet.protectSheet(“password”); – mhasan