Apache POI XSSF 从 RGB 设置 fillForegroundColor
Apache POI XSSF setting fillForegroundColor from RGB
我正在尝试在 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 值获取颜色还差得很远。假设我想使用 java.awt.Color 创建一个 XSSFColor,我应该能够使用任意数量的构造函数创建一个 Color 对象。来自 https://docs.oracle.com/javase/7/docs/api/java/awt/Color.html,这是我尝试过的;所有这些都抛出 "the init method was not found":
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 有一个构造函数定义为
颜色(int rgb)
创建具有指定组合 RGB 值的不透明 sRGB 颜色,该值由位 16-23 中的红色分量、位 8-15 中的绿色分量和位 0-7 中的蓝色分量组成。
恐怕我不知道如何创建组合的 RGB 值,所以我无法尝试:-(
"the init method was not found"
实际上完整的错误消息说(强调我的):
Either there are no methods with the specified method name and
argument types or the init method is overloaded with argument types
that ColdFusion cannot decipher reliably. ColdFusion found 2 methods
that match the provided arguments. If this is a Java object and you
verified that the method exists, use the javacast function to reduce
ambiguity.
与 CF 不同,java 是强类型的。所以 类 和 java.awt.Color 一样可以包含多个具有相同 number 个参数但不同数据类型的构造函数。例如:
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");
我正在尝试在 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 值获取颜色还差得很远。假设我想使用 java.awt.Color 创建一个 XSSFColor,我应该能够使用任意数量的构造函数创建一个 Color 对象。来自 https://docs.oracle.com/javase/7/docs/api/java/awt/Color.html,这是我尝试过的;所有这些都抛出 "the init method was not found":
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 有一个构造函数定义为
颜色(int rgb) 创建具有指定组合 RGB 值的不透明 sRGB 颜色,该值由位 16-23 中的红色分量、位 8-15 中的绿色分量和位 0-7 中的蓝色分量组成。
恐怕我不知道如何创建组合的 RGB 值,所以我无法尝试:-(
"the init method was not found"
实际上完整的错误消息说(强调我的):
Either there are no methods with the specified method name and argument types or the init method is overloaded with argument types that ColdFusion cannot decipher reliably. ColdFusion found 2 methods that match the provided arguments. If this is a Java object and you verified that the method exists, use the javacast function to reduce ambiguity.
与 CF 不同,java 是强类型的。所以 类 和 java.awt.Color 一样可以包含多个具有相同 number 个参数但不同数据类型的构造函数。例如:
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");