0

我有一个扩展名为 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(){

}

}

必需的输出 excel 工作表图像基于我的代码行为的当前输出 excel 工作表图像

任何人都可以在这里帮忙吗?

4

1 回答 1

1

促进对答案的评论....

你有两个问题。问题 #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();
于 2018-01-17T05:52:15.430 回答