项目场景:
项目中用到poi,有一个需要设置单元格背景色的需求
问题描述
尝试自带的预定义颜色,显示出的背景色都太深,达不到要求。于是便想到要自定义背景色。首先尝试了这种设置方法,
styleMain.setFillForegroundColor(new XSSFColor(new java.awt.Color(224, 217, 217),new DefaultIndexedColorMap()).getIndex());
结果显示出来是一片黑。
原因分析:
接下来经过查询知道,HSSFWorkbook和XSSFWorkbook设置背景色的方法是不同的。
HSSFWorkbook是这样设置的:
HSSFWorkbook excel = new HSSFWorkbook();//此行代码可以忽略
HSSFPalette palette = excel.getCustomPalette(); //拿到颜色板
palette.setColorAtIndex(HSSFColor.LIME.index, (byte) 0, (byte) 255, (byte) 127);//定义颜色块
XSSFWorkbook是这样设置的:
XSSFWorkbook wb = new XSSFWorkbook();//此行代码可以忽略
XSSFCellStyle style = wb.createCellStyle();//创建一个单元格style
XSSFColor color = new XSSFColor(new java.awt.Color(198,217,240),new DefaultIndexedColorMap()); //new java.awt.Color(198,217,240) 里的参数为RGB
style.setFillForegroundColor(color);//放入背景颜色参数中
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
这里有个问题,我项目里是使用workbook接口再根据不同的情况使用不同的实现类,因为workbook接口内没有对应的方法,所以无法直接使用这样的设置方式
解决方案:
经过思考,
1、接口实例化之后,就会有具体的实现类,有没有办法通过接口来调用实现类。这个思路行不通,因为接口本身是一种抽象,不能通过接口直接看到实现类。
2、既然无法通过接口来调用,那就只能通过实现类,能不能把接口转成实现类,这个思路行的通。形成这样的代码
if(workbook instanceof HSSFWorkbook){
HSSFWorkbook hssf = (HSSFWorkbook)workbook;
HSSFPalette palette = hssf.getCustomPalette(); palette.setColorAtIndex(HSSFColor.HSSFColorPredefined.LIME.getIndex(), (byte) 245, (byte) 245, (byte) 245);
}
问题解决。