2014年5月1日木曜日

[Java] POIで、名前が定義されているセルに値をセットする

Excelファイル(※2007以降の.xlsx形式)から名前が定義されているセルを取得し、値をセットする。

既に対象のWorkbookとSheetを取得している状態から。
XSSFName name = workbook.getName("cell's Name");
CellReference ref = new CellReference(name.getRefersToFormula());
XSSFRow row = sheet.getRow(ref.getRow());
XSSFCell cell = row.getCell(ref.getCol());
cell.setCellValue("value you want to set");

上記コードにて、単一のセルにも結合されたセルにも値をセットできることを確認済み。
結合されたセルは範囲で取得したりする必要があるかと思ったけど、今のところ問題無さそう。

また、存在しないセル名を指定している場合、1行目のworkbook#getNameはNullを返すので注意。

【環境】

 POI 3.10
 Java SE7

【参考】

POIで名前定義されているセルを取得する話 - kelkronsoの日記 -
POIで、名前定義の入ったカラムから値を取得。 - るいもの戯れ言 -

2014年4月30日水曜日

[Java] Apache POIで指定した範囲の中心に画像を貼り付けようとして挫折

下記の条件でExcelファイル(※2007以降の.xlsx形式)に画像を貼り付ける。(だいぶ限定的…)

1.画像を貼り付けるセル範囲が指定されている。
2.画像は指定された範囲内で、アスペクト比を保ったまま最大化する。
3.範囲は任意だが、指定された範囲のセルはすべて同じ幅であり、
 かつ指定された範囲のセルはすべて同じ高さとする。


こんな感じ。(水平・垂直方向が逆のケースもあり)


結論から言うと、完全にアスペクト比を保ったままの最適化は出来なかった。

上記図で言うmarginは画像貼り付け先の開始位置をずらしつつ、オフセットを指定することで構成されるが、オフセットの指定はint型でしか行えないことによる。(必要なオフセットは当然、小数の場合もある)

単純なことだが、それに気付くまでの軌跡は↓。。

// 画像とセル範囲のアスペクト比を比較
double imgRatio = (orgImgWidth / (double)orgImgHeight);
double cellRangeRatio = (cellRangeWidth / (double)cellRangeHeight);

// 高さを最大化し、水平方向位置を計算する
if (imgRatio < cellRangeRatio) {
  // 貼り付けられる画像の幅
  double imgWidth = (orgImgWidth * (cellRangeHeight / (double)orgImgHeight));

  // 余白の幅
  double margin = (cellRangeWidth - imgWidth) / 2 ;
  int offsetCol = (int)(margin /  cellWidth);
  imgStartCol = rcol1 + offsetCol;
  imgEndCol = rcol2 - offsetCol;
  int offset = (int)(XSSFShape.EMU_PER_PIXEL * (margin  %  cellWidth));
  dx1 = offset;
  dx2 = offset;

// 横を最大化し、垂直方向位置を計算する
} else if (imgRatio > cellRangeRatio) {
  // 貼り付けられる画像の高さ
  double imgHeight = (orgImgHeight * (cellRangeWidth / (double)orgImgWidth));

  // 余白の高さ
  double margin = (cellRangeHeight - imgHeight) / 2 ;
  int offsetRow = (int)(margin /  cellWidth);
  imgStartRow = rrow1 + offsetRow;
  imgEndRow = rrow2 - offsetRow;
  int offset =  (int)(XSSFShape.EMU_PER_PIXEL * (margin  %  cellHeight));
  dy1 = offset;
  dy2 = offset;
}

【環境】

 POI 3.10
 Java SE7

2014年4月29日火曜日

[JavaScript] 画像の一部を範囲選択してぼかす(もしくはその他の加工を行う)

ブラウザに表示される画像の一部を範囲選択してぼかす機能を実装したい。
まだ試してないけども下記なんかを組み合わせて実現できそう。

1.範囲選択

Jcrop - Deep Liquid - 

2.ぼかし(その他の加工も多く用意されている)

Pixastic: JavaScript Image Processing Library - 


と思ったらPixasticはIEじゃ動かない的な一文が。

Pixastic works by utilizing the HTML5 Canvas element which provides access to raw pixel data, thereby opening up for more advanced image effects. This is where the "experimental" part comes into play. Canvas is only supported by some browsers and unfortunately Internet Explorer is not one of them. 
とはいえこれがいつ書かれた文書なのか良くわからないので今度ちゃんと試してみる。





そういえば、
画像加工用のライブラリは大量にあるみたいだけど、範囲を指定して加工できるものはあまり無いような気がした。

2014年4月28日月曜日

BloggerのテンプレートにSyntaxHighlighter組み込んだ。

タイトル以上の情報なし。


下記サイトを参考に入れてみた。

