2013年5月2日木曜日

JAVA Spring 3.2.2を使ってみた

Springの使い方について、調べてみた。


今回の環境は、
Java 1.6系
Spring 3.2.2
spring-context-3.2.2.RELEASE.jar
spring-context-support-3.2.2.RELEASE.jar
spring-core-3.2.2.RELEASE.jar
spring-beans-3.2.2.RELEASE.jar
spring-expression-3.2.2.RELEASE.jar
Apache Commons
commons-logging-1.1.3.jar

今回作成するもの
実行用クラスとBeanクラス、Spring用設定XMLの3種類です。
今回のサンプルでは、Spring用設定XMLファイルを配置する場所にクラスパスを通してください。

実行用クラスのソース(SpringTest.java)

package sample;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
public class SpringTest  {
   public static void main(String args[]){
      // アプリケーションコンテキストの読み込み
      ApplicationContext contxt = new ClassPathXmlApplicationContext("applicationContext.xml");
      
      // Beanを取得
      SampleBean bean = (SampleBean)contxt.getBean("target");
      
      // 標準出力へ
      System.out.println(bean.getMessage());
   }
}


Beanクラスのソース(SampleBean.java)

package sample;

public class SampleBean {
 // コンストラクタ
 public SampleBean() {
 }

 /**
  * メッセージ
  */
 private String message;

 /**
  * メッセージ取得メソッド
  * @return
  */
 public String getMessage() {
  return this.message;
 }

 /**
  * メッセージ設定メソッド
  * @param message
  */
 public void setMessage(String message) {
  this.message = message;
 }
}


