3

使用 Coldfusion 8 是否有人能够将图像嵌入到 excel 电子表格 (xlsx) 中或通过 img src 链接它们?

一些背景信息:cf 服务器将获取一个带有产品行的 excel 文档。基于产品 id 和样式等,我能够找到或创建一个图像,该图像作为第一列添加到现有的 excel 文档中。

我知道 Coldfusion 9 有一个名为 SpreadsheetAddImage 的功能,不幸的是我在 cf 8 上没有机会升级。

4

1 回答 1

1

我不确定您当前使用什么来操作 xlsx 文件。但是,CF9 中的电子表格功能利用了POI,显然也可以从 CF8 中使用。它只需要更多的低级代码。

先决条件:

虽然 POI 与 CF8 捆绑在一起,但它是一个旧版本。您需要更新版本来操作 .xlsx 文件。您可以使用javaLoader - 或 - 替换{cf_root}\lib文件夹中的现有 jar。请注意,我不知道更换罐子是否有任何负面影响。

添加图像:

Excel 并不真正支持<img>标签,只支持超链接。但是,您可以像 SpreadsheetAddImage 那样在工作簿中嵌入图像。正如 POI 的Busy Developers Guide中所述,基本流程是:

  1. 使用 WorkBookFactory 加载 xlsx 文件
  2. 获取每个图像的二进制文件并将其添加到工作簿
  3. 将每个图像锚定到所需的单元格
  4. 将修改后的工作簿保存回磁盘

例子:


<cfscript>
    // .. 

    // load the xlsx file with the javaLoader
    factory = loader.create("org.apache.poi.ss.usermodel.WorkbookFactory");
    input = loader.create("java.io.FileInputStream").init( "c:/path/to/someFile.xlsx" );
    workbook = factory.create( input );
    input.close();

    // get the desired sheet and load helper objects (once)
    sheet     = workbook.getSheet("Your Sheet Name");
    patriarch = sheet.createDrawingPatriarch();
    helper    = workbook.getCreationHelper();

    // add the image to the workbook
    imageBytes  = fileReadBinary( "c:/path/to/someImage.jpg" );
    imageIndex  = workbook.addPicture( imageBytes, workbook.PICTURE_TYPE_JPEG );

    // anchor the picture to the first cell ie A1
    anchor     = helper.createClientAnchor();
    anchor.setRow1( javacast("int", 0) ); // row of first cell (zero based)
    anchor.setCol1( javacast("int", 0) ); // column of first cell (zero based)
    picture = patriarch.createPicture( anchor, imageIndex );
    picture.resize(); // only supported for jpg and png

    // save it back to disk
    outstream = loader.create("java.io.FileOutputStream").init( "c:/path/to/outFile.xlsx"" );
    workbook.write( outstream );
    outstream.flush();
    outstream.close(); 
</cfscript>

新列 具有讽刺意味的是,插入新列比添加图像更棘手。最后我检查了一下,POI 仍然缺少用于插入新列的内置函数。因此,在将图像插入第一列之前,您需要将所有现有单元格向右移动。棘手的部分是维护单元格格式、合并单元格等。

于 2012-04-20T02:57:07.250 回答