Pirates of 富山湾: Bloggerにソースコードをきれいに載せる「SyntaxHighlighter」

なんか面倒なのかな…と思っていたけど3分ぐらいで設定終わって、即使えるようになった。
ありがとうございます。

[Java] Apache POI XSSFClientAnchor でoffset を指定して画像を貼り付ける

初POI。
EXCEL(.xlsx)ファイルに画像を貼り付ける際の offset の指定に苦戦。

画像の位置指定は XSSFClientAnchor クラスを用いて行う。
設定方法は下記の2通りが可能。

1.create時に位置指定を行う。

XSSFClientAnchor anchor = XSSFDrawing.createAnchor(
                          dx1, dy1, dx2, dy2, col1, row1, col2, row2);

2.create後に位置指定を行う。

XSSFClientAnchor anchor = XSSFCreationHelper.createClientAnchor();
anchor.setDx1(dx1);
anchor.setDy1(dy1);
anchor.setDx2(dx2);
anchor.setDy2(dy2);
anchor.setCol1(col1);
anchor.setRow1(row1);
anchor.setCol2(col2);
anchor.setRow2(row2);

※XSSFDrawing クラスに引数無しのcreateAnchorメソッドは無い模様。

開始位置・終了位置の指定

XSSFAnchor.setCol , setRowでcolumn・rowをそれぞれ指定する。
注意点としては、指定したセルの最右下の座標から開始されること。
anchor.setCol1(1);
anchor.setRow1(1);
anchor.setCol2(4);
anchor.setRow2(4);

と指定すると

と出力される。

また、左辺と上辺は罫線上に描画され、右辺と下辺は罫線に重ならない。


オフセットの指定

XSSFClientAnchor#setDx1, setDy1, setDx2, setDy2 で指定する。
これら setter の引数はjavadocには
the x coordinate within the first cell.
とあり、int型の引数が要求されているが、ピクセルなのかポイントなのかわからない。
適当な数字を入れても挙動の法則がわからなかったので、
The offsets are measured in EMUs (english metric units). There are 12700 emus in a point , see EMU_PER_PIXEL and EMU_PER_POINT constants in the XSSFShape class. 

To position a rectange with given width and height at a point (x,y) 
you need to transform all coordinates to Excel coordinate system, i.e 

x1 --> col1 + dx1 
y1 --> row1 + dy1 
x2 --> col2 + dx2 
y2 --> row2 + dy2 
EMUという単位で指定する、とのこと。
この数字はXSSFShape クラスに定義されており、1ポイント=12700EMU、1ピクセル=9525となっている。

その為、setColやsetRowで指定した開始位置から10ピクセルのoffsetを作りたい時は
setDx1(XSSFShape.EMU_PER_PIXEL * 10);
とすれば良い模様。


指定するdx1, dy1, dx2, dy2 はそれぞれ下記のようにオフセットを構成する。




【環境】

POI 3.10
Java SE7

【参考】

apache poi の HSSFClientAnchor について。 - 人工無脳が作りたかった
POI - User - How to calculate location of the shape in Excel 2007?
POI - Dev - Re: Anchor type for images in Excel



2012年6月16日土曜日

社会規範と市場規範の衝突

精神障害者の雇用義務化へ 厚労省方針、社会進出促す
厚生労働省は、新たに精神障害者の採用を企業に義務づける方針を固めた。身体障害者に加え、知的障害者の雇用を義務化した1997年以来の対象拡大になる。障害者の社会進出をさらに促す狙いだ。

記事では新たにづけられた精神障害者の雇用義務化を取り上げているが、それだけではなく、民間企業の障害者雇用率が現行の1.8%から2.0%に引き上げとなる(国や自治体、教育委員会の雇用率も引き上げとなる)。

来年度から適用。


同制度については賛成なのだが、考えさせられる問題があった。

社会規範と市場規範

記事について考えたことを述べる前に、社会規範と市場規範の関係について述べたい。
(この問題はダン・アリエリ『予想通りに不合理』に詳しい)


我々は二つの世界に生きている。
一つは他人のためを思った行動に、金銭等で見返りを要求しない世界。
社交性・共同体の必要性と切り離せない社会規範によって行動が決められる世界である。

もう一つは市場規範の支配する世界。
ここでは賃金契約や購買、価格、利息…シビアなやりとりが人の行動を決める。
一見、非人間的に思えるが、支払った分に見合うものが返ってくる厳格さや、独立心・独創性・個人主義を育むものでもある。


この二つの世界の切り分けをうまく行わないと、うまくやっていけない。

社会規範に基づき、善意で行ったことに対して金銭で返されたら誰もが不快に感じる。また、市場規範のもとで行われる取引を友人だからといって曖昧に済まそうとすると、信頼を失うことに繋がる。


託児所の失敗

こんな失敗例もある。