SQLMapperXMLファイル(User.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
   <bean id="target" class="sample.SampleBean" >
      <property name="message" >
         <value>Hello World!</value>
      </property>
   </bean>
</beans>


今回作成したものは、簡単なサンプルです。

2013年5月1日水曜日

JAVA Mybatis 3.2.2 を使ってみた

Mybatisの使い方について、調べてみた。

使い方は、いくつかあるみたいですが、XMLを利用した方法について
ここでは書きます。

今回の環境は、
Java 1.6系
mybatis mybatis-3.2.2.jar
Driver mysql-connector-java-5.0.4-bin.jar
MySQL 5.0

MySQLは、自分のローカル端末にインストールされている
バージョンを使ったため、古いですが最新は、5.6系です。
興味のある方は、Downloadして使ってみてください。
機能的にかなり更新されているはずです。

今回作成するもの
JavaクラスとMybatis用設定XMLファイル、SQLMapperXMLファイルの3種類です。
今回のサンプルでは、Mybatis用設定XMLファイル、SQLMapperXMLファイルを
配置する場所にクラスパスを通してください。

Javaのソース(MybatisTest.java)

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MybatisTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
  try {
   String resource = "mybatisConfig.xml";
   InputStream inputStream;
   inputStream = Resources.getResourceAsStream(resource);
   SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
   SqlSession session = sqlSessionFactory.openSession();
   System.out.println(session.selectList("User.select"));
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

}


Mybatis用設定XMLファイル(mybatisConfig.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/groupware"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="User.xml"/>
  </mappers>
</configuration>


SQLMapperXMLファイル(User.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="User">
  <select id="select" parameterType="java.util.HashMap" resultType="java.util.HashMap">
    SELECT
      USERID,
      USERNAME,
      EMAIL,
      TEL,
      PASSWORD
    FROM
      USER
  </select>
</mapper>


今回作成したものは、簡単なサンプルです。
Javaのクラスは、環境にあわせて変えて試してください。

2011年7月2日土曜日

Excel シートの存在チェック2

ワークブックにシートが存在するかチェックする関数

パラメータは、ワークブックのオブジェクトとシート名
パラメータで渡したワークブックに、パラメータで渡したシート名が存在する場合にtrueが返却される。存在しない場合は、falseが返却される。

Public Function sheetExist(book As Workbook, name As String)
    
    Dim ws As Worksheet
    Dim flag As Boolean
    
    For Each ws In book.Worksheets
        If ws.name = name Then
            flag = True
            Exit For
        End If
    Next ws
    sheetExist = flag
End Function


シートを追加する処理などでチェックをしておくと、エラーを回避できます。

2011年6月28日火曜日

Excel シートの存在チェック

Public Function sheetExist(name As String)
   
    Dim ws As Worksheet
    Dim flag As Boolean
   
    For Each ws In Worksheets
        If ws.name = name Then
            flag = True
            Exit For
        End If
    Next ws
    sheetExist = flag
End Function

2011年6月21日火曜日

Excel オートシェイプ メモ用

    ActiveSheet.Shapes.AddShape(msoShapeRectangle, 54#, 13.5, 54#, 13.5). _
        Select
    Selection.ShapeRange.Fill.Visible = msoTrue
    Selection.ShapeRange.Fill.Solid
    Selection.ShapeRange.Fill.ForeColor.SchemeColor = 43
    Selection.ShapeRange.Fill.Transparency = 0#
    Selection.ShapeRange.Line.Weight = 0.75
    Selection.ShapeRange.Line.DashStyle = msoLineSolid
    Selection.ShapeRange.Line.Style = msoLineSingle
    Selection.ShapeRange.Line.Transparency = 0#
    Selection.ShapeRange.Line.Visible = msoTrue
    Selection.ShapeRange.Line.ForeColor.SchemeColor = 64
    Selection.ShapeRange.Line.BackColor.RGB = RGB(255, 255, 255)
    ExecuteExcel4Macro "FORMULA(""=R[1]C"")"
    Range("A1").Select
    ActiveCell.FormulaR1C1 = "6/21/2011"
    Range("A2").Select
    ActiveSheet.Shapes("Rectangle 1").Select
    Range("C4").Select
    ActiveSheet.Shapes("Rectangle 1").Select
    ExecuteExcel4Macro "FORMULA(""=RC"")"
    Range("C6:C7").Select
    Range("C7").Activate
    ActiveSheet.Shapes("Rectangle 1").Select
    Selection.ShapeRange.Line.Weight = 1.25
    Selection.ShapeRange.Line.DashStyle = msoLineSolid
    Selection.ShapeRange.Line.Style = msoLineSingle
    Selection.ShapeRange.Line.Transparency = 0#
    Selection.ShapeRange.Line.Visible = msoTrue
    Selection.ShapeRange.Line.ForeColor.SchemeColor = 64
    Selection.ShapeRange.Line.BackColor.RGB = RGB(255, 255, 255)
    Selection.ShapeRange.Fill.Visible = msoTrue
    Selection.ShapeRange.Fill.ForeColor.SchemeColor = 43
    Selection.ShapeRange.Fill.Transparency = 0#
    Selection.ShapeRange.Fill.OneColorGradient msoGradientVertical, 1, 0.23
    ActiveSheet.Shapes.AddShape(msoShapeRectangle, 63#, 54#, 54#, 13.5). _
        Select
    Selection.ShapeRange.Line.Weight = 0.75
    Selection.ShapeRange.Line.DashStyle = msoLineSolid
    Selection.ShapeRange.Line.Style = msoLineSingle
    Selection.ShapeRange.Line.Transparency = 0#
    Selection.ShapeRange.Line.Visible = msoTrue
    Selection.ShapeRange.Line.ForeColor.SchemeColor = 64
    Selection.ShapeRange.Line.BackColor.RGB = RGB(255, 255, 255)
    Selection.ShapeRange.Fill.Visible = msoTrue
    Selection.ShapeRange.Fill.ForeColor.SchemeColor = 33
    Selection.ShapeRange.Fill.BackColor.RGB = RGB(255, 255, 255)
    Selection.ShapeRange.Fill.Transparency = 0#
    Selection.ShapeRange.Fill.Patterned msoPattern5Percent
    ActiveSheet.Shapes.Range(Array("Rectangle 2", "Rectangle 1")).Select
    Selection.ShapeRange.Group.Select

2011年6月19日日曜日

JAVA Log4J 1.2.17 を使ってみた!5

今日は、ログファイルのローテーションの方法を書きます。

環境周りは、省略します。
環境を確認したい方は、
こちらこちら


注目するのは、4行目から10行目の内容
<appender ~>~</appender>
この内容がログファイルのローテーションの方法を設定している。

<appender name="File" class="org.apache.log4j.DailyRollingFileAppender">
nameには、appenderの名前を指定する。
(ファイルとコンソール出力の時と同じ)
classには、org.apache.log4j.DailyRollingFileAppenderを指定する。
このクラスがファイルに出力し、ローテーションするためのクラスとなる。

<param ~ />に設定可能な項目は、
DatePattern、File、Append、BufferedIO、BufferSize、Threshold、ImmediateFlush、Encoding
DatePattern以外は、FileAppenderで説明したので省略します。

DatePatternのvalueに設定する内容によって、ローテーションするタイミングが変わります。


ローテーションのタイミングについては、
'.'yyyy-MM         月が変わるごと
'.'yyyy-ww         週が変わるごと
'.'yyyy-MM-dd      日が変わるごと
'.'yyyy-MM-dd-a    午前と午後が変わるごと
'.'yyyy-MM-dd-HH   1時間ごと


他のparamについて詳しく知りたい方は、こちら

<layout ~></layout>
レイアウトについても、前回までに説明したので省略します。


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
   <appender name="File" class="org.apache.log4j.DailyRollingFileAppender">
      <param name="File" value="C:/log4j.log" />
      <param name="DatePattern" value="'.'yyyy-MM-dd" />
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p %c - %-5m [%t] (%F:%L)%n"/>
      </layout>
   </appender>
   <appender name="Console" class="org.apache.log4j.ConsoleAppender">
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p %c - %-5m [%t] (%F:%L)%n"/>
      </layout>
   </appender>
   <root>
      <level value="debug" />
      <appender-ref ref="Console" />
      <appender-ref ref="File" />
   </root>
</log4j:configuration>


2011年6月18日土曜日

JAVA Log4J 1.2.17 を使ってみた!4

今日は、コンソールの出力方法を書きます。

環境周りは、省略します。
環境を確認したい方は、
こちらこちら


注目するのは、10行目から14行目の内容
<appender ~>~</appender>
この内容がコンソールに出力する内容を設定している。

<appender name="Console" class="org.apache.log4j.ConsoleAppender">
nameには、appenderの名前を指定する。(ファイル出力の時と同じ)
classには、org.apache.log4j.ConsoleAppenderを指定する。
このクラスがコンソールに出力するためのクラスとなる。

<layout ~></layout>
レイアウトについては、前回説明したので省略します。


明日以降に、ログファイルのローテーションについて書きます。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
   <appender name="File" class="org.apache.log4j.FileAppender">
      <param name="File" value="C:/log4j.log" />
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p %c - %-5m [%t] (%F:%L)%n"/>
      </layout>
   </appender>
   <appender name="Console" class="org.apache.log4j.ConsoleAppender">
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p %c - %-5m [%t] (%F:%L)%n"/>
      </layout>
   </appender>
   <root>
      <level value="debug" />
      <appender-ref ref="Console" />
      <appender-ref ref="File" />
   </root>
</log4j:configuration>


2011年6月17日金曜日

JAVA Log4J 1.2.17 を使ってみた!3

昨日かけなかったLog4jについて、今日も続きの内容を書こう。

環境周りは、昨日までに2回書いてるのでパスします。確認したい方は、
昨日分はこちら
一昨日分はこちら


昨日書けなかった、<layout ~>~</layout>について、
今回使ったLayoutクラスは、org.apache.log4j.PatternLayoutを使用した。
自分でログの出力フォーマットを決めることができるクラスで、
フォーマットについては、<param ~/>で設定する。
nameには、ConversionPatternを設定し、valueにフォーマットを指定する。
今回は、"%d %-5p %c - %-5m [%t] (%F:%L)%n"を設定
%dは、日付を出力
%pは、ログのレベルを出力
%cは、ログを出力したクラスを出力
%mは、メッセージの内容を出力k
%tは、スレッドを出力
&Fは、ログを出力したファイル名を出力
%Lは、ログを出力したファイルの行番号を出力
%nは、改行コードを出力


一昨日のクラスを実行して出力されるログは、下記のようになる。


2011-06-17 21:34:48,436 DEBUG sample.Test - デバッグだよ~ [main] (Test.java:11)
2011-06-17 21:34:48,436 INFO  sample.Test - インフォだよ。 [main] (Test.java:12)
2011-06-17 21:34:48,436 WARN  sample.Test - ワーニング! [main] (Test.java:13)
2011-06-17 21:34:48,436 ERROR sample.Test - エラーッ!! [main] (Test.java:14)
2011-06-17 21:34:48,436 FATAL sample.Test - フェイタルッ!!! [main] (Test.java:15)


2011年6月16日木曜日

JAVA Log4J 1.2.17 を使ってみた!2

昨日の続きで、今日もLog4jについて調べてみた。

今日も昨日と同様の環境だが、念のためのせておこう。
Java 1.6系
log4j log4j-1.2.17.jar

クラスパスにlog4j-1.2.17.jarを指定する。
ダウンロードは、こちら

昨日は、コンソールとファイルに出力されるように設定ファイルを
作成していた。
まずは、何をどうすれば、ファイルに出力されるのか書くことにする。

注目するのは、4行目から9行目の内容
<appender ~>~</appender>
この内容がファイルに出力する内容を設定している。

<appender name="File" class="org.apache.log4j.FileAppender">
nameには、appenderの名前を指定する。
classには、org.apache.log4j.FileAppenderを指定する。
このクラスがファイルに出力するためのクラスとなる。

<param name="File" value="C:/log4j.log" />
paramタグは、appenderに渡すパラメータを指定する。
nameにFileを指定し、vlaueに出力するファイルのパスを指定する。
この内容が出力先のファイル名になる。
ファイルが存在していない場合は、自動で作成する。


それ以外のパラメータは、Append、BufferedIO、BufferSize、
Threshold、ImmediateFlush、Encoding


Appendについては、追記モードを指定する。
指定する値は、boolean(true/false)を設定する。
初期値(指定しない場合)は、falseになっていて追記されない。
毎回ファイルを上書きするので注意が必要。

<param name="Append" value="true" />


BufferedIOについては、バッファリングを指定する。
指定する値は、boolean(true/false)を設定する。
初期値(指定しない場合)は、falseになっていてバッファリングされない。


BufferSizeについては、バッファサイズを指定する。
バッファリングをする場合のバッファサイズになる。


Thresholdについては、appenderごとに出力するログのレベルを指定する。
指定する値は、DEBUG/INFO/WARN/ERROR/FATALを指定できる。


ImmediateFlushについては、バッファの内容を即時出力するかを指定する。
指定する値は、boolean(true/false)を設定する。
初期値(指定しない場合)は、trueになっていてバ即時に出力する。


Encodingについては、出力するファイルの文字コードを指定する。
初期値(指定しない場合)は、OSの文字コードで出力される。


これで、appendarの設定は、完了。
このappendarを使用するかを指定するのが、
<root>~</root>
になる。
appender-refタグで、上記で設定したappendarのnameを指定する。
<appender-ref ref="File" />

ちなみに、<level value="debug" />で、ログの出力レベルを設定できる。


以上で、ファイルに出力する設定が完了。


結構長くなってしまったので、
<layout ~>~</layout>
については、また明日にでも書きます。


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
   <appender name="File" class="org.apache.log4j.FileAppender">
      <param name="File" value="C:/log4j.log" />
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p %c - %-5m [%t] (%F:%L)%n"/>
      </layout>
   </appender>
   <appender name="Console" class="org.apache.log4j.ConsoleAppender">
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p %c - %-5m [%t] (%F:%L)%n"/>
      </layout>
   </appender>
   <root>
      <level value="debug" />
      <appender-ref ref="Console" />
      <appender-ref ref="File" />
   </root>
</log4j:configuration>


2011年6月15日水曜日

JAVA Log4J 1.2.17 を使ってみた!

Javaでプログラムを作ってると、System.out.println()とか
System.out.print()を使って、ログのような出力をすることが
結構あると思う。
ちょっとしたツールならいいと思うが、
システムとして作成しているときは、
ちょっとよくないとおもったので、
Log4jを使ってみようと思い、調べてみた。

今回の環境は、
Java 1.6系
log4j log4j-1.2.17.jar

クラスパスにlog4j-1.2.17.jarを指定する。
ダウンロードは、こちら
設定ファイルは、クラスパスの通ったフォルダにlog4j.xmlで作成すると、
指定することなく自動的に読み込んでくれます。

まずは、設定ファイルを作成します。
ファイル名は、log4j.xml
.propertiesで作成することもできるようなので、それはまた後日

xmlの中身の解説も今回は省略します。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
   <appender name="File" class="org.apache.log4j.FileAppender">
      <param name="File" value="C:/log4j.log" />
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p %c - %-5m [%t] (%F:%L)%n"/>
      </layout>
   </appender>
   <appender name="Console" class="org.apache.log4j.ConsoleAppender">
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p %c - %-5m [%t] (%F:%L)%n"/>
      </layout>
   </appender>
   <root>
      <level value="debug" />
      <appender-ref ref="Console" />
      <appender-ref ref="File" />
   </root>
</log4j:configuration>


次に、Javaのクラスを作成します。
クラス名は、Test

package sample;

import org.apache.log4j.Logger;

public class Test {

    public static void main(String[] args) {

        Logger logger = Logger.getLogger(Test.class);

        logger.debug("デバッグだよ~");
        logger.info("インフォだよ。");
        logger.warn("ワーニング!");
        logger.error("エラーッ!!");
        logger.fatal("フェイタルッ!!!");
    }
}


試してみてください。


2011年6月14日火曜日

JAVA Stringをチェックするクラス2

先日の文字列をチェックするクラスの第2弾サンプルです。
正規表現の書き方を変更しました。
何が違うか、確認してみてください。
import java.util.regex.Pattern;

public class StringUtil2 {

 /**
  * alphabetがアルファベットの場合に、trueを返す。
  *
  * @param alphabet 文字列
  * @return boolean true : アルファベット / false : アルファベット以外
  */
 public static boolean isAlphabet(String alphabet) {
  try {
   return (Pattern.compile("^[a-zA-Z]*$")).matcher(alphabet).matches();
  } catch (Exception e) {
   return false;
  }
 }

 /**
  * characterが英数字の場合に、trueを返す。
  *
  * @param character 文字列
  * @return boolean true : 英数字 / false : 英数字以外
  */
 public static boolean isNumAlphabet(String character) {
  try {
   return (Pattern.compile("^[a-zA-Z0-9]*$")).matcher(character).matches();
  } catch (Exception e) {
   return false;
  }
 }

 /**
  * numが数字の場合に、trueを返す。
  *
  * @param num 文字列
  * @return boolean true : 数字 / false : 数字以外
  */
 public static boolean isNum(String num) {
  try {
   return (Pattern.compile("^[0-9]*$")).matcher(num).matches();
  } catch (Exception e) {
   return false;
  }
 }

 /**
  * markが半角記号の場合に、trueを返す。
  *
  * @param mark 文字列
  * @return boolean true : 半角記号 / false : 半角記号以外
  */
 public static boolean isMark(String mark) {
  try {
   return (Pattern.compile("^[ -/:-@\\[-\\`\\{-\\~]*$")).matcher(mark).matches();
  } catch (Exception e) {
   return false;
  }
 }

 /**
  * characterが半角の場合に、trueを返す。
  *
  * @param character 文字列
  * @return boolean true : 半角 / false : 半角以外
  */
 public static boolean isOneByteChar(String character) {
  try {
   return (Pattern.compile("^[a-zA-Z0-9 -/:-@\\[-\\`\\{-\\~]*$")).matcher(character).matches();
  } catch (Exception e) {
   return false;
  }
 }

 /**
  * kanaが半角カナの場合に、trueを返す。
  *
  * @param kana 文字列
  * @return boolean true : 半角カナ / false : 半角カナ以外
  */
 public static boolean isOneByteKana(String kana) {
  try {
   return (Pattern.compile("^[。-゚+]*$")).matcher(kana).matches();
  } catch (Exception e) {
   return false;
  }
 }

 /**
  * hiraganaがひらがなの場合に、trueを返す。
  *
  * @param hiragana 文字列
  * @return boolean true : ひらがな / false : ひらがな以外
  */
 public static boolean isHiragana(String hiragana) {
  try {
   return (Pattern.compile("^[ぁ-ゞ]*$")).matcher(hiragana).matches();
  } catch (Exception e) {
   return false;
  }
 }

 /**
  * katakanaがカタカナの場合に、trueを返す。
  *
  * @param katakana 文字列
  * @return boolean true : カタカナ文字 / false : カタカナ以外
  */
 public static boolean isKatakana(String katakana) {
  try {
   return (Pattern.compile("^[ァ-ヶ]*$")).matcher(katakana).matches();
  } catch (Exception e) {
   return false;
  }
 }

 /**
  * kanjiが漢字の場合に、trueを返す。
  *
  * @param kanji 文字列
  * @return boolean true : 漢字 / false : 漢字以外
  */
 public static boolean isKanji(String kanji) {
  try {
   return (Pattern.compile("^[一-龠]*$")).matcher(kanji).matches();
  } catch (Exception e) {
   return false;
  }
 }

 /**
  * zenkakuが全角の場合に、trueを返す。
  *
  * @param kanji 文字列
  * @return boolean true : 全角 / false : 全角以外
  */
 public static boolean isTwoByteChar(String zenkaku) {
  try {
   return (Pattern.compile("^[^ -~。-゚]*$")).matcher(zenkaku).matches();
  } catch (Exception e) {
   return false;
  }
 }
}

2011年6月13日月曜日

JAVA ListやMapや配列をStringへ変換(ログ表示用)

システム作っていると、Debug用のLogにListの内容や、Mapの内容を整形して出力したいときがでてくるんだよね。 そんなときに使えるよ。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class StringUtils {
 @SuppressWarnings("unchecked")
 public static void main(String[] args) {
  List l = new ArrayList();
  for (int i = 0; i < 100; i++) {
   l.add(Integer.toString(i));
  }
  System.out.println(StringUtils.object2String(l, ""));
  System.out.println("----------");
  Map m = new HashMap();
  for (int i = 0; i < 10; i++) {
   Map map = new HashMap();
   for (int j = 0; j < 10; j++) {
    map.put("key" + j, "val" + j);
   }
   l.add(map);
   m.put(i, map);
  }
  System.out.println(StringUtils.object2String(m, ""));
  System.out.println("----------");
  System.out.println(StringUtils.object2String(l, ""));
  System.out.println("----------");
  for (int i = 0; i < 2; i++) {
   List l2 = new ArrayList(l);
   l.add(l2);
  }

  Map map = new HashMap();
  for (int i = 0; i < 10; i++) {
   List l3 = new ArrayList();
   for (int j = 0; j < 10; j++) {
    l3.add(""+ i + "" + j);
   }
   map.put("key" + i, l3);
  }
  l.add(map);
  System.out.println(StringUtils.object2String(l, ""));
  System.out.println("----------");
  l.add(new String[]{"arr1", "arr2", "arr3", "arr4", "arr5", "arr6", "arr7", "arr8", "arr9", "arr0"});
  System.out.println(StringUtils.object2String(l, ""));
 }
 
 
 
 
 public static final String LINE_SEPARATOR = System.getProperty("line.separator");
 public static final String INDENT = "  ";
 public static final String BLANK = " ";
 public static final String COLON = ":";
 public static final String LEFT_CURLY_BRACKET = "{";
 public static final String RIGHT_CURLY_BRACKET = "}";
 public static final String LEFT_SQUARE_BRACKET = "{";
 public static final String RIGHT_SQUARE_BRACKET = "}";
 
 @SuppressWarnings("unchecked")
 public static String object2String(Object obj, String indent) {
  StringBuilder sb = new StringBuilder();
  sb.append(obj.getClass().getCanonicalName());
  sb.append(StringUtils.BLANK);
  sb.append(StringUtils.LEFT_CURLY_BRACKET);
  sb.append(StringUtils.LINE_SEPARATOR);
  if (Iterable.class.isAssignableFrom(obj.getClass())) {
   sb.append(StringUtils.iterator2String((Iterable) obj, indent + StringUtils.INDENT));
  } else if (Map.class.isAssignableFrom(obj.getClass())) {
   sb.append(StringUtils.map2String((Map) obj, indent + StringUtils.INDENT));
  } else if (obj instanceof Object[]) {
   sb.append(StringUtils.array2String((Object[]) obj, indent + StringUtils.INDENT));
  } else {
   sb.append(obj);
  }
  sb.append(indent);
  sb.append(StringUtils.RIGHT_CURLY_BRACKET);
  sb.append(StringUtils.LINE_SEPARATOR);
  return sb.toString();
 }

 @SuppressWarnings("unchecked")
 public static String iterator2String(Iterable it, String indent) {
  StringBuilder sb = new StringBuilder();
  int index = 0;
  for (Object obj : it) {
   sb.append(indent);
   sb.append(StringUtils.LEFT_SQUARE_BRACKET);
   sb.append(StringUtils.BLANK);
   sb.append(index);
   sb.append(StringUtils.BLANK);
   sb.append(StringUtils.RIGHT_SQUARE_BRACKET);
   sb.append(StringUtils.BLANK);
   sb.append(StringUtils.COLON);
   sb.append(StringUtils.BLANK);
   if (Iterable.class.isAssignableFrom(obj.getClass())) {
    sb.append(obj.getClass().getCanonicalName());
    sb.append(StringUtils.BLANK);
    sb.append(StringUtils.LEFT_CURLY_BRACKET);
    sb.append(StringUtils.LINE_SEPARATOR);
    sb.append(StringUtils.iterator2String((Iterable) obj, indent + StringUtils.INDENT));
    sb.append(indent);
    sb.append(StringUtils.RIGHT_CURLY_BRACKET);
   } else if (Map.class.isAssignableFrom(obj.getClass())) {
    sb.append(obj.getClass().getCanonicalName());
    sb.append(StringUtils.BLANK);
    sb.append(StringUtils.LEFT_CURLY_BRACKET);
    sb.append(StringUtils.LINE_SEPARATOR);
    sb.append(StringUtils.map2String((Map) obj, indent + StringUtils.INDENT));
    sb.append(indent);
    sb.append(StringUtils.RIGHT_CURLY_BRACKET);
   } else if (obj instanceof Object[]) {
    sb.append(obj.getClass().getCanonicalName());
    sb.append(StringUtils.BLANK);
    sb.append(StringUtils.LEFT_CURLY_BRACKET);
    sb.append(StringUtils.LINE_SEPARATOR);
    sb.append(StringUtils.array2String((Object[]) obj, indent + StringUtils.INDENT));
    sb.append(indent);
    sb.append(StringUtils.RIGHT_CURLY_BRACKET);
   } else {
    sb.append(obj);
   }
   index++;
   sb.append(StringUtils.LINE_SEPARATOR);
  }
  return sb.toString();
 }

 @SuppressWarnings("unchecked")
 public static String map2String(Map map, String indent) {
  StringBuilder sb = new StringBuilder();
  for (Object obj : map.entrySet()) {
   Entry e = (Entry) obj;
   Object val = e.getValue();
   sb.append(indent);
   sb.append(e.getKey());
   sb.append(StringUtils.BLANK);
   sb.append(StringUtils.COLON);
   sb.append(StringUtils.BLANK);
   if (Iterable.class.isAssignableFrom(val.getClass())) {
    sb.append(val.getClass().getCanonicalName());
    sb.append(StringUtils.BLANK);
    sb.append(StringUtils.LEFT_CURLY_BRACKET);
    sb.append(StringUtils.LINE_SEPARATOR);
    sb.append(StringUtils.iterator2String((Iterable) val, indent + StringUtils.INDENT));
    sb.append(indent);
    sb.append(StringUtils.RIGHT_CURLY_BRACKET);
   } else if (Map.class.isAssignableFrom(val.getClass())) {
    sb.append(val.getClass().getCanonicalName());
    sb.append(StringUtils.BLANK);
    sb.append(StringUtils.LEFT_CURLY_BRACKET);
    sb.append(StringUtils.LINE_SEPARATOR);
    sb.append(map2String((Map) val, indent + StringUtils.INDENT));
    sb.append(indent);
    sb.append(StringUtils.RIGHT_CURLY_BRACKET);
   } else if (obj instanceof Object[]) {
    sb.append(obj.getClass().getCanonicalName());
    sb.append(StringUtils.BLANK);
    sb.append(StringUtils.LEFT_CURLY_BRACKET);
    sb.append(StringUtils.LINE_SEPARATOR);
    sb.append(StringUtils.array2String((Object[]) obj, indent + StringUtils.INDENT));
    sb.append(indent);
    sb.append(StringUtils.RIGHT_CURLY_BRACKET);
   } else {
    sb.append(val);
   }
   sb.append(StringUtils.LINE_SEPARATOR);
  }
  return sb.toString();
 }
 
 @SuppressWarnings("unchecked")
 public static String array2String(Object[] arr, String indent) {
  StringBuilder sb = new StringBuilder();
  int index = 0;
  for (Object obj : arr) {
   sb.append(indent);
   sb.append(StringUtils.LEFT_SQUARE_BRACKET);
   sb.append(StringUtils.BLANK);
   sb.append(index);
   sb.append(StringUtils.BLANK);
   sb.append(StringUtils.RIGHT_SQUARE_BRACKET);
   sb.append(StringUtils.BLANK);
   sb.append(StringUtils.COLON);
   sb.append(StringUtils.BLANK);
   if (Iterable.class.isAssignableFrom(obj.getClass())) {
    sb.append(obj.getClass().getCanonicalName());
    sb.append(StringUtils.BLANK);
    sb.append(StringUtils.LEFT_CURLY_BRACKET);
    sb.append(StringUtils.LINE_SEPARATOR);
    sb.append(StringUtils.iterator2String((Iterable) obj, indent + StringUtils.INDENT));
    sb.append(indent);
    sb.append(StringUtils.RIGHT_CURLY_BRACKET);
   } else if (Map.class.isAssignableFrom(obj.getClass())) {
    sb.append(obj.getClass().getCanonicalName());
    sb.append(StringUtils.BLANK);
    sb.append(StringUtils.LEFT_CURLY_BRACKET);
    sb.append(StringUtils.LINE_SEPARATOR);
    sb.append(StringUtils.map2String((Map) obj, indent + StringUtils.INDENT));
    sb.append(indent);
    sb.append(StringUtils.RIGHT_CURLY_BRACKET);
   } else if (obj instanceof Object[]) {
    sb.append(obj.getClass().getCanonicalName());
    sb.append(StringUtils.BLANK);
    sb.append(StringUtils.LEFT_CURLY_BRACKET);
    sb.append(StringUtils.LINE_SEPARATOR);
    sb.append(StringUtils.array2String((Object[]) obj, indent + StringUtils.INDENT));
    sb.append(indent);
    sb.append(StringUtils.RIGHT_CURLY_BRACKET);
   } else {
    sb.append(obj);
   }
   index++;
   sb.append(StringUtils.LINE_SEPARATOR);
  }
  return sb.toString();
 }
}

2011年6月12日日曜日

Excel 指定したシートの指定行から最終入力行までクリア

Public Sub clear(sheetName As String, rowNum As Integer)
    Application.ScreenUpdating = False
    ThisWorkbook.Sheets(sheetName).Activate
   
    With ActiveSheet
        If .AutoFilterMode Then
            Selection.End(xlToRight).Select
            HeaderLastCol = Selection.Column
            .Range(.Cells(rowNum, 1), .Cells(rowNum, HeaderLastCol)).Select
            Selection.AutoFilter
        End If
    End With
   
    If ActiveCell.SpecialCells(xlLastCell).Row < rowNum Then
        Exit Sub
    End If
   
    ActiveSheet.Rows("1:" & ActiveCell.SpecialCells(xlLastCell).Row).Delete Shift:=xlUp
    Application.ScreenUpdating = True

End Sub

2011年6月11日土曜日

JAVA Stringをチェックするクラス

文字列をチェックするクラスのサンプルです。
これ以外にも必要なメソッドはたくさんあるけど、まずはこれくらい。
また、これと同じ処理を別の書き方もできるよ。
次回は、別の書き方で作成します。
import java.util.regex.Pattern;

public class StringUtil {
 /**
  * strがnullか""(空文字)の場合に、trueを返す。
  *
  * @param str 入力値
  * @return boolean true : 入力無し / false : 入力有り
  */
 public static boolean isEmpty(String str) {
  if (str == null || "".equals(str)) {
   return true;
  }
  return false;
 }

 /**
  * alphabetがアルファベットの場合に、trueを返す。
  *
  * @param alphabet アルファベットの文字列
  * @return boolean true : アルファベット / false : アルファベット以外
  */
 public static boolean isAlphabet(String alphabet) {
  try {
   return !(Pattern.compile("[^a-zA-Z]")).matcher(alphabet).matches();
  } catch (Exception e) {
   return false;
  }
 }

 /**
  * characterが英数字の場合に、trueを返す。
  *
  * @param character 英数字の文字列
  * @return boolean true : 英数字 / false : 英数字以外
  */
 public static boolean isNumAlphabet(String character) {
  try {
   return !(Pattern.compile("[^a-zA-Z0-9]")).matcher(character).matches();
  } catch (Exception e) {
   return false;
  }
 }

 /**
  * str1がstr2より大きい場合に、trueを返す。
  *
  * @param str1 英数字の文字列1
  * @param str2 英数字の文字列2
  * @return boolean true : 文字列1が大きい / false : 文字列1が大きくない
  */
 public static boolean charGreaterThan(String str1, String str2) {
  try {
   return str1.compareTo(str2) > 0;
  } catch (Exception e) {
   return false;
  }
 }

 /**
  * str1がstr2より小さい場合に、trueを返す。
  *
  * @param str1 英数字の文字列1
  * @param str2 英数字の文字列2
  * @return boolean true : 文字列1が小さい / false : 文字列1が小さくない
  */
 public static boolean charSmallerThan(String str1, String str2) {
  try {
   return str1.compareTo(str2) < 0;
  } catch (Exception e) {
   return false;
  }
 }

 /**
  * str1がstr2以上の場合に、trueを返す。
  *
  * @param str1 英数字の文字列1
  * @param str2 英数字の文字列2
  * @return boolean true : 文字列1が以上 / false : 文字列1が以上ではない
  */
 public static boolean charGreaterThanEqual(String str1, String str2) {
  try {
   return !StringUtil.charSmallerThan(str1, str2);
  } catch (Exception e) {
   return false;
  }
 }

 /**
  * str1がstr2以下の場合に、trueを返す。
  *
  * @param str1 英数字の文字列1
  * @param str2 英数字の文字列2
  * @return boolean true : 文字列1が以下 / false : 文字列1が以下ではない
  */
 public static boolean charSmallerThanEqual(String str1, String str2) {
  try {
   return !StringUtil.charGreaterThan(str1, str2);
  } catch (Exception e) {
   return false;
  }
 }

 /**
  * zenkakuが全角文字の場合に、trueを返す。
  *
  * @param zenkaku 全角の文字列
  * @return boolean true : 全角 / false : 全角以外
  */
 public static boolean isZenkaku(String zenkaku) {
  try {
   return !(Pattern.compile("[ -~]")).matcher(zenkaku).matches();
  } catch (Exception e) {
   return false;
  }
 }

 /**
  * strがstrArrayに存在している場合に、indexを返す。
  *
  * @param str 文字列
  * @return int  0,1,2...n : strArrayに存在する / -1 : strArrayに存在しない
  */
 public static int exist(String str, String[] strArray) {
  int count = 0;
  if (strArray == null) {
   return -1;
  }
  count = strArray.length;
  for (int i = 0; i < count; i++) {
   if (str.startsWith(strArray[i])) {
    return i;
   }
  }
  return -1;
 }
}

2011年6月10日金曜日

Excel VBA ブックを開く際のエラー2

昨日は、存在しないファイルを指定した際のエラーを回避する方法について
書きましたが、今日は同一のファイル名を開く際のエラーを回避する方法について
調べました。

機能と同じように、FileSystemObjectを使って、ファイルパスからファイル名を
取得します。
取得したファイル名と同じファイルがWorkbooksに存在していないか確認する。
存在している場合は、終了する。
存在していない場合は、指定したファイルを開く。

試してみてください。

Dim fso As Object
Dim path As String
Dim filename As String

Set fso = CreateObject("Scripting.FileSystemObject")
path = "C:\参考資料.xls"
filename = fso.GetFileName(path)

For Each wb In Workbooks
    If wb.Name = filename Then
        MsgBox filename & "と同じファイル名のブックが開いています。"
        Exit Sub
    End If
Next wb

Set wb = Workbooks.Open(filename:=path, ReadOnly:=True)

2011年6月9日木曜日

Excel VBA ブックを開く際のエラー

ブックを開く、閉じるを知ったので色々使っていると、
エラーが発生することがあった。
理由を調べてみると、そもそも開こうとしているブックが
指定したパスに存在していなかったからだ。
存在チェックをしてから開いたほうがいいと思い、
チェックの方法について調べてみた。

チェックする方法は、いくつかあるみたいだけど、
今回は、FileSystemObjectで存在チェックをする。

Dim wb As Workbook
Dim fso As Object
Dim path As String

Set fso = CreateObject("Scripting.FileSystemObject")
path = "C:\参考資料.xls"

If fso.FileExists(path) Then
    Set wb = Workbooks.Open(Filename:=path, ReadOnly:=True)
    MsgBox "開いた"
    wb.Close
Else
    MsgBox path & "が存在しませんでした。"
End If


fso.FileExists(path) の部分がファイルの存在チェックをしている処理です。
簡単でした。


2011年6月8日水曜日

JAVA 固定長ファイル改行コード挿入処理

固定長のファイルに改行コードを挿入するクラスです。
使用方法
第一引数fiは、入力ファイル
第二引数foは、出力ファイル
第三引数bCntは、改行を挿入する位置

public static void main(String[] args) {
}
を実装して使ってみてください。


import java.util.regex.Pattern;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
public class InsertReturnCode {
 public boolean insertReturnCode(File fi, File fo, int bCnt){
  BufferedInputStream bi = null;
  BufferedOutputStream bo = null;
  String line = null;
  if (fi == null || fo == null ) {
   System.out.println("パラメータに誤りがあります。");
   return false;
  } else if (fi.isDirectory() || fo.isDirectory()) {
   System.out.println("ファイルではありません。");
   return false;
//  } else if (!fi.canRead() || !fo.canWrite()) {
//   System.out.println("読み込みまたは、書き込みが出来ません。");
//   return false;
  } else if (!fi.exists()) {
   System.out.println("入力ファイルが存在しません。");
   return false;
//  } else if (fo.exists()) {
//   System.out.println("出力ファイルと同名のファイルが存在します。");
//   return false;
  } else if (fi.getPath().equals(fo.getPath())) {
   System.out.println("入力ファイルと出力ファイルが同一のパスです。");
   return false;
  }
  try {
   byte[] b = new byte[bCnt];
   int i = 0;
   bi = new BufferedInputStream(new FileInputStream(fi));
   bo = new BufferedOutputStream(new FileOutputStream(fo));
   while (bi.read(b, 0, bCnt) > -1) {
    bo.write(b, 0 ,bCnt);
    bo.write(new byte[]{0,10});
    i++;
   }
   bi.close();
   bo.close();
  } catch (FileNotFoundException e) {
   System.out.println("ファイルが見つかりません。");
   return false;
  } catch (UnsupportedEncodingException e) {
   System.out.println("文字コードがサポートされていません。");
   return false;
  } catch (IOException e) {
   System.out.println("入出力でエラーが発生しました。");
   return false;
  }
  return true;
 }
}

2011年6月7日火曜日

Excel VBA ブックを閉じる方法3

昨日の続きで、ブックの閉じる方法についてです。
引数がいくつかあるようなので、調べてみました。


SaveChanges
閉じるブックに変更がなければ、この引数は無視されます。
ブックに変更があり、開いている他のウィンドウ(別アプリケーション)
にブックが表示されている場合、この引数は無視されます。
ブックに変更があり、マクロを実行しているウィンドウにブックが表示されている場合、
この引数は、次のとおり、保存するかどうかを指定します。
Trueの場合、ブックの変更が保存されます。
ブックに関連付けられたファイル名がない場合、FileName が使用されます。
FileName を省略すると、ファイル名を入力するよう求められます。
False の場合、ブックの変更は保存されません。
省略した場合、変更を保存するかどうかを確認するダイアログ ボックスが表示されます。


Filename
このファイル名で変更を保存します。


RouteWorkbook
ブックを次の受信者にルーティングする必要がない場合 (回覧先がない場合、
または既にルーティングされている場合)、この引数は無視されます。
それ以外の場合は、次のリストのとおり、Microsoft Office Excel がブックをルーティングします。
True の場合、ブックを次のブックに移動(アクティブ化)します。
False の場合、ブックを移動しません(アクティブ化されているブックのままにします)。
省略した場合、ブックを送信するかどうかを確認するダイアログ ボックスが表示されます。

2011年6月6日月曜日

Excel VBA ブックを閉じる方法2

昨日はファイル(ブック)を閉じる方法について調べたが、
保存確認ダイアログが表示されて閉じれない場合があったので、
ダイアログを表示しないで閉じる方法を調べた。

Workbooks.Close(False)

で閉じるらしい。



Dim wb As Workbook
Set wb = Workbooks.Open Filename:="C:\参考資料.xls", ReadOnly:=True
MsgBox "開いた"
'編集処理
wb.Sheets(1).Cells(1, 1).Value = "test"
wb.Close(False)


ダイアログを表示せずに閉じることに成功!!!

他の引数もあるみたいなので、それはまた明日ってことで。

2011年6月5日日曜日

Excel VBA ブックを閉じる方法

昨日まではファイル(ブック)を開く方法について調べたので、
開いたままだと邪魔になるので、閉じる方法について調べた。

Workbooks.Open Filename:="C:\参考資料.xls", ReadOnly:=True

上記でブックを開いたが…、どうやって閉じるの?

Workbooks.Close

を使ったところ、えらーになってしまった…。

おいおい…、一体どうやって…。と四苦八苦しながら調べてみたところ


Dim wb As Workbook
Set wb = Workbooks.Open Filename:="C:\参考資料.xls", ReadOnly:=True
MsgBox "開いた"
wb.Close


で開いて閉じることに成功!!!