2016-07-27 3 views
3

Я пытаюсь установить пользовательские цвета заливки в электронной таблице XSSF, но до сих пор они могли добавлять цвета только на основе цветов по умолчанию, доступных в java.awt.Color или org. apache.poi.ss.usermodel.IndexedColors. Вот что у меня есть:Настройка Apache POI XSSF fillForegroundColor от RGB

// 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, вот что я пробовал; все этот бросок «метод инициализации не был найден»:

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 имеет a Конструктор, определяемый как

Цвет (int rgb) Создает непрозрачный цвет sRGB с указанным комбинированным значением RGB, состоящим из красного компонента в битах 16-23, зеленого компонента в битах 8-15 и синего компонента в бит 0-7.

Я боюсь, что я понятия не имею, как создать комбинированное значение RGB, так я не в состоянии попробовать :-(

ответ

5

«метод инициализации не был найден»

На самом деле полное сообщение об ошибке говорит (курсив мой):

либо нет методов с указанным именем методы и типов аргументов или методом инициализации является Ове rloaded с типами аргументов , что 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) 
    ); 

Примечание стороны, вы можете также создать java.awt.Цветные объекты из шестнадцатеричной строки с использованием статического метода Color.decode():

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

Ли, вы - мужчина. Я подумал, что это должно быть что-то простое. Клянусь, я попробовал метод decode(), но должен был выполнить его неправильно. И, очевидно, я не нашел времени для исследования javacast в сочетании с CreateObject ... хотя ничего в CF-документах не появилось у меня. – earachefl

+0

Я знаю, что вы имеете в виду. Материал java немного более утончен. В любом случае рад, что это помогло :-) – Leigh

Смежные вопросы