SpreadsheetFormatRows格式为ColdFusion

时间:2016-06-09 13:40:01

标签: coldfusion coldfusion-10 cfspreadsheet

我使用ColdFusion和SpreadsheetNew,SpreadsheetAddRows,SpreadsheetFormatRows等功能创建Excel文件。根据我读过的文件link,他们是颜色和fgcolor的推荐。我对两者之间的区别有点困惑。一个是文字颜色而另一个是背景颜色?我一直在使用fgcolor来设置行的背景颜色。

// HEADER ROW FORMAT
formatHeaderRow = StructNew();
formatHeaderRow.fgcolor="royal_blue";

我的主要问题是,根据文档,我可以在org.apache.poi.hssf.util.HSSFColor颜色类中提供任何值作为我的颜色。但是,我真的需要提供HEX值或RGB。我知道Excel可以处理它,因为你可以在excel的colorpicker中输入。有没有办法为我的行颜色输入HEX或RGB值?

谢谢你!

更新

<cfscript>
// create XLSX workbook with a few cells
// and grab underlying POI objects
cfSheet = Spreadsheetnew("Sheet1", true);
poiWorkbook = cfSheet.getWorkBook();
poiSheet = poiWorkbook.getSheet("Sheet1");


// Create reusuable style objects 
// NOTE: Excel limits the maximum number of styles allowed. So do not create a new
// style for every cell. Create distinct styles once, and apply to multiple cells/rows.
Color = createObject("java", "java.awt.Color");

// Style 1: Cell with background color (only)
backgroundOnlyStyle = poiWorkbook.createCellStyle();
backgroundOnlyStyle.setFillPattern( backgroundOnlyStyle.SOLID_FOREGROUND );
XSSFColor = createObject("java", "org.apache.poi.xssf.usermodel.XSSFColor");
backgroundOnlyStyle.setFillForegroundColor( XSSFColor.init(Color.decode("##055910")) );

// Apply styles to cell A1. Note: POI indexes are 0-based
SpreadSheetSetCellValue(cfSheet, "background color only", 1, 1);
poiSheet.getRow( 0 ).setRowStyle( backgroundOnlyStyle );


</cfscript>

<!--- stream it to the browser --->
<cfheader name="Content-Disposition" value="inline; filename=reportName.xlsx">
<cfcontent type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" variable="#SpreadSheetReadBinary(cfSheet)#">

2 个答案:

答案 0 :(得分:6)

  

我对两者之间的区别有点困惑。

理解。属性名称是在POI(底层java库)中使用的约定之后建模的,这些约定从IMO开始有点令人困惑。由于ColdFusion仅实现了POI功能的一个子集,因此名称将脱离上下文,使其更加混乱。要回答您的问题,在POI中实际上有三个(3)相关的颜色属性:

  1. 字体颜色 - 即Font.setColor()

    单元格文本的颜色。在CF中,这由dataFormat.color属性控制。

  2. 单元格图案前景色 - 即CellStyle.setFillForegroundColor

    尽管有这个名字,但这是大多数人认为的细胞背景颜色(下图中的黄色)。在CF中,它由dataFormat.fgColor属性控制。

  3. 单元格图案背景颜色 - CellStyle.setFillBackgroundColor

    (可选)多色单元格图案中使用的辅助颜色(下图中为红色)。没有ColdFusion等价物。

  4. Excel Cell Fill Properties

      

    有没有办法为我的行颜色输入HEX或RGB值?

    最后我检查核心CF功能不支持它。但是,您可以使用does support it的基础POI库。假设您使用的是较新的.XLSX格式,可以通过创建CellStyle并应用所需的XSSFColor来完成。

    以下是如何通过POI设置字体和/或单元格背景颜色的示例(使用CF11测试)。虽然在实际代码中,我建议在可重用的函数中包含基本逻辑。

    示例:

    // create XLSX workbook with a few cells
    // and grab underlying POI objects
    cfSheet = Spreadsheetnew("Sheet1", true);
    poiWorkbook = cfSheet.getWorkBook();
    poiSheet = poiWorkbook.getSheet("Sheet1");
    
    
    // Create reusuable style objects 
    // NOTE: Excel limits the maximum number of styles allowed. So do not create a new
    // style for every cell. Create distinct styles once, and apply to multiple cells/rows.
    Color = createObject("java", "java.awt.Color");
    
    // Style 1: Cell with background color (only)
    backgroundOnlyStyle = poiWorkbook.createCellStyle();
    backgroundOnlyStyle.setFillPattern( backgroundOnlyStyle.SOLID_FOREGROUND );
    XSSFColor = createObject("java", "org.apache.poi.xssf.usermodel.XSSFColor");
    backgroundOnlyStyle.setFillForegroundColor( XSSFColor.init(Color.decode("##055910")) );
    
    // Style 2: Cell with font color (only)
    textOnlyStyle = poiWorkbook.createCellStyle();
    textFont = poiWorkbook.createFont();
    XSSFColor = createObject("java", "org.apache.poi.xssf.usermodel.XSSFColor");
    textFont.setColor( XSSFColor.init(Color.decode("##bd13be")) );
    textOnlyStyle.setFont( textFont );
    
    // Style 3: Cell with both backgound and Text color
    backgroundAndTextStyle = poiWorkbook.createCellStyle();
    textFont = poiWorkbook.createFont();
    XSSFColor = createObject("java", "org.apache.poi.xssf.usermodel.XSSFColor");
    textFont.setColor( XSSFColor.init(Color.decode("##a20932")) );
    backgroundAndTextStyle.setFont( textFont );
    XSSFColor = createObject("java", "org.apache.poi.xssf.usermodel.XSSFColor");
    backgroundAndTextStyle.setFillPattern( backgroundAndTextStyle.SOLID_FOREGROUND );
    backgroundAndTextStyle.setFillForegroundColor( XSSFColor.init(Color.decode("##192fda")) );
    
    // Apply styles to cell A1. Note: POI indexes are 0-based
    SpreadSheetSetCellValue(cfSheet, "background color only", 1, 1);
    poiSheet.getRow( 0 ).getCell( 0 ).setCellStyle( backgroundOnlyStyle );
    
    // Apply styles to cell A2
    SpreadSheetSetCellValue(cfSheet, "text color only", 2, 1);
    poiSheet.getRow( 1 ).getCell( 0 ).setCellStyle( textOnlyStyle );
    
    // Apply styles to cell A3
    SpreadSheetSetCellValue(cfSheet, "background AND text color", 3, 1);
    poiSheet.getRow( 2 ).getCell( 0 ).setCellStyle( backgroundAndTextStyle );
    
    // Save to file
    SpreadSheetWrite(cfSheet, "c:/path/to/yourFile.xlsx", true);
    

