Apache POI XSSF设置RGB颜色填充前景色

3

我正在尝试在 XSSF 电子表格中设置自定义填充颜色,但到目前为止,我只能添加基于 java.awt.Color 或 org.apache.poi.ss.usermodel.IndexedColors 中可用的默认颜色的颜色。这是我目前可以使用的代码:

// setup
var workbook= CreateObject( 
    "java",
    "org.apache.poi.xssf.usermodel.XSSFWorkbook"
).Init();

var sheet = workbook.CreateSheet('test');
var row = sheet.CreateRow( 0 );

// first cell, using IndexedColors
var cell = row.createCell( 0 );
cell.setCellValue('test');

var IC = CreateObject( 
    "java",
    "org.apache.poi.ss.usermodel.IndexedColors"
);
var style = workbook.createCellStyle();
style.setFillPattern(style.SOLID_FOREGROUND);
style.setFillForegroundColor(IC.SKY_BLUE.getIndex());
cell.setCellStyle(style);

// second cell, using java.awt.Color
var cell2 = row.createCell( 1 );
cell2.setCellValue('test two');

var C = CreateObject( 
    "java",
    "java.awt.Color"
);
var XSSFColor = createObject("java", "org.apache.poi.xssf.usermodel.XSSFColor");
var myColor = XSSFColor.init(C.BLUE);   
var style2 = workbook.createCellStyle();
style2.setFillPattern(style2.SOLID_FOREGROUND);
style2.setFillForegroundColor(myColor);
cell2.setCellStyle(style2);

var FileOutputStream = CreateObject(
    "java",
    "java.io.FileOutputStream"
).Init( myFileName );

// Write the workout data to the file stream.
workbook.Write( 
    FileOutputStream 
);

// Close the file output stream. 
FileOutputStream.Close();

所有的东西都可以正常工作;然而,我仍然没有更近地使用RGB值获取颜色的方法。假设我想要创建一个XSSFColor使用java.awt.Color,我应该能够创建一个Color对象使用任意数量的构造函数。来自https://docs.oracle.com/javase/7/docs/api/java/awt/Color.html,这是我尝试过的内容; 所有这些都会抛出“未找到init方法”的异常:

var C = CreateObject( 
    "java",
    "java.awt.Color"
);
// constructor Color(int r, int g, int b)
// var c1 = C.init(197,217,241); 
// constructor Color(int r, int g, int b, int a)
// var c1 = C.init(197,217,241,255);
// constructor Color (float r, float g, float b);
// var c1 = C.init(0.0, 0.5, 1.0);

现在,XSSFColor有一个构造函数,允许您传递一个字节数组;这带来了我的下一个问题。暂时不考虑Java字节是有符号的事实,如果我尝试创建一个字节数组并将其传递给构造函数,就会抛出异常:

var bytes = javaCast(
    "byte[]",
    [
        javaCast("byte", 50), 
        javaCast("byte", 50), 
        javaCast("byte", 50)
    ]
);
var XSSFColor = createObject("java", "org.apache.poi.xssf.usermodel.XSSFColor");
var c1 = XSSFColor.init(bytes); // throws "Unable to find a constructor for class org.apache.poi.xssf.usermodel.XSSFColor that accepts parameters of type ( [B )."

最后,java.awt.Color有一个构造函数定义为

Color(int rgb) 使用指定的组合RGB值创建不透明的sRGB颜色,其中红色分量位于位16-23,绿色分量位于位8-15,蓝色分量位于位0-7。

很抱歉我不知道如何创建组合RGB值,因此无法尝试 :-(

1个回答

5
"init方法未找到" 实际上完整的错误信息是(重点在此): 要么没有指定方法名称和参数类型的方法,要么init方法使用了ColdFusion无法可靠解密的参数类型进行了重载。 ColdFusion找到了2种与提供的参数匹配的方法。 如果这是一个Java对象,并且您已经验证了该方法存在,请使用javacast函数来减少歧义。 与CF不同,Java是强类型的。 因此,像java.awt.Color这样的类可以包含具有相同参数数量但不同数据类型的多个构造函数。 例如: Color(float r, float g, float b) Color(int r, int g, int b) 由于CF是弱类型的,它不确定要调用哪个构造函数。 要解决歧义,您需要在参数上使用javacast(),即:
var color = CreateObject( "java","java.awt.Color").init(
         javacast("int", redValue)
        , javacast("int", greenValue)
        , javacast("int", blueValue)
   );

顺带一提,你也可以使用静态方法Color.decode()从十六进制字符串创建java.awt.Color对象:

 var color = CreateObject( "java","java.awt.Color").decode("##323232"); 

1
Leigh,你真是太棒了。我想这一定是一些简单的东西。我发誓我尝试过decode()方法,但可能实现得不正确。显然,我没有花时间研究javacast与CreateObject的结合...虽然CF文档中没有任何提示。 - earachefl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接