託児所で子どもの迎えに遅れる親が多いことから、罰金を科すことにした。
しかしこの罰金は遅刻を抑制するばかりか、迎えに遅れる親をいっそう増加させることに寄与した。

もともと親と託児所員の間では社会規範が採用されていたが、罰金という市場規範の導入が"金銭"と"託児サービス"の市場的取引をもたらした。(親はお金を払うのだから遅刻するのも自由だと考えたようだ)

さらに興味深いことに、この事態を憂うようになった託児所が罰金制度を廃止した後も遅刻する親は減らなかった(むしろわずかに増加した)。


この事例が物語るのは、社会規範と市場規範の衝突が一度起きると、社会規範は長い間(もしかしたら永遠に)失われてしまうということだ(1)



閑話休題…

前置きが長くなってしまったが、障害者雇用の義務化(目標率未達成時には罰金)にも、託児所の例と同じようなものを感じないだろうか。

障害者雇用を市場規範で促進させようとするならば、
民間企業は罰金を納めるのだから障害者を雇用しないのも自由だと考えるはず、ということだ。

社会のセーフティーネットは前時代では各人が所属する共同体が担っていたものだから、紛れもなく社会規範に基づくものである。

ここに、まさしく社会規範と市場規範の衝突があるように見える。



だとすれば、国は障害者雇用促進を廃止し、企業や自治体と障害者の間に社会規範が形成されるのを待つべきなのだろうか。
託児所の例からいえば、それには長い年月がかかるか、もしくは永遠に実現しない。



廃止したところで事態が悪化するのは間違いない。

そもそも雇用という概念自体が市場規範に基づいているからだ。そのため、雇用主は賃金に基づく見返りを期待せずにはいられない。


また、社会規範による関係で結ばれた人々で動いているような法人が存在しても、外側にいる一個人が新たに社会規範による関係を結ぶことができるだろうか。

障害者雇用義務が発生しない規模で、社会規範に基づく共同体により創立された企業(親族経営・個人経営)などでも、共同体の解体・個々人の分断がなされた現代の日本では、社会規範による関係を構築するのは難しいように思う。


障害者雇用促進法は維持すべき

長く愚見を述べたが、厚生労働省の発表によれば同法は功を奏している。

特例子会社数も順調に数を伸ばしている。


罰金という市場規範を打ち出していても、倫理的な選択を人は行えるということかもしれない。
(もちろんすべての対象団体が達成しているわけではないが)

この結果を見る限りこの制度には存続を期待する。





******************



ここまで書く途中、またわからないことが出てきた。


CSR活動とは社会規範と市場規範の衝突を産むものなのか。

倫理と社会規範とは別物なのだろうか。


考えてみたい。






1.この段落までは、『予想通りに不合理』(ダン・アリエリ、2008年、早川書房)第4章「社会規範のコスト」に基づいている。


2012年6月5日火曜日

『日本語の作文技術』書評


『日本語の作文技術』

今まで読まなかったのを後悔。本当に参考になった。
文章によほど自信のある方以外は、できるだけ早いうちに読んだ方が良いと思う。

本書で学んだ技術の実践のために、個人的に素晴らしいと感じた点を二つ。

一つは、一文一文を"読み手にわかりやすい"、より洗練された文章にすることを目的としている点。
本書は「構成を考えてから書き始めましょう」とか「段落を分けましょう」、「書いた文章は読み返しましょう」といったライティングスキルの基礎の基礎には飽き飽きしている人が次のステップに進むためのものだ。読み返して感じる違和感をどうやって払拭するか、その技術がきちんと書かれている。具体的には、テン(、)の打ち方や語順の入れ替え。これらで文章が驚くほどわかりやすくなることを、文の構造を図示し、悪文・訂正文を並べることで示している。
また、小説や詩といったあえてわかりにくい表現を用いる文章表現は目的外としているのも明確で良い。

二点目は、Must・Want・Don'tで技術を伝えていること。
(例)
「この場合には必ずテンを打たねばならない(Must)or打ってはいけない(Don't)」
   「テンを打つかは筆者に任されるが、思想を明確にしたいなら打った方が良い(Want)」etc.
本書に記されているのはあくまで技術であり、小うるさい規則ではないから、ルールにがんじがらめになり文章表現の幅が狭まるといったおそれはない。むしろ「思想の最小単位としてのテン」や「符号(。、・(「『”?!=-……` etc.)」の考え方・使い方をMust・Want・Don'tの切り分けとともに知ることで、言いたいことや書くべきことをよりわかりやすく表現する術が身に付く。読み進めるうちに、自分の文章の可能性が拡がるのを感じられる。


個人的にはぜひ国語の教師に読んでもらい、子どもたちにこの技術を伝えて欲しい。
(筆者の時代から国語の作文教育はあまり変わっていない様子…)