読者です 読者をやめる 読者になる 読者になる

自作アプリ2つめ 勤務表入力アプリ(挫折)

自作アプリケーション2作目は、
エクセルに勤務時間を記載するアプリケーションを途中まで作って挫折しました。

Tomcatが動かなくなりました。
Tomcatダウンロードしなおしても、エクリプスダウンロードしなおしても、新しいワークスペースで作ってもどうしても動かないので一時休止しました。。

構想:2時間
実装:3時間
環境構築にはまる:5時間以上
です。


実装できたところ:

  • GUIから働いた時間と日にちを選択
  • 日にちに対応するExcelのローを取得

  • Excelに必要事項を書き込む


ちょっと工夫したところ:

  • 日にちを毎回選択するのは面倒だと思うので、GUIを開いた日にちを自動的に選択するようにした。
  • ファイルのパスや名前が変わることが予想されるので、外部のファイルから読み込むようにした。

f:id:isotai:20170321232403p:plain
うごけー!


以下、抜粋して紹介します。

HTML:

<form action="/Kinmu/Main" method="get">
日にち:
<select id="day" name="day">
<option value="1">1</option>
<option value="2">2</option>

始業:
<select name="start">
<option value="09:00" selected>09:00</option>
<option value="09:15">09:15</option>
//以下略

昼休み開始:
<select name="lunchstart">
<option value="12:00" selected>12:00</option>
<option value="12:30">12:30</option>
//以下略


昼休み終了:
<select name="lunchend">
<option value="13:00" selected>13:00</option>
<option value="13:30">13:30</option>
//以下略

終業:
<select name="finish">
<option value="18:00" selected>18:00</option>
<option value="18:30">18:30</option>

//以下略

</form>

選択要素はformのselectで統一しています。日にちは

<input type="time">

でカレンダーから選ぶこともできたのですが、
取得できる値が年号から(2017xxxxx)で、今回は使いずらかったのでやめました。



ページを開いた時に、今日の日にちを選択状態にするところ。

JavaScriptで日にち取得して、該当の日にちの

<option value="1">1</option>

にselected を追加して

<option value="1" selected>1</option>

にします。

<script>
windows.onload = setDay;
function setDay(){
	var date = new Date();
	var day = date.getDate();
    document.getElementById('day').options[day-1].selected = true;
}
</script>

<body onLoad="setDay()" >


Main.java

                //エクセルファイルの名前とパスを取得します。
		GetFIlePath getfilepass = new GetFIlePath();
		 String worktablepass = getfilepass.getWorkTablePass();
		 System.out.println(worktablepass);

               // GUIから入力された日にちに対応した、エクセルのRawを取得
                 GetRawAndCell getrawandcell  = new GetRawAndCell();
		int wtRaw = getrawandcell.getWtRaw(Integer.parseInt(day));

ざっくりと省きましたが、Main.javaサーブレットです。
GUIから入力された値を受け取っていい感じに調整します。
GetFIlePathとGetRawAndCellメソッドだけ紹介します。


GetFIlePath.java

public class GetFIlePath {

	public String getWorkTablePass(){

		String worktablepass = null;

		try {

		BufferedReader br = new BufferedReader(new InputStreamReader
               (new FileInputStream("/Users/Documents/workspace/kinmu/filepass.txt"),"UTF-8"));

		worktablepass = br.readLine();
        br.close();

		}catch(IOException e){
			System.out.println(e);
		}
		return worktablepass;

	}
}

filepass.txtの一行目に記載してあるエクセルファイルのパスと名前を取得して返します。
ファイル名が変更になったらfilepass.txtを編集します。

文字コードを指定して読み込むには、FileInputStreamを使用する必要があるようで、
ファイル読み込むだけでFileInputStream,InputStreamReader,BufferedReader、メソッド3つも登場しています。



GetRawAndCell.java

public class GetRawAndCell {

