2016-10-14 34 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