【课堂程序整理】提取身份证号中的信息(包括地址)

作业要求:使用GUI界面,输入18位身份证号,判断并输出其中包含的信息。

其中使用到了IO流。自定义异常,GUI界面设计等知识

完整代码:

package chap05;
import java.awt.FlowLayout;

import javax.swing.*;

import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.awt.event.*;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Calendar;

class MyException extends Exception{
	private int idnumber;
	//覆盖原有的Exception方法
	public MyException(String message,int id){
		super(message);
		this.idnumber=id;
	}
	public int getId(){
		return idnumber;
	}
	@Override
	public String toString() {
		return this.getMessage();
	}
}

public class ID extends JFrame implements ActionListener{
	public void regist(String num) throws MyException{
		boolean b=false;
		for(int i=0;i<num.length();i++){
			if(num.charAt(i)<48||num.charAt(i)>57){
				b=true;
			}
		}
		if(num.length()!=18){
			throw new MyException("异常:请输入身份证的前18位:", 3);
		}
		if(b){
			throw new MyException("异常:身份证号为数字:", 4);
		}
	}
	private JLabel jl_id;
	private JTextField jtf_name;
	private JTextArea jta_info;
	private JButton jb_ok;
	private JButton jb_exit;
	public ID(){
		super("身份证号信息提取");
		init();
	}
	public void init(){
		setLayout(new FlowLayout()); //设置为Flow布局管理器
		//实例化组件
		jl_id=new JLabel("身份证号:");
		jtf_name=new JTextField(20);
		jb_ok=new JButton("提取:");
		jb_exit=new JButton("退出");
		jta_info=new JTextArea("身份证号信息为……",5,50);
		//将组件加入父容器
		this.add(jl_id);
		this.add(jtf_name);
		this.add(jb_ok);
		this.add(jb_exit);
		this.add(jta_info);
		//将时间源(命令按钮产生单击时间)和监听器(实现了ActionListener接口的类的对象)关联
		jb_ok.addActionListener(this);
		jb_exit.addActionListener(this);
		//使窗口关闭生效
		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		setSize(600, 170);
		setLocationRelativeTo(null);
		this.setVisible(true);
	}
	@Override
	public void actionPerformed(ActionEvent a) {
		//131127199410094377
		Calendar cal=Calendar.getInstance();
		int nowYear=cal.get(Calendar.YEAR);
		if(a.getSource().equals(jb_ok)){
			try{
				String ID =new String(jtf_name.getText().trim());
				regist(ID);
				String birthYear=ID.substring(6, 10);
				String birthMonth=ID.substring(10, 12);
				String birthDay=ID.substring(12, 14);
				int sexf=ID.charAt(16)-48;
				String sex=sexf%2==0?"女":"男";
				int age=nowYear-Integer.parseInt(birthYear);
				String add=ID.substring(0, 6);    //截取身份证号中的前六位
				Double add2=Double.parseDouble(add);   //将截取的add转换为Double类型
				String address=null;
				//建立文件IO流,身份证号对应的地址文件存放在"src\\chap05\\ID.xls"中
				FileInputStream fis=new FileInputStream("src\\chap05\\ID.xls");
				//使用POI.jar中的方法读写Excel文件
				HSSFWorkbook wb=new HSSFWorkbook(fis);
				HSSFSheet sheet=wb.getSheetAt(0);
				for(int i=0;i<sheet.getLastRowNum();i++){
					HSSFRow row=sheet.getRow(i);
					Double value=row.getCell(0).getNumericCellValue(); /*value为取得的ID.xls中的号码列,不知道为啥单元格格式是文本类型,但是用getStringCellValue()方法不能获取,说格式错误,改为getNumericCellValue()就行了,这里有点不理解。请大神指正*/
					String value=row.getCell(0).getStringCellValue();   //这样就不行,报错。
					if(add2.equals(value)){
						address=row.getCell(1).getStringCellValue();
					}
				}
				jta_info.setText("出生日期:"+birthYear+"年"+birthMonth+"月"+birthDay+"日"+
				"\n"+"年龄:"+age+"\n"+"性别:"+sex+"\n"+"地址:"+address);
			}catch(MyException e){
				if(e.getId()==3){
					JOptionPane.showMessageDialog(this,e.toString()+e.getId());
				}
				if(e.getId()==4){
					JOptionPane.showMessageDialog(this,e.toString()+e.getId());
				}
			} catch (FileNotFoundException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			} catch (IOException e) {
				// TODO 自动生成的 catch 块
				e.printStackTrace();
			}
		}
		if(a.getSource().equals(jb_exit)){
			int j=JOptionPane.showConfirmDialog(this,"确认退出?");
			if(j==0){
				System.exit(0);
			}
		}
		
		
	}
	public static void main(String[] args) {
		java.awt.EventQueue.invokeLater(new Runnable(){
			public void run(){
				new ID().setVisible(true);
			}
		});
	}
}



其中在判断地址的代码中,包含地址信息的Excel文件中号码和地址是一一对应的关系,所有的单元格格式都为文本类型,使用getStringCellValue()方法获取单元格内容的时候能获取到地址,但是不能获取数字。总是提示不能使用从text的单元格中获取Numeric类型的值。不知道是怎么回事,还请大神指导。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值