	public int getWtRaw(int day){

		int wtRaw = 0;

		switch (day) {
		case 1:
			wtRaw = 13;
			break;
		case 2:
			wtRaw = 14;

               //以下略

GUIから入力された日にちに対応した、エクセルのRawを取得します。
1から31までの数字に対応する、エクセルのRAWを取得できるようにする必要があります。
最初はif分で書こうと思っていたのですが、こういうときはswitch文の方がわかりやすいですね!発見です。


その後GUIから入力された勤務時間などを、実際にエクセルファイルに書き込んで終わりです。

isotai.hatenablog.com


いろいろと他にもやりたいことがあったはあったのですが、
今はTomcatに立ち向かう気力がないので撤退です!

自作アプリ1つめ 掲示板みたいなやつ

初めて作ったアプリケーションもどきを晒します。

もともとは簡易な社内SNS的なものを想像してたのですが、
雑なチャットぽいものが出来上がりました。

作り始めたころのレベルは、Javaの講座に週末3ヶ月くらい通ったあとです。
入門書に書いてある意味がなんとなくわかるかなーくらいのレベル感です。

CSS,JSP,データベース随所で躓きながらなんとか動く感じにはなりましたが、
なんとも雑な仕上がりになっています。

もう手はつけてないのですが、
このまま葬られるのが(個人的に)もったいないので、記録に残しておきます。
主要なページは3,4枚なので、ページごとに紹介していきたいと思います。

[index.jsp]

f:id:isotai:20170305181912p:plain

最初に表示されるページです。
ここからログインするか、ユーザー登録ページに遷移できます。

ユーザー登録ページは、後ほど説明するとして、
まずはフロントサイドでやったことから紹介します。

まず、このページはBootStrapとか使って整えようと頑張りました。

CSSよくわからなかったので、途中で手を止めて以下の本でお勉強。
クリックアンドドロップで作れるWebサイトとかに慣れていると、
CSSってかなり不便に感じるかも? フォームの表示場所変えるだけなのに
マージンとかフロートの範囲とか気にするのが煩わしい!と思いつつ
今風なログインページを”目指して”作っています。

f:id:isotai:20170306224355p:plain

ロゴだけはいい感じではないでしょうか。
すべてこのサービスのおかけです。
logo.squarespace.com


入力ホームはBootStrapのテンプレートをお借りしました。
以下のサイトは、ログインフォームのテンプレートが充実していていい感じです。
bootsnipp.com

ログインフォームは基本テンプレートのコピペです。
背景を透明にしたかったので、form のstyle = background-color:rgba(0,0,0,0.0);のところだけいじっています。

<div class = "container">
<div class="wrapper" >
<form method = "get" action="/ooo/LoginUser" class="form-signin" style = background-color:rgba(0,0,0,0.0);>
<h3 class="form-signin-heading" style = color:white;>welcome! please sigh in</h3>
<hr class="colorgraph"></br>
<input type = "text" name = "email" class="form-control" placeholder="Username"></br>
<input type = "password" name="pass" class="form-control"placeholder="Password"></br>
<input type = "submit" value = "ログイン"  class="btn btn-lg btn-primary btn-block"></br>
</hr>
</form>
 </div>
</div>

画像の上に黒透明色をかぶせて、それっぽくしています。

photofronto{
     width:100%;
    height:100%;
    background-size: cover;
    margin:0 auto;
    position:relative;
    background-color:rgba(0,0,0,0.5);
}

背景画像がおかしくならないおまじない。

body{   
  background-position: center center;
  background-repeat: no-repeat;
  background-attachment: fixed;
  background-size: cover;
}

ログインフォームから送付入力されたユーザー名とパスワードが正しいかサーバーサイドで検証し、
正しい場合、ユーザーページに遷移するようにします。
よくよく見返してみると、ユーザーとパスワードの判定もなんだか怪しいのですが、
ログイン情報に間違いがあると、NULLで処理がとまって結果的にログインできなくなります!(´Д` )
ユーザー名とパスワードを指定してselectして結果が得られなかったらログイン失敗になります。


ユーザー登録処理のサーブレット

@WebServlet("/LoginUser")
public class LoginUser extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public LoginUser() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
		
		//フォームから送付されたデータの受け取り文字コードの指定をしない文字化けする。
		request.setCharacterEncoding("UTF-8");
		String email = request.getParameter("email");
		String pass = request.getParameter("pass");		
		
		//取得したデータを値を保持するだけのクラスに渡す。
		LoginUserModel loginusermodel =  new LoginUserModel(email,pass);
		
		//フォームから入力されたユーザーネームとパスワードでDB検索。 結果をaccount変数に入れて返す。
		//DB検索後に、フォームからの入力値と検索結果が一致するか確認。今考えると入力値の検査はこのDAOでやってはいけなかった。
		//accountにはユーザー名、パスワード、ユーザーID入る。
		LoginUserDAO loginuserdao = new LoginUserDAO();
	    Account account = loginuserdao.login(loginusermodel);
	    
	    //なぜかユーザー名にたいしてヌルチェックをしている。
	    if(account.getUserName().equals("")){
	    	RequestDispatcher dispatch = request.getRequestDispatcher("/registerfalse.jsp");
			 dispatch.forward(request, response);
	   }else{
		   
		   //すべてのユーザーのユーザー名とユーザーIDを取得する。
		   //この情報はチャットで宛先を選ぶときに選択するユーザー表示に使用する。
		   GetAllUserDAO getalluserdao = new GetAllUserDAO();
		   ArrayList<Map<Integer,String>> userlist = getalluserdao.getAllUserNameandID();
			
		   //HttpSessionインタフェースのオブジェクトを取得
		    HttpSession session = request.getSession();
		    //useridデータをsessionスコープで保存
		    session.setAttribute("username",account.getUserName() );
		    session.setAttribute("userid",account.getUserId() );
		    session.setAttribute("userlist",userlist);
		   
		   RequestDispatcher dispatch = request.getRequestDispatcher("/UserPage.jsp");
			  dispatch.forward(request, response);
	   }
	}
}


データベースにログインフォームから送付されたユーザー名とパスワードを持ったユーザーがいるか検索。

public class LoginUserDAO {
	public Account login(LoginUserModel loginusermodel){
		
		 Connection conn = null;
			Account account = null;		
			String sql = "select * from users where email = ? and pass = ?";
		
		 try {	
			 Class.forName("org.postgresql.Driver");
		
	   conn =
	    DriverManager.getConnection("jdbc:postgresql:postgres",	
	                                "postgres",					
	                                "3450");						

			    	 }catch (Exception e){
			    		 System.out.println("接続失敗。");
			    		 e.printStackTrace();			    		 
			    	 }			    
			   	 try { 
   
			   	PreparedStatement ps = conn.prepareStatement(sql);				   		
			       ps.setString(1,loginusermodel.getEmail());
			       ps.setString(2,loginusermodel.getPass());
			       
			       ResultSet result = ps.executeQuery();
			

			      if(result.next()){
			    	  String useremail = result.getString("email"); 
			    	  String userpass = result.getString("pass"); 
			    	  String username = result.getString("name"); 
			    	  String userid= result.getString("userid"); 
			    	  
			    	  account = new Account(useremail,userpass,username,userid);
			      }
			       	    
			       
			   	 }catch (SQLException i){
		    		 System.out.println("select failed。");
		    		 i.printStackTrace();
		    		 
		    		 return null;
			   	 }finally{
		    		 
			    	  
			        if(conn !=null){
			        	try{
			        		conn.close();
			        	}catch (SQLException i){
				    		 System.out.println("closefailed");
				    		 i.printStackTrace();
				    		 return null;
			        	}		        	
			        }
	}	
			   	return account;	
			          	
		 } 

register.jsp

f:id:isotai:20170305224824p:plain

ユーザー登録画面です。
登録画面はこだわらなくていいだろ!という思いがつまっています。

受けっとったあと、一応ヌルチェックをしています。えらい!
あとここはJavaScriptフロントサイドでもヌルチェックをしています。

詳しくはここで。
メールアドレスの入力チェック(JavaScript) - isotaiの日記

request.setCharacterEncoding("UTF-8");
		String email = request.getParameter("email");
		String pass = request.getParameter("pass");		
		String name = request.getParameter("name");	
		
		if((email.equals("")) || (pass.equals("")) || (name.equals(""))){
			RequestDispatcher dispatch = request.getRequestDispatcher("/registerfalse.jsp");
			 dispatch.forward(request, response);


登録フォームから受け取った値でデータベースにユーザーを登録します。
パスワードの暗号化とかは実用するわけではないので気にしていないです。(気にする余裕がなかった)

メッセージ交換にユーザー固有のIDが欲しかったので、
randomUUIDという関数を使用してID生成後、一緒に登録します。

String sql = "insert into users(email,pass,name,userid) values(?,?,?,?)";
		   		PreparedStatement ps = conn.prepareStatement(sql);	
		    
		   		//useridの作成
		   		String uuid = UUID.randomUUID().toString();  
		   		
		       ps.setString(1,registerusermodel.getEmail());
		       ps.setString(2,registerusermodel.getPass());
		       ps.setString(3,registerusermodel.getName());
		       ps.setString(4,uuid);


あとはデータベースに書き込んで終了です。

UserPage.jsp

f:id:isotai:20170306220308p:plain

ようやくメインページです。
FacaBookをイメージして作りました;;

テキストエリアにメッセージを書きます。
do not show in filed:にチェックを入れると個人宛メッセージになり、フィードに表示されません。
個人メッセージ確認画面でのみ表示されます。プルダウンタブから宛先のユーザーを選択します。
この表示でログイン処理の際に取得したユーザー一覧情報を使用しています。
投稿フォームとフィードメッセージの表示CSSはBootStrapのテンプレートから拝借しています。

フォームから説明します。

<input type="text" name = "message" class="span4"  rows="10" size="30" placeholder="Type your post,change line = <br>" ></div>
   do not show in filed:<input type="checkbox" name = 'postconfirm' value = "no"></br>
<input type="hidden" name="useridfrom" value="<%=session.getAttribute("userid")%>">
<select name="useridto">
   <%for(int i = 0; i<userlist.size(); i++){%>
   <%Map<Integer,String> list = userlist.get(i);%>
   <%String name =  list.get(1);%>
   <%String id =  list.get(2);%>
   <option value=<%=id%>><%=name%></option>
   <%}%>
</select>
<br/>
<h6 class="pull-right" id="cLeft"></h6>
<div class = "text-right">
<input type="submit" value = "submit" class="btn btn-info" onClick="return formNullCheck()">

プルダウンタブにユーザー一覧を表示するところでちょっと悩みましたが、
JSPを使い、事前にArrayList型のuserlist変数にユーザーの名前とIDを入れて、
for文の中でユーザー情報を一つ一つ取り出し、
の部分で指定しています。

ログイン時にセッションに入れた情報を取りでしているところ。<%ArrayList> userlist = (ArrayList>)session.getAttribute("userlist");%>


メッセージは以下のように保存されます。
メッセージの送信者、宛先のユーザーのIDとフィード投稿可否が保存されます。

f:id:isotai:20170306220111p:plain


次にフィードのメッセージ表示部分です。

<!>投稿されたメッセージの表示</!>
<div class = "center">
<%GetMessageDAO getmessagedao = new GetMessageDAO();%>
<%ArrayList<Map<Integer,String>> messagelist = getmessagedao.getMessage();%>
<%for(int i = 0; i<messagelist.size(); i++){%>
	<%Map<Integer,String> list = messagelist.get(i);%>
	<%	String message =  list.get(1);%>
	<%	String time =  list.get(5);%>
	<%	String namefrom =  list.get(6);%>
	<%	String nameto =  list.get(7);%>
<div class="activity-feed">
<div class="feed-item">
<div class="date">To:<%=nameto%></div>
<div class="text"><%=message%></div>
<div class="date">From:<%=namefrom%> (<%=time%>)</div>
</div>
</div>
<%}%>

JSPから直接DAOを呼び出しています!MVC的にはやっちゃだめとどこかで読んだ気がしますが、
これ作ってるときはそれどころではなかった!
これで一応、メッセージ投稿→ページ更新→最新の30のメッセージ表示。
といった動きで最新の投稿が常に表示されます!

ここでちょっとめんどくさいことが発覚しまして、
メッセージテーブルにはユーザーIDしか保存してないんですね。
でもやっぱりメッセージを表示するときは、To ユーザーの名前 From ユーザーの名前
で表示したいなーとなります、あたりまえですが。

ユーザーの名前を保持してるのは、userテーブルというのが別にあるんです。
これはユーザー登録のときに情報を書き込んでます。

f:id:isotai:20170306221214p:plain

さぁどうしたものかと。
幸い複数テーブルを一度にselectできるInner Join というのがあるようです。
ということで四苦八苦しながらクエリを作りました。これで無事メッセージは表示できています。

select message,useridfrom,useridto,postconfirm,time,t1.name as usernamefrom,t2.name as usernameto from usermessages ii inner join users t2 on ii.useridto = t2.userid inner join users t1 on ii.useridfrom = t1.userid where postconfirm = 'yes' order by time desc limit 30;


だいたいこんな感じです。
このあと、個人メッセージ受信用のページ、メッセージを受信したらメール通知する機能とかを作りまして、
初アプリケーションは日の目を見ることなく葬られました。

メールアドレスの入力チェック(JavaScript)

JavaScript

フォームにメールアドレスを入力後、submitしたときに、
メールアドレスの形でない場合、ユーザーに通知してsubmitを止めるやつ。

フォームの値を取り出す

elements.[フォームにつけたname or 参照番号]
htmlからJavaScriptを呼ぶ際に、引数でthisを渡しているので、
frm.elements.[フォームにつけたname or 参照番号]で値取得ができる。

HTML側
onSubmit="return registerFormCheck(this)">

JavaScript
function registerFormCheck(frm)

単純に呼び出す場合は、
document.forms.フォームの名前.elements

正規表現

ここは正直コピペです。。今度調べる。

var Seiki=/[!#-9A-~]+@+[a-z0-9]+.+[^.]$/i;


HTML:

<body>
	<h1>登録</h1>
	<form action="/ooo/RegisterUser" method="get"
		onSubmit="return registerFormCheck(this)">
		mail:<input type="text" name='email'><br> pass:
		<input type="password" name='pass'><br> name:
		<input type="text" name='name'><br>
		<input type="submit" value="登録"><br>
	</form>
</body>
</html>


JavaScript:

function registerFormCheck(frm){
	var hissu = Array("email","pass","name");
	var len = hissu.length;
	var Seiki=/[!#-9A-~]+@+[a-z0-9]+.+[^.]$/i;
	for(i=0; i<len; i++){
		var obj = frm.elements[hissu[i]];
		if(hissu[i]==="email" && !obj.value.match(Seiki)){
			window.alert("enter vailed mail address");	
			return false;
		}else if(obj.value == ""){
			window.alert(hissu[i]+"is required");
			obj.focus();
			return false;
		}
	}

	return true;
}

Java mailでメール送信する (Java)

Java

Java mail を使用して、google mail からメール送信する覚え書き。
漠然とプログラムからメール送信するの、
結構手間じゃないのかなー、と思っていましたが、スルスルとできました。
Java mail 便利!

google mail 側の設定で、
アクセス許可設定をしていなかったので、エラーになっていたことに気づかなかったところで
少し詰まりました。気づけば簡単なことでした。

これです。

support.google.com


参考にさせていただいたサイト
JavaMailでメール送信

2007-09-04 diary: Java JavaMail 調査 , JavaMailによるシンプルなメール送信サンプル


細かいところは以下のオラクルのドキュメントが参考になります。
http://www.oracle.com/technetwork/java/providers-150193.pdf


サンプル

package test;

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.AuthenticationFailedException;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendMailtest {
   
//エンコード指定
    private static final String ENCODE = "ISO-2022-JP";


    public static void main(final String[] args) {
        
        //メール送付
        new SendMailtest().send();

    }

//ここからメール送付に必要なSMTP,SSL認証などの設定

    public void send() {
        final Properties e.printStackTrace(); = new Properties();

        // SMTPサーバーの設定。ここではgooglemailのsmtpサーバーを設定。
        props.setProperty("mail.smtp.host", "smtp.gmail.com");

        // SSL用にポート番号を変更。
        props.setProperty("mail.smtp.port", "465");

        // タイムアウト設定
        props.setProperty("mail.smtp.connectiontimeout", "60000");
        props.setProperty("mail.smtp.timeout", "60000");

        // 認証
        props.setProperty("mail.smtp.auth", "true");

        // SSLを使用するとこはこの設定が必要。
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.socketFactory.port", "465");

       //propsに設定した情報を使用して、sessionの作成
        final Session session = Session.getInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("自分のメールドレス", "アカウントのパスワード");
            }
        });

     

        // ここからメッセージ内容の設定。上記で作成したsessionを引数に渡す。
        final MimeMessage message = new MimeMessage(session);

        try {
            final Address addrFrom = new InternetAddress(
                    "自分のメールアドレス", "送信者の表示名", ENCODE);
            message.setFrom(addrFrom);

            final Address addrTo = new InternetAddress("宛先メールアドレス",
                    "受信者の表示名", ENCODE);
            message.addRecipient(Message.RecipientType.TO, addrTo);

            // メールのSubject
            message.setSubject("ありがとうメッセージ受信しました!", ENCODE);

            // メール本文。
            message.setText("こんにちは。", ENCODE);


            // その他の付加情報。
            message.addHeader("X-Mailer", "blancoMail 0.1");
            message.setSentDate(new Date());
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        // メール送信。
        try {
            Transport.send(message);
        } catch (AuthenticationFailedException e) {
            // 認証失敗
                 e.printStackTrace();
        } catch (MessagingException e) {
            // smtpサーバへの接続失敗
           e.printStackTrace();
           
        }
    }
}

SEとプロマネを極める 仕事が早くなる文章作法

SEとプロマネを極める 仕事が早くなる文章作法

プログラミングの技術書を読んでいると、「。」がやたら多いなと思った。読みやすい。
複雑な処理を素人にも理解できるように書くにはさぞ骨が折れるのだろうな。。。など考えているうち、
技術文書を書く訓練をした経験がないことに気づき、これはまずい、、と手に取った本。


まとめ

  • 格助詞「の」を避ける

→文に複数の意味が生まれる。

新しい表計算ソフトウェアのアップデート・プログラムはメーカーより今月末に提供される

「新しい」が表計算ソフトウェア、アップデート・プログラム両方を修飾しているので、
ふた通りの意味に読める。

  • 文章を書く前に、「主題」「目的」を明確にする。

読み手はどういう点に関して、意見を求めているのか。
なんの為に書くのか。
その上で、主題は一つになるように絞り込む。

  • 否定文や二重否定文は避ける

なくならない
なければならない

  • 形容詞と副詞をなるべく避ける
  • 文章の入れ子構造を避ける
  • 一文一義で文を切る
  • 「そして」を避ける

単一の文章で二つ以上の要求をすることになり、分かりずらい。

  • 事実と主張を分ける

既存のエクセルファイルを編集する(Java)

Java

前回は新しいエクセルファイルと、シートを作成しましたが、今回は既存のエクセルシートの値を書き換えます。

のちのちは読み込むファイルや書き換える値をGUIから変更できるようにしなければいけないのですが、まずは練習ということでファイルのパスはハードコードです。

前回とやることはそんなに変わりませんが、
ファイルの読み込みにFileInputStreamとWorkbookFactoryクラスを使用しています。


使用したクラスとかメソッド

WorkbookFactory (POI API Documentation)

public static Workbook create(java.io.InputStream inp)
throws java.io.IOException,
InvalidFormatException,
EncryptedDocumentException

Workbook (POI API Documentation)

Sheet getSheet(java.lang.String name)
Get sheet with the given name


Sheet (POI API Documentation)

Row getRow(int rownum)
Returns the logical row (not physical) 0-based.


Row (POI API Documentation)

Cell getCell(int cellnum)
Get the cell representing a given column (logical cell) 0-based.

Cell (POI API Documentation)

void setCellValue(boolean value)
Set a boolean value for the cell


以下、ソースコード

package kinmu_kousu;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;


public class EditExcelSheet {
	
			//エクセルファイルを置いているフォルダー
			static final String INPUT_DIR = "/Users//Documents/";
					
			public static void main(String[] args) throws IOException {

		        // 変更するエクセルファイルを指定
		        FileInputStream in  = new FileInputStream(INPUT_DIR + "勤務表.xlsx");
		        Workbook wb = null;
		        
		        try {
			    // 既存のエクセルファイルを編集する際は、WorkbookFactoryを使用
		        wb = WorkbookFactory.create(in);
		       

		        } catch (Exception e) {
			    e.printStackTrace();
		        }
		        
		        //勤務表.xlsxの勤務表シートを取得
		        Sheet sheet = wb.getSheet("勤務表");
		        
		        //シートの6行目を取得 (名前が入っている) 
		        Row row = sheet.getRow(5);
		        
		        //6行目の3こ目のセルを取得
		        Cell cell = row.getCell(2); 
		        
		        //取得したセルにセットする値を指定
		        cell.setCellValue("変更後の名前");
		  
		        FileOutputStream out = null;
		        
		    	try {
		    	    // 変更するエクセルファイルを指定
		    	    out = new FileOutputStream(INPUT_DIR + "勤務表.xlsx");
		    	   
		    	    // 書き込み
		    	    wb.write(out);
		    	}catch(Exception e){
		    		e.printStackTrace();
		    	} finally{
		    		 out.close();
		    		 wb.close();
		    		 
		    	}
		        
	}

}

新しいエクセルファイルとシートを作成する(Java)

Java

エクセルってJavaからいじれるのかなーと思い、やってみたことの覚え書き。

Javaからエクセルシートを操作するには、Apache POIを使用するのが一般的らしいです。

Apache POI - Download Release Artifactsからpoi-bin-3.16-beta2-20170202.tar.gzをダウンロードして、Eclipseでパスを指定します。どれを使用するかはっきりしなかったので、テストということでjarファイル全部にパスを通しました。


あとは、この辺のドキュメントを参照しつつ、何ができるか模索中....

Workbook (POI API Documentation)


まずは新しくエクセルファイルを作って、シートを作成する例です。
Hungury.xlsxというファイルに、senbeiとtakoyakiというシートを作成します。


使用したメソッド

createSheet(java.lang.String sheetname)
Create a new sheet for this Workbook and return the high level representation.

write(java.io.OutputStream stream)
Write out this workbook to an Outputstream.

int getNumberOfSheets()
Get the number of spreadsheets in the workbook

package kinmu_kousu;

 

import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.Cell;

import org.apache.poi.ss.usermodel.CreationHelper;

import org.apache.poi.ss.usermodel.Row;

import org.apache.poi.ss.usermodel.Sheet;

import org.apache.poi.ss.usermodel.Workbook;

import org.apache.poi.ss.util.WorkbookUtil;

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

 


public class WriteKinmuhyo {

 

//エクセルファイルの作成フォルダ
static final String INPUT_DIR = "/Users//Documents/";

   public static void main(String[] args) {

   try{

   Workbook wb = new XSSFWorkbook();


   //senbeiシート作成
   Sheet sheet1 = wb.createSheet("senbei");

   //takoyakiシート作成
   Sheet sheet2 = wb.createSheet("takoyaki");

           
   //書き込み先のパスとファイル名の指定
   FileOutputStream out = new FileOutputStream(INPUT_DIR + "Hungury.xlsx");

   //書き込み
   wb.write(out);

    out.close();


    //シートの枚数を取得
   int numberOfsheet= wb.getNumberOfSheets();
   System.out.print(numberOfsheet);
   
   }catch(Exception e){

   e.printStackTrace();

    }

    }

}