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を使用するか、またはフォルダー内の既存の jar を置き換えることができ{cf_root}\libます。瓶を交換することで悪影響があるかどうかはわかりません.

画像の追加:

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 に答える