Apache POI,在同一行中将文本左对齐,其他文本右对齐
Apache POI, align text to left and other text to right in same row
我正在使用 Apache POI 创建 excel 导出文件(带有 XSSF 的 .xlsx)。
我遇到了单元格之间的边界问题。
我需要将几个单元格合并到一行中,并且在该行中我需要将一个文本左对齐,另一个文本右对齐,例如:
但中间没有边界。
为了得到您在图像中看到的内容,我使用了两个合并区域,一个区域中文本向左对齐,另一个区域中文本向右对齐,我不确定是否有 better/more 是否方便,如果您知道,请将其写在答案中,但对于我现在的方法,问题在于该边框,我可以将其删除吗?我尝试将第一个合并区域的右边框设置为 NONE
,并将第二个合并区域的左边框也设置为 NONE
,但它不起作用。
我该如何处理?
您的屏幕截图显示的是网格线,而不是边框线。这是 spreadsheets 的差异。网格线显示在应用程序 window 中只是为了更好地查看单元格。它们不会被打印出来。
如果你不想看到网格线,你可以切换到不显示整个网格线 sheet,这是我不推荐的,或者你可以设置白色边框线,这将覆盖一些网格线那么
既然你已经标记了 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);
}
}
}
结果:
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);
你会得到
我正在使用 Apache POI 创建 excel 导出文件(带有 XSSF 的 .xlsx)。 我遇到了单元格之间的边界问题。
我需要将几个单元格合并到一行中,并且在该行中我需要将一个文本左对齐,另一个文本右对齐,例如:
但中间没有边界。
为了得到您在图像中看到的内容,我使用了两个合并区域,一个区域中文本向左对齐,另一个区域中文本向右对齐,我不确定是否有 better/more 是否方便,如果您知道,请将其写在答案中,但对于我现在的方法,问题在于该边框,我可以将其删除吗?我尝试将第一个合并区域的右边框设置为 NONE
,并将第二个合并区域的左边框也设置为 NONE
,但它不起作用。
我该如何处理?
您的屏幕截图显示的是网格线,而不是边框线。这是 spreadsheets 的差异。网格线显示在应用程序 window 中只是为了更好地查看单元格。它们不会被打印出来。
如果你不想看到网格线,你可以切换到不显示整个网格线 sheet,这是我不推荐的,或者你可以设置白色边框线,这将覆盖一些网格线那么
既然你已经标记了 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);
}
}
}
结果:
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);
你会得到