【问题标题】:Adding border to a merged region in POI XSSF workbook向 POI XSSF 工作簿中的合并区域添加边框
【发布时间】:2012-06-30 20:07:00
【问题描述】:

我使用的是 apache poi 3.7,我需要为一系列单元格或合并区域设置边框。

当工作表和工作簿类型为 XSSF 时,如何将边框应用于合并区域。在 HSSF 类型中,我使用 RegionUtil-/HSSFRegionutil,但如果在 XSSF 类型中使用第一个对象 (Regionutil),则它不起作用,并且将黑色背景颜色置于单元格范围内。

Regionutil 通常与 CellRangeAddress 一起使用,我找不到有关此问题的信息。我不知道 CellRangeAddres 是否会导致这种情况。

【问题讨论】:

    标签: java apache-poi xssf poi-hssf


    【解决方案1】:

    为此,您必须为合并区域中的每个单元格添加一个空白单元格,然后为每个单元格添加适当的边框。例如,下面的代码将在同一行中创建一个包含 5 个单元格的合并区域,在整个合并区域周围有一个边框,并且文本在该区域中居中。

    XSSFWorkbook wb = new XSSFWorkbook();
    CellStyle borderStyle = wb.createCellStyle();
    borderStyle.setBorderBottom(CellStyle.BORDER_THIN);
    borderStyle.setBorderLeft(CellStyle.BORDER_THIN);
    borderStyle.setBorderRight(CellStyle.BORDER_THIN);
    borderStyle.setBorderTop(CellStyle.BORDER_THIN);
    borderStyle.setAlignment(CellStyle.ALIGN_CENTER);
    Sheet sheet = wb.createSheet("Test Sheet");
    Row row = sheet.createRow(1);
    for (int i = 1; i <= 5; ++i) {
        Cell cell = row.createCell(i);
        cell.setCellStyle(borderStyle);
        if (i == 1) {
            cell.setCellValue("Centred Text");
        } 
    }
    sheet.addMergedRegion(new CellRangeAddress(1, 1, 1, 5));
    

    【讨论】:

    • 如果按行合并该怎么办。即,像合并了 3 行,那么应该采用哪种方式。请提出建议。
    【解决方案2】:
    private void setBordersToMergedCells(XSSFWorkbook workBook, XSSFSheet sheet) {
            int numMerged = sheet.getNumMergedRegions();
    
        for(int i= 0; i<numMerged;i++){
            CellRangeAddress mergedRegions = sheet.getMergedRegion(i);
            RegionUtil.setBorderTop(CellStyle.BORDER_THIN, mergedRegions, sheet, workBook);
            RegionUtil.setBorderLeft(CellStyle.BORDER_THIN, mergedRegions, sheet, workBook);
            RegionUtil.setBorderRight(CellStyle.BORDER_THIN, mergedRegions, sheet, workBook);
            RegionUtil.setBorderBottom(CellStyle.BORDER_THIN, mergedRegions, sheet, workBook);
        }
    
    
    }
    

    【讨论】:

    • 比一直设置所有区域的所有单元格无限简单
    【解决方案3】:

    @Jesanagua 刚刚救了我的命,我只需要稍作改动以匹配 3.17。

    private void setBordersToMergedCells(HSSFSheet sheet) {
        int numMerged = sheet.getNumMergedRegions();
        for (int i = 0; i < numMerged; i++) {
            CellRangeAddress mergedRegions = sheet.getMergedRegion(i);
            RegionUtil.setBorderLeft(BorderStyle.THIN, mergedRegions, sheet);
            RegionUtil.setBorderRight(BorderStyle.THIN, mergedRegions, sheet);
            RegionUtil.setBorderTop(BorderStyle.THIN, mergedRegions, sheet);
            RegionUtil.setBorderBottom(BorderStyle.THIN, mergedRegions, sheet);
    
        }
    }
    

    【讨论】:

      【解决方案4】:

      对多行执行此操作。

      Workbook wb = new HSSFWorkbook();
      
      // create a new sheet
      Sheet sheet = wb.createSheet();
      
      
      CellStyle borderStyle = wb.createCellStyle();
      borderStyle.setBorderBottom(CellStyle.BORDER_THIN);
      borderStyle.setBorderLeft(CellStyle.BORDER_THIN);
      borderStyle.setBorderRight(CellStyle.BORDER_THIN);
      borderStyle.setBorderTop(CellStyle.BORDER_THIN);
      borderStyle.setAlignment(CellStyle.ALIGN_CENTER);
      Sheet sheet1 = wb.createSheet("Test Sheet");
      Row row = null;
      Cell cell;
      for (int i = 1; i <= 5; ++i) {
          row = sheet1.createRow(i);
          for(int j=1;j<=5;j++){
              cell= row.createCell(j);
              cell.setCellStyle(borderStyle);
              if (i == 1 && j==1) {
                  cell.setCellValue("Centred Text");
              } 
          }
      }
      sheet1.addMergedRegion(new CellRangeAddress(1, 5, 1, 5));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        相关资源
        最近更新 更多