答案 1 :(得分:1)

在周末,我们的组织从ACF11升级到ACF2018,我发现给出的可接受答案不再起作用,因为该代码已被弃用且不再起作用。 ACF2018使用ACF11中 Apache POI Utility 的更新版本。显然,public function insertID(){ $query_1 = "INSERT INTO table_1 SET book_name=:book_name"; $stmt_1 = $this->conn->prepare($query_1); $this->book_name=$this->book_name; $stmt_1->bindParam(':book_name', $this->book_name); if($stmt_1->execute()){ $query_2 = "INSERT INTO table_2 SET book_type=:book_type, book_type_id=:book_type_id"; $stmt_2 = $this->conn->prepare($query_2); $this->book_type=$this->book_type; $this->book_type_id=$this->conn->lastInsertId(); $stmt_2->bindParam(':book_type', $this->book_type); $stmt_2->bindParam(':book_type_id', $this->book_type_id); if($stmt_2->execute()){ return true; }else{ return false; } }else{ return false; } } 属性已从SOLID_FOREGROUND对象中删除,并移至CellStyle对象。我只是想提供@Leigh在2016年给出的可接受答案的更新。顺便说一句,非常感谢@Leigh提供了一个出色的代码示例,该示例已经使用了几年。希望这个答案可以使人们免于将来在更新到较新版本的ACF时的痛苦。

根据3.17版的文档,该字段已删除。

FillPatternType

我在上面修改了@Leigh的代码,并添加了以下行

Use FillPatternType.SOLID_FOREGROUND instead.

From source code of apache-poi 3.15 I can see:

/**
 * Fill Pattern: Solidly filled
 * @deprecated 3.15 beta 3. Use {@link FillPatternType#SOLID_FOREGROUND} instead.
 */
@Removal(version="3.17")
static final short SOLID_FOREGROUND = 1; //FillPatternType.SOLID_FOREGROUND;

然后我修改了以下两行

FillPatternType = createObject("java", "org.apache.poi.ss.usermodel.FillPatternType");

并将其更改为

backgroundOnlyStyle.setFillPattern( backgroundOnlyStyle.SOLID_FOREGROUND );
...
backgroundAndTextStyle.setFillPattern( backgroundAndTextStyle.SOLID_FOREGROUND );

我创建了一个有效的示例和@Leigh代码的要点,并验证了它在从ACF10到ACF2018的所有版本的ACF中均适用。 https://trycf.com/gist/cb4edf103a75b60e0d62259b0f9941ff/acf2018?theme=monokai

backgroundOnlyStyle.setFillPattern( FillPatternType.SOLID_FOREGROUND );
...
backgroundAndTextStyle.setFillPattern( FillPatternType.SOLID_FOREGROUND );