一开始我想说我在开发者世界里是全新的。
我尝试生成一个excel表,其中包含带边框的Mutiplication Table并设置背景颜色,但仅适用于第一列和第一行。
这是一个正确的示例:correct example
我写了类似的东西,但在结果文件中,彩色单元格没有边框:(。
请解释我如何同时设置背景颜色和边框。
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();
}
}
答案 0 :(得分:9)
你真正的问题是你有两个样式,一个名为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());
只需创建一个这样的样式:
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());
然后将其应用于您的手机:
Sheet sheet = workbook.createSheet();
Row row = sheet.createRow(1);
Cell cell = row.createCell(1);
cell.setCellStyle(backgroundStyle);
注意:如此处其他答案中所述,FillPattern = SOLID_FOREGROUND会忽略背景颜色,您必须为该模式设置前景颜色。这可能会造成混淆,因为您尝试将单元格背景设置为纯色。但cell background
与background color
不同。 Cell background
与Fill Pattern
相同,Foreground Color
有两种颜色Background Color
和Fill Pattern
这些颜色根据所选的特定SOLID_FOREGROUND
显示。 Foreground Color
填充仅使用nil
。
答案 1 :(得分:7)
将backgroundStyle.setFillBackgroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
更改为
backgroundStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
您可以设置如下边框:
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());
这将根据需要为您提供黄色和边框
答案 2 :(得分:7)
从POI 3.x开始,单元格填充颜色设置如下:
CellStyle cs = wb.createCellStyle(); cs.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); cs.setFillPattern(FillPatternType.SOLID_FOREGROUND);
答案 3 :(得分: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.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");
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);
if (cell.getRowIndex() == 0 || cell.getColumnIndex() == 0) {
CellStyle Style = workbook.createCellStyle();
Style.setFillBackgroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
Style.setFillPattern(CellStyle.BIG_SPOTS);
Style.setBorderBottom(CellStyle.BORDER_THIN);
Style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
Style.setBorderLeft(CellStyle.BORDER_THIN);
Style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
Style.setBorderRight(CellStyle.BORDER_THIN);
Style.setRightBorderColor(IndexedColors.BLACK.getIndex());
Style.setBorderTop(CellStyle.BORDER_THIN);
Style.setTopBorderColor(IndexedColors.BLACK.getIndex());
cell.setCellStyle(Style);
} else {
CellStyle Style = workbook.createCellStyle();
Style.setBorderBottom(CellStyle.BORDER_THIN);
Style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
Style.setBorderLeft(CellStyle.BORDER_THIN);
Style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
Style.setBorderRight(CellStyle.BORDER_THIN);
Style.setRightBorderColor(IndexedColors.BLACK.getIndex());
Style.setBorderTop(CellStyle.BORDER_THIN);
Style.setTopBorderColor(IndexedColors.BLACK.getIndex());
cell.setCellStyle(Style);
}
}
}
FileOutputStream out = new FileOutputStream(fileName);
workbook.write(out);
out.close();
}
}