Как установить границу, оставляя одно пространство ячейки вдоль каждой стороны всех данных, используя Apache POI 4.0.1 и Java - PullRequest
0 голосов
/ 05 марта 2019
  • В настоящее время я могу установить границу рядом со всеми данными (Вы можете сослаться на следующее изображение).

Токовый выход


Фрагмент кода

  // Code to draw Border at left side
    int rowstart = 3, rowend = 9;
    int col = 2;
    for (rowstart = 1; rowstart <= rowend; rowstart++) {
        Row rowL = sheet.createRow(rowstart); 
        Cell cell = rowL.createCell(col); 
        {
            XSSFCellStyle style = workbook.createCellStyle();
            style.setBorderLeft(BorderStyle.MEDIUM);
            cell.setCellStyle(style);
        }
    }

    // Code to draw Border at bottom
    int colstart1 = 2, colend1 = 6;

    Row rowB = sheet.createRow(90);
    for (colstart1 = 2; colstart1 <= colend1; colstart1++) {
        Cell cellB = rowB.createCell(colstart1);
        XSSFCellStyle style = workbook.createCellStyle();
        style.setBorderTop(BorderStyle.MEDIUM);
        cellB.setCellStyle(style);
    }

    // Code to draw Border at top
    int colstart = 2, colend = 6;

    Row rowT = sheet.createRow(0);
    for (colstart = 2; colstart <= colend; colstart++) {
        Cell cell = rowT.createCell(colstart);
        XSSFCellStyle style = workbook.createCellStyle();
        style.setBorderBottom(BorderStyle.MEDIUM);
        cell.setCellStyle(style);
    }

    // Code to draw Border at Right side
    int rowstart1 = 1, rowend1 = 9;
    for (rowstart1 = 1; rowstart1 <= rowend1; rowstart1++) {
        Row rowR = sheet.getRow(rowstart1); 
        Cell cellR = rowR.createCell(20); 
        {
            XSSFCellStyle style = workbook.createCellStyle();
            style.setBorderRight(BorderStyle.MEDIUM);
            cellR.setCellStyle(style);
        }
    }

  • Я хочу установить границу рядом со всеми данными, но оставив одинячейка между данными и границей (Вы можете сослаться на следующее изображение).

Ожидаемый результат

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Пример кода

          PropertyTemplate ptT = new PropertyTemplate();
          ptT.drawBorders(new CellRangeAddress(3, 3, 2, 6),
                  BorderStyle.THICK, BorderExtent.TOP);
          ptT.applyBorders(sheet);

          PropertyTemplate ptL = new PropertyTemplate();
          ptL.drawBorders(new CellRangeAddress(3, 9, 2, 2),
                  BorderStyle.THICK, BorderExtent.LEFT);
          ptL.applyBorders(sheet);

          PropertyTemplate ptR = new PropertyTemplate();          
          ptR.drawBorders(new CellRangeAddress(3, 9, 6, 6),
                  BorderStyle.THICK, BorderExtent.RIGHT);
          ptR.applyBorders(sheet);

          PropertyTemplate ptB = new PropertyTemplate();
          ptB.drawBorders(new CellRangeAddress(9, 9, 2, 6),
                  BorderStyle.THICK, BorderExtent.BOTTOM);
          ptB.applyBorders(sheet);
0 голосов
/ 11 марта 2019

Не делайте рисование границ таким сложным способом.

Если кто-то хочет сделать это таким образом (используя одиночные CellStyle s), то потребуется создать 8 стилей для одной ячейки.Одна имеет границы для верхнего левого края, одна имеет границы для верхней линии, одна имеет границы для верхнего правого края, одна имеет границы для левой линии, одна имеет границы для правой линии, одна имеет границы для нижнего левого края, другая имеет границы длянижняя линия и одна имеет границы для нижнего правого края.Затем, после создания ячеек и заполнения их содержимым, к ячейке должен быть применен правильный стиль ячейки (один из 8 созданных ранее).

Это ужасно и сложно для кода.Поэтому люди часто делают то, что вы делаете, и просто создают новый стиль ячейки для каждой отдельной ячейки.Но Excel ограничено в количестве уникальных форматов ячеек / стилей ячеек.См. Спецификации и ограничения Excel .Таким образом, имея большие листы с большим количеством данных, можно легко превысить ограничение в 64 000 уникальных форматов ячеек / стилей ячеекПоэтому просто создавать новый стиль ячейки для каждой отдельной ячейки неправильно.

Границы рисования в Руководство для занятых разработчиков по функциям HSSF и XSSF показывает, как это сделать лучше.

Полный пример:

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.PropertyTemplate;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

class ExcelDrawingBorders {

 public static void main(String[] args) throws Exception {

  try (Workbook workbook = new XSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream("ExcelDrawingBorders.xlsx") ) {

   int startDataRow = 4;
   int endDataRow = 8;
   int startDataColumn = 2;
   int endDataColumn = 6;

   Sheet sheet = workbook.createSheet();

   for (int r = startDataRow; r <= endDataRow; r++) {
    Row row = sheet.createRow(r);
    for (int c = startDataColumn; c <= endDataColumn; c++) {
     Cell cell = row.createCell(c);
     cell.setCellFormula("RANDBETWEEN(10,50)");
    }
   }

   PropertyTemplate propertyTemplate = new PropertyTemplate();
   propertyTemplate.drawBorders(new CellRangeAddress(startDataRow-1, endDataRow+1, startDataColumn-1, endDataColumn+1), 
    BorderStyle.MEDIUM, BorderExtent.OUTSIDE);

   propertyTemplate.applyBorders(sheet);

   workbook.write(fileout);

  }
 }
}

Результат:

enter image description here

Здесь PropertyTemplate и CellUtil сделает всю работу за вас.PropertyTemplate создает необходимые свойства Map s.И при применении к листу он использует CellUtil, который создает 8 необходимых стилей ячеек на уровне книги и применяет их к правильным ячейкам.Будут созданы даже не существующие, но необходимые ячейки.

...