[英]different colors for cells in excel sheet using jxl
我一直在学习如何使用jXL API,因为我是新手。 我有一张excel表,我想根据真/假条件为单元格数据着色。 例如,如果条件为真,则必须为绿色,如果条件失败,则为红色。
我正在尝试使用jxl api将数据写入excel表时实现此目的。
我试图完成的代码片段如下。
用于写入Excel工作表的代码段。 我已经创建了一个方法来定义每个单元格的格式属性,wcellFormat1是一个变量,它的类型是WritableCellFormat。
for(int i=1; i11; i++){
String srnum = String.valueOf(rnum);
wsheet.addCell(new jxl.write.Label(1, rc, srnum, wcellFormat1));
wsheet.addCell(new jxl.write.Label(2, rc, "b", wcellFormat1));
wsheet.addCell(new jxl.write.Label(3, rc, "c", wcellFormat1));
wsheet.addCell(new jxl.write.Label(4, rc, "d", wcellFormat1));
wsheet.addCell(new jxl.write.Label(5, rc, "e", wcellFormat1));
wsheet.addCell(new jxl.write.Label(6, rc, "f", wcellFormat1));
rnum++;
rc++;
System.out.println(""+rnum+"\n"+rc);
}
wbook.write();
wbook.close();
此代码段用于应用我之前提到的条件。 wfontStatus的类型为WritableFont,fCellstatus的类型为WritableCellFormat,我用它来指定格式。
public void formatCellStatus(Boolean b) throws WriteException{
if(b == true){
wfontStatus = new WritableFont(WritableFont.createFont("Arial"), WritableFont.DEFAULT_POINT_SIZE, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.GREEN);
}else{
wfontStatus = new WritableFont(WritableFont.createFont("Arial"), WritableFont.DEFAULT_POINT_SIZE, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.RED);
}
fCellstatus = new WritableCellFormat(wfontStatus);
fCellstatus.setWrap(true);
fCellstatus.setAlignment(jxl.format.Alignment.CENTRE);
fCellstatus.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
fCellstatus.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.MEDIUM, jxl.format.Colour.BLUE2);
}
我面临的问题是,我不理解如何使用上述方法在写入工作表时应用必要条件。
这个你能帮我吗。 谢谢。
该方法应该类似于
public WritableCellFormat createFormatCellStatus(boolean b) throws WriteException{
Colour colour = (b == true) ? Colour.GREEN : Colour.RED;
WritableFont wfontStatus = new WritableFont(WritableFont.createFont("Arial"), WritableFont.DEFAULT_POINT_SIZE, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, colour);
WritableCellFormat fCellstatus = new WritableCellFormat(wfontStatus);
fCellstatus.setWrap(true);
fCellstatus.setAlignment(jxl.format.Alignment.CENTRE);
fCellstatus.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
fCellstatus.setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.MEDIUM, jxl.format.Colour.BLUE2);
return fCellstatus;
}
并在创建标签的循环内部
for(int i=1; i11; i++){
String srnum = String.valueOf(rnum);
wsheet.addCell(new jxl.write.Label(1, rc, srnum, createFormatCellStatus(true))); //will create green cell
wsheet.addCell(new jxl.write.Label(2, rc, "b", createFormatCellStatus(false))); //will create red cell
wsheet.addCell(new jxl.write.Label(3, rc, "c", createFormatCellStatus(false)));
wsheet.addCell(new jxl.write.Label(4, rc, "d", createFormatCellStatus(true)));
wsheet.addCell(new jxl.write.Label(5, rc, "e", createFormatCellStatus(false)));
wsheet.addCell(new jxl.write.Label(6, rc, "f", createFormatCellStatus(true)));
rnum++;
rc++;
System.out.println(""+rnum+"\n"+rc);
}
wbook.write();
wbook.close();
此方法只更新fCellstatus
变量。 所以它可以通过以下方式使用:
formatCellStatus(condition);
wsheet.addCell(new jxl.write.Label(columnNumber, rowNumber, "cellvalue", fCellstatus));
我认为将字段纳入这样的交互并不是一个好主意。 我建议以下列方式重新实现此方法:
public WritableCellFormat getCellFormatByCondition(boolean condition) {
if(b == true){
wfontStatus = new WritableFont(WritableFont.createFont("Arial"), WritableFont.DEFAULT_POINT_SIZE, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.GREEN);
}else{
wfontStatus = new WritableFont(WritableFont.createFont("Arial"), WritableFont.DEFAULT_POINT_SIZE, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.RED);
}
WritableCellFormat result = new WritableCellFormat(wfontStatus);
result .setWrap(true);
result .setAlignment(jxl.format.Alignment.CENTRE);
result .setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
result .setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.MEDIUM, jxl.format.Colour.BLUE2);
return result;
}
这种使用方式有点清洁:
wsheet.addCell(new jxl.write.Label(columnNumber, rowNumber, "cellvalue", getCellFormat(condition)));
我不得不说为每个单元创建新的WritableCellFormat
对象是浪费资源。 此外,jxl对单个工作簿中使用的格式数量有限制,因此在较大的工作表上将面临不正确的格式问题。
我建议重用格式对象:
private WritableCellFormat GREEN_CELL_FORMAT;
private WritableCellFormat RED_CELL_FORMAT;
private void createFormats() {
//you'll need to call this before writing workbook
//JXL has problems with using one format across several workbooks
WritableFont greenFont = new WritableFont(WritableFont.createFont("Arial"), WritableFont.DEFAULT_POINT_SIZE, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.GREEN);
WritableFont redFont= new WritableFont(WritableFont.createFont("Arial"), WritableFont.DEFAULT_POINT_SIZE, WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE, Colour.RED);
GREEN_CELL_FORMAT = getCellFormat(greenFont);
RED_CELL_FORMAT = getCellFormat(redFont);
}
private WritableCellFormat getCellFormat(WritableFont font) {
WritableCellFormat result = new WritableCellFormat(font);
result .setWrap(true);
result .setAlignment(jxl.format.Alignment.CENTRE);
result .setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
result .setBorder(jxl.format.Border.ALL, jxl.format.BorderLineStyle.MEDIUM, jxl.format.Colour.BLUE2);
return result;
}
private WritableCellFormat getCellFormatByCondition(boolean condition) {
return condition ? GREEN_CELL_FORMAT : RED_CELL_FORMAT;
}
因此,每个工作簿只能使用两个CellFormat对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.