excelファイルを書き出す時に、列幅が自動で変わってしまう場合の回避方法

既存のExcelファイル(xlsx や xls)を読み込み、セルに値を入れて、別名でExcelファイルを保存する際に、autosize="false"を指定していても、列幅が変わってしまう場合があります(通常は列幅が維持された状態で保存されます)。

これは、読み込んだExcelファイルが複雑な場合(列の結合などがある等)に起こりやすい模様です。autosize="false"が効かない理由はPOIのライブラリに依存するため不明ですが、思わぬ列幅が変更された場合の回避の方法として、最初にExcelファイルを読み込んだ後に、各カラムの列幅をプログラムで取得し、Excelファイルを書き出す直前に取得したカラムの列幅を指定してから書き出すという方法を試してください。

ColdFusionの関数ではカラム幅を取得する関数が用意されていないため、POIの機能を直接呼び出します。

【参考プログラム】

<cfspreadsheet action="read" src="test.xlsx" name="spdSheet">

<cfscript>
   aColumnWidth = ArrayNew(1); //カラム幅格納用配列
   objSheet=spdSheet.getWorkBook(); //ワークブックオブジェクト取得
   sh = objSheet.getSheetAt(0); //対象シート(今回は1シート目)を読み込む

   idx = 1;  //ループ開始値
   while (idx LTE SpreadsheetGetColumnCount(spdSheet)) {
     aColumnWidth[idx] = sh.getColumnWidth(idx-1);
     idx += 1;
   }

   //セルに値をセットする処理を記入

   idx = 1;  //ループ開始値
   while (idx LTE SpreadsheetGetColumnCount(spdSheet)) {
     sh.setColumnWidth(idx-1, aColumnWidth[loop]);
     idx += 1;
   }
</cfscript>

<CFSPREADSHEET action="write" name="spdSheet" filename="#ExpandPath('out_test.xlsx')#" autosize="false" overwrite="true" >


(参考サイト)
https://blog.java-reference.com/poi-width-set-get/

 


記事公開日:2022年03月30日
最終更新日:2022年03月31日


x

Sample Modal Window

This is just a sample…

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent suscipit iaculis libero sed tristique. Quisque mollis dolor non tellus placerat vitae sodales lectus porta. Curabitur ut suscipit tellus. Maecenas rhoncus, ante vitae vehicula vestibulum, metus sapien dapibus tellus, et mattis dolor neque vitae nisl. Nullam eleifend ultrices ipsum eget pretium. Curabitur semper metus ut ante adipiscing nec volutpat sem rutrum. Nullam a nisi lacus, non interdum ante. Vivamus ante augue, commodo vel egestas sed, pharetra nec dui. Quisque sed tellus felis. Donec ipsum mauris, sagittis eu accumsan in, aliquam non ipsum.

Vestibulum tempor nunc nec felis scelerisque eget elementum erat dignissim. Ut vel ipsum mollis orci venenatis luctus. Aenean vehicula quam vel quam porttitor ac iaculis elit pulvinar. Proin consequat, ipsum eu venenatis semper, justo turpis posuere tortor, ac placerat metus nisl et lectus. Nulla cursus dui id nunc ullamcorper sed semper nisl lobortis. Aliquam erat volutpat. Phasellus arcu ante, imperdiet in ornare sed, laoreet eu massa.