2020年3月7日土曜日

POIでセル結合ありのエクセルデータをHTMLに変換

エクセルデータをHTMLに変換する方法を考えてみた。
http://higehige0.blog.fc2.com/blog-entry-57.html
を参考にさせていただきました。

int cct,int yiがセルの列位置、行位置
List<CellRangeAddress> rangeLstは、上記リンクを参照

Javaも関数型プログラミングが使えるようになってきたので、早速使ってみました。
String LTdt=  rangeLst.stream().filter(x->x.getFirstRow()==yi&&x.getFirstColumn()==cct).map(x->cct+","+yi+","+x.getLastColumn()+","+x.getLastRow()).findAny().orElse("");
String LTdt2= rangeLst.stream().filter(
        x->x.getFirstRow()<yi && x.getLastRow()>=yi && x.getFirstColumn()<cct && x.getLastColumn()>=cct
           || x.getFirstRow()==yi && x.getFirstColumn()<cct && x.getLastColumn()>=cct
           || x.getFirstRow()<yi && x.getLastRow()>=yi && x.getFirstColumn()==cct
        ).map(x->"DEL").findAny().orElse("");

LTdt、LTdt2の文字があるかどうかで、3パターンに分類して処理するとOkでした。
分類部分は省略しますが、表示部分は以下のような感じです。
・cst="<td >"+cellValue+"</td>";
・String CrSt[]=LTdt.split(",");
 String tdst="";
 if(!CrSt[0].equals(CrSt[2])) {
tdst=" colspan=\""+  ( Integer.parseInt(CrSt[2])-Integer.parseInt(CrSt[0]) +1 )+"\"";        }
 if(!CrSt[1].equals(CrSt[3])) {
tdst=tdst+" rowspan=\""+  ( Integer.parseInt(CrSt[3])-Integer.parseInt(CrSt[1]) +1 )+"\"";        }
 cst="<td "+width+" align=left "+tdst+">"+cellValue+"</td>";
・cst="";

0 件のコメント:

コメントを投稿