Java Apache Poi,如何同时设置背景颜色和边框

Rob*_*ski 10 java apache-poi

一开始我想说我在开发者世界里是全新的.

我试图生成一个excel表,其中包含带边框的Mutiplication Table并设置背景颜色,但仅适用于第1列和第1行.

这是一个正确的例子:正确的例子

我写了类似的东西,但在结果文件中,彩色单元格没有边框:(.

请解释我如何同时设置背景颜色和边框.

import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.IndexedColors; import java.awt.image.IndexColorModel; import java.io.FileOutputStream; import java.io.IOException; import java.util.Scanner; public class Excel { public static void main(String[] args) throws IOException { Scanner in = new Scanner(System.in); System.out.println("enter number of rows: "); int x = in.nextInt(); System.out.println("enter number of columns: "); int y = in.nextInt(); System.out.println("enter name of file: "); String fileName = in.next() + ".xls"; System.out.println("Multiplication table will be created in file: " + fileName); createExcelMultiplicationTable(fileName, x, y); System.out.println("Process successful executed"); } private static void createExcelMultiplicationTable(String fileName, int x, int y) throws IOException { Workbook workbook = new HSSFWorkbook(); Sheet sheet = workbook.createSheet("multiplicationTable"); CellStyle backgroundStyle = workbook.createCellStyle(); backgroundStyle.setFillBackgroundColor(IndexedColors.GREY_50_PERCENT.getIndex()); backgroundStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); CellStyle borderStyle = workbook.createCellStyle(); borderStyle.setBorderBottom(CellStyle.BORDER_THIN); borderStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); borderStyle.setBorderLeft(CellStyle.BORDER_THIN); borderStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); borderStyle.setBorderRight(CellStyle.BORDER_THIN); borderStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); borderStyle.setBorderTop(CellStyle.BORDER_THIN); borderStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); for (int i = 1; i <= x; i++) { Row row = sheet.createRow(i - 1); for (int j = 1; j <= y; j++) { Cell cell = row.createCell(j - 1); cell.setCellValue(i * j); cell.setCellStyle(borderStyle); if (cell.getRowIndex() == 0 || cell.getColumnIndex() == 0) { cell.setCellStyle(backgroundStyle); } } } FileOutputStream out = new FileOutputStream(fileName); workbook.write(out); out.close(); } }
Run Code Online (Sandbox Code Playgroud)

Kar*_*hik 11

改变 backgroundStyle.setFillBackgroundColor(IndexedColors.GREY_50_PERCENT.getIndex());

 backgroundStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
Run Code Online (Sandbox Code Playgroud)

你可以设置如下边框:

        backgroundStyle.setBorderBottom(CellStyle.BORDER_THIN);
        backgroundStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
        backgroundStyle.setBorderLeft(CellStyle.BORDER_THIN);
        backgroundStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
        backgroundStyle.setBorderRight(CellStyle.BORDER_THIN);
        backgroundStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
        backgroundStyle.setBorderTop(CellStyle.BORDER_THIN);
        backgroundStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
Run Code Online (Sandbox Code Playgroud)

这将根据需要为您提供黄色和边框

  • 我想你忘了提到 `.setFillPattern(FillPatternType.SOLID_FOREGROUND);`,没有它,单元格的背景颜色对我来说不会改变。 (3认同)

jma*_*phy 11

你真正的问题是你有两个样式,一个名为backgroundStyle,另一个名为borderStyle.然后,您将两种样式应用于同一单元格,但单元格只能有一种样式,因此您将使用第二种样式覆盖第一种样式,而不是添加第二种样式.

代替:

    CellStyle backgroundStyle = workbook.createCellStyle();

    backgroundStyle.setFillBackgroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
    backgroundStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);

    CellStyle borderStyle = workbook.createCellStyle();

    borderStyle.setBorderBottom(CellStyle.BORDER_THIN);
    borderStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
    borderStyle.setBorderLeft(CellStyle.BORDER_THIN);
    borderStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
    borderStyle.setBorderRight(CellStyle.BORDER_THIN);
    borderStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
    borderStyle.setBorderTop(CellStyle.BORDER_THIN);
    borderStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
Run Code Online (Sandbox Code Playgroud)

只需创建一个这样的单一样式:

    CellStyle backgroundStyle = workbook.createCellStyle();

    backgroundStyle.setFillBackgroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
    backgroundStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);

    backgroundStyle.setBorderBottom(CellStyle.BORDER_THIN);
    backgroundStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
    backgroundStyle.setBorderLeft(CellStyle.BORDER_THIN);
    backgroundStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
    backgroundStyle.setBorderRight(CellStyle.BORDER_THIN);
    backgroundStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
    backgroundStyle.setBorderTop(CellStyle.BORDER_THIN);
    backgroundStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
Run Code Online (Sandbox Code Playgroud)

然后将其应用于您的单元格:

    Sheet sheet = workbook.createSheet();
    Row row = sheet.createRow(1);
    Cell cell = row.createCell(1);
    cell.setCellStyle(backgroundStyle);
Run Code Online (Sandbox Code Playgroud)

注意:如此处的其他答案中所述,FillPattern = SOLID_FOREGROUND忽略背景颜色,您必须为该模式设置前景颜色.这可能会造成混淆,因为您尝试将单元格背景设置为纯色.但是cell background不一样background color.Cell backgroundFill Pattern具有两种颜色a Foreground Color和a 的相同Background Color是基于所Fill Pattern选择的特定颜色显示的.该SOLID_FOREGROUND填充只使用Foreground Color.

  • +++++为笔记! (2认同)

Sla*_*mir 10

从POI 3.x开始,单元格填充颜色设置如下:

CellStyle cs = wb.createCellStyle(); cs.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); cs.setFillPattern(FillPatternType.SOLID_FOREGROUND);