我有一个扩展名为 xls 的 Excel 文件。我想根据每行的第一列值给出所有行的背景颜色。 我的代码无法根据我的要求工作。背景颜色正在发生,但不符合要求。 我使用 apache POI jar 来实现。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
public class DemoPainter {
public void colorSheet() throws IOException {
FileInputStream fi = new FileInputStream(
"/vobs/SampleFile.xls");
POIFSFileSystem fs = new POIFSFileSystem(fi);
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);
System.out.println("Sheet Name: " + sheet.getSheetName());
startColor(sheet, wb);
}
public void startColor(HSSFSheet sheet, HSSFWorkbook wb) throws IOException {
for (int rowIndex = 0; rowIndex < sheet.getPhysicalNumberOfRows(); rowIndex++){
Row row=sheet.getRow(rowIndex);
Cell cell=row.getCell(0);
System.out.println(cell.getStringCellValue());
if(cell.getStringCellValue().equals("modified")){
setYellowColor(wb,row);
}
else if(cell.getStringCellValue().equals("removed")){
setRedColor();
}
else {
setGreenColor();
}
}
FileOutputStream out = new FileOutputStream(new File("/vobs/SampleFile1.xls"));
wb.write(out);
out.close();
}
public void setYellowColor(HSSFWorkbook wb,Row row){
CellStyle style = wb.createCellStyle();
System.out.println("started Yellow color");
style.setFillForegroundColor(HSSFColor.YELLOW.index);
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
row.setRowStyle(style);
}
public void setRedColor(){
}
public void setGreenColor(){
}
}
Required Output excel sheet image , Current Output excel sheet image based on my code behavior
有人可以帮忙吗?
最佳答案
将评论提升为答案......
你有两个问题。问题#1 - 单元格样式是工作簿范围内的,因此不要为每一行创建一个!预先创建它们一次,否则将超出 Excel 在工作簿中允许的最大样式数。
问题 #2 - 您没有为行中各个已完成的单元格设置样式。行样式是默认样式,适用于 Excel 中添加的新单元格。它们不适用于已存在的单元格,因为创建单元格时它始终引用已应用的样式。因此,您还需要在该行中的现有单元格上设置单元格样式
额外问题#3 - 您已在各处的 HSSF
中进行了硬编码,因此您的代码仅适用于 XLS
文件。请参阅http://poi.apache.org/spreadsheet/converting.html了解如何将代码更改为通用代码并适用于 XLSX
将您的代码更改为更像......
File input = new File("/vobs/SampleFile.xls");
DataFormatter formatter = new DataFormatter();
Workbook wb = WorkbookFactory.create(input);
Sheet sheet = wb.getSheetAt(0);
System.out.println("Sheet Name: " + sheet.getSheetName());
CellStyle yellow = wb.createCellStyle();
yellow.setFillForegroundColor(Color.YELLOW.index);
yellow.setFillPattern(CellStyle.SOLID_FOREGROUND);
// And Red etc
for (Row r : sheet) {
Cell c1 = r.getCell(0);
if (c1 == null) {
// Empty row
continue;
}
// Get cell as string
String val = formatter.formatCellValue(c1);
// Check
if(val.equals("modified")) {
r.setRowStyle(yellow);
for (Cell c : r) {
c.setCellStyle(yellow);
}
}
else if(val.equals("removed")){
// etc
}
}
FileOutputStream out = new FileOutputStream(new File("/vobs/Changed.xls"));
wb.write(out);
out.close();
关于java - 无法为 Excel 工作表中的行提供背景颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48254645/