ApachePOI,将文本左对齐,将其他文本右对齐

laximzn5  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(701)

我正在使用apachepoi创建excel导出文件(.xlsx和xssf)。我有一个关于细胞间边界的问题。
我需要将几个单元格合并到一行中,在该行中,我需要将一个文本左对齐,另一个文本右对齐,类似于:

但中间没有边界。
为了得到你在图像中看到的东西,我使用了两个合并区域,一个是我将文本左对齐,另一个是我将文本右对齐,我不确定是否有更好/更方便的方法来实现这一点,如果你知道的话,请将其写在答案中,但是对于我现在的方法,问题是这个边界,我可以删除它吗?我试着为第一个合并区域设置右边框 NONE 以及将第二个合并区域的左边框设置为 NONE 也一样,但没用。
我该怎么处理?

fdbelqdn

fdbelqdn1#

import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.ss.util.CellUtil;
import org.apache.poi.ss.util.RegionUtil;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.OutputStream;

public class Test {

    public static void main(String[] args) throws Exception {
        try(Workbook wb = new XSSFWorkbook(); OutputStream fos = new FileOutputStream("test.xlsx")){
            Sheet sheet = wb.createSheet();

            Font font = wb.createFont();
            font.setBold(true);
            font.setFontHeightInPoints((short)11);

            CellRangeAddress leftCellRangeAddress = new CellRangeAddress(
                0,
                1,
                CellReference.convertColStringToIndex("A"),
                CellReference.convertColStringToIndex("E")
            );
            sheet.addMergedRegion(leftCellRangeAddress);
            CellRangeAddress rightCellRangeAddress = new CellRangeAddress(
                0,
                1,
                CellReference.convertColStringToIndex("F"),
                CellReference.convertColStringToIndex("H")
            );
            sheet.addMergedRegion(rightCellRangeAddress);
            Row row = sheet.createRow(0);

            Cell leftCell = row.createCell(CellReference.convertColStringToIndex("A"));
            leftCell.setCellValue("LEFT");
            leftCell.getCellStyle().setFont(font);
            CellUtil.setVerticalAlignment(leftCell, VerticalAlignment.CENTER);
            CellUtil.setAlignment(leftCell, HorizontalAlignment.LEFT);
            RegionUtil.setBorderRight(BorderStyle.THIN, leftCellRangeAddress, sheet);
            RegionUtil.setRightBorderColor(IndexedColors.WHITE.getIndex(), leftCellRangeAddress, sheet);

            Cell rightCell = row.createCell(CellReference.convertColStringToIndex("F"));
            rightCell.setCellValue("RIGHT");
            rightCell.getCellStyle().setFont(font);
            CellUtil.setVerticalAlignment(rightCell, VerticalAlignment.CENTER);
            CellUtil.setAlignment(rightCell, HorizontalAlignment.RIGHT);
            RegionUtil.setBorderLeft(BorderStyle.THIN, rightCellRangeAddress, sheet);
            RegionUtil.setLeftBorderColor(IndexedColors.WHITE.getIndex(), rightCellRangeAddress, sheet);

            wb.write(fos);
        }
    }
}


如果你想在底部的灰色边框,你可以添加

CellRangeAddress firstRowRegion = new CellRangeAddress(
    0,
    1,
    CellReference.convertColStringToIndex("A"),
    CellReference.convertColStringToIndex("H")
);
RegionUtil.setBorderBottom(BorderStyle.THICK, firstRowRegion, sheet);
RegionUtil.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex(), firstRowRegion, sheet);

你会得到

ecfdbz9o

ecfdbz9o2#

你的截图显示的是一条网格线,而不是一条边界线。这在电子表格中是不同的。在应用程序窗口中显示网格线只是为了更好地查看单元格。它们不会被打印出来。
如果您不想看到网格线,您可以切换到不显示整个工作表的网格线,我不建议这样做,或者您可以设置白色边框线,这将覆盖一些网格线然后。
因为你已经标记了 apache-poi-4 我将展示一个完整的例子,它使用了 CellUtil 以及 PropertyTemplate 生产你想要的东西。
代码:

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

class CreateExcelLeftRight {

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

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

   //create font with bigger size
   Font font = workbook.createFont();
   font.setFontHeightInPoints((short)24);

   Sheet sheet = workbook.createSheet(); 

   //merge A1:E2
   sheet.addMergedRegion(new CellRangeAddress(
    0, //first row (0-based)
    1, //last row  (0-based)
    0, //first column (0-based)
    4  //last column  (0-based)
   ));

   //merge F1:H2
   sheet.addMergedRegion(new CellRangeAddress(
    0, //first row (0-based)
    1, //last row  (0-based)
    5, //first column (0-based)
    7  //last column  (0-based)
   ));

   //create row 1
   Row row = sheet.createRow(0);
   //create cell A1
   Cell cell = row.createCell(0);
   cell.setCellValue("LEFT");
   CellUtil.setFont(cell, font);
   CellUtil.setVerticalAlignment(cell, VerticalAlignment.CENTER);
   //create cell F1
   cell = row.createCell(5);
   cell.setCellValue("RIGHT");
   CellUtil.setFont(cell, font);
   CellUtil.setVerticalAlignment(cell, VerticalAlignment.CENTER);
   CellUtil.setAlignment(cell, HorizontalAlignment.RIGHT);

   PropertyTemplate propertyTemplate = new PropertyTemplate();
   //paint all inside borders white on A1:H2
   propertyTemplate.drawBorders(new CellRangeAddress(0, 1, 0, 7), 
    BorderStyle.THIN, IndexedColors.WHITE.getIndex(), BorderExtent.INSIDE);
   //paint all bottom borders thick gray on A2:H2
   propertyTemplate.drawBorders(new CellRangeAddress(1, 1, 0, 7), 
    BorderStyle.THICK, IndexedColors.GREY_40_PERCENT.getIndex(), BorderExtent.BOTTOM);
   propertyTemplate.applyBorders(sheet);

   sheet.setActiveCell(new CellAddress(3, 0));

   workbook.write(fileout);
  }

 }
}

结果:

相关问题