java对execl的简单操作

         因为工作经常面对大量数据制作,数据制作又占用了很多时间,所以往往编写脚本或程序来处理。

        这个是移动手机号段与区号的对应关系数据,从局方获得原始数据文件,execl文件,然后根据原始数据文件制作成shell脚本处理的数据文件,从后台倒入数据。

原始数据如下,第一行为手机号前四位,第一列为区号,交叉的是手机号第五位到7位,要把它们拼起来,形成7位的号首,区号对应全国的,很多,号段一般10个20个不等:

城市区号1890189118921893
20220-229、230、232、233、238、239、240、249、300、301、305-307 210-219、220-229、 
755

220-229、230、232、233、238、2399、301、305-307

 

 

 840-849、458-459、460-467、675-679 

 

下面是对这个数据的简单处理程序,还要手工改变程序~~:有时间再改进,现在是能完成任务就行了。

需要下载jexcelapi,地址:

http://www.andykhan.com/jexcelapi/download.html

将下载后的文件解包,得到jxl.jar,放入classpath,安装就完成了。它的用法可上网找下。

 基本操作

/* @author luolihui
 * @date 2008-10-17
 * @version 1.0
 *
 * 修改记录:
 * 首次完成:2008-10-17
 */

import java.io.*;
import jxl.*;
import jxl.write.*;


public class MakeHeadNun
{
 //区号个数
 private static int AREA_NUN = 296;
 //号首个数
 private static int HEAD_NUN = 20;
 //分隔符
 private static String SEPERATE = ",";
 //连号符
 private static String JOIN = "-";
 //需要制作的数据文件
    private static String XLS_FILE_NAME = "anhui.xls";
    //生成的数据文件
    private static String OUT_FILE_NAME = "anhui.unl";
 
 public static void main(String[] args)
 {
  int a_num = 0;
  int h_num = 0;
  int total_num = 0;//制作的总数据条数
  
  System.out.println("Begin to make native head number,please wait...\n");
  
  try
   {
    //读取execl文件
          Workbook book= Workbook.getWorkbook(new File(XLS_FILE_NAME));       
          
          /*
          //判断输出文件是否已经存在
          File file = new File(OUT_FILE_NAME);
          if (file.exists())
          {
           System.out.println("输出的文件名已经存在!");
           throw new Exception("输出的文件名已经存在!");
          }
          */
            //创建输出文件        
          BufferedWriter outfile=new BufferedWriter(new FileWriter(OUT_FILE_NAME));
          PrintWriter out=new PrintWriter(outfile);
      
          
          //获得第一个工作表对象
            Sheet sheet = book.getSheet(0);
           
            for ( h_num = 1; h_num <= HEAD_NUN; h_num++)//列
            {
             for ( a_num = 1; a_num <= AREA_NUN; a_num++)//行
             {
              //获得区号与号段头
                 Cell area_cell = sheet.getCell(0,a_num);
                 Cell head_cell = sheet.getCell(h_num,0);
     //转换成String类型
                 String area = area_cell.getContents();
                 String head = head_cell.getContents();
                //System.out.println("area::" + area);
                // System.out.println("head::" + head);
                                 
                 //如果区号与号头为空,抛出异常,退出
                 if (area == null || "".equals(area) || head == null || "".equals(head))
                 {
                  throw new Exception("区号或号段为空!");
                 }
                
              
              //打印单元格编号
              //System.out.print("(" + h_num + "列," + a_num + "行)");
              
                         
     //得到a_num行h_num列的单元格
              Cell cell = sheet.getCell(h_num,a_num);
              //转换成String类型 
              String head_list = cell.getContents().trim();
               

              //如果单元格不为空,调用函数printExcel,并返回制作的数据数量
                 if (head_list != null)
              {
                  total_num = total_num + printExcel(head_list,out,head,area);
              }            
             }
            }
           
            //关闭文件
            out.flush();   
            out.close();
            outfile.close();
           
            System.out.println("success! total native head number is " + total_num + "!\n");
            System.out.println("Please see file: " + OUT_FILE_NAME + "\n");

  }
  catch(Exception e)
  {
   System.out.println("fail!");
   //显示出错的行和列
   System.out.println("\n出错了!!!!!!!!!");
   System.out.println("出错的行数::" + ++a_num);
            System.out.println("出错的列数::" + ++h_num);
   //System.out.println(e);
            e.printStackTrace();
  }
 }
 
 
 /**
  * 单元格字符串,由号段的第5位到第7位组成,制作成XXXXXXX|YYY|的格式,XXXXXXX
  * 表示号首,YYY表示区号
  * 输入参数:单元格字符串,输出文件句柄,前四位号首,区号
  *
  * @author luolihui
  * @date 2008-10-17
  *
  * @param String
  * @param PrintWriter
  * @param String
  * @param String
  */
    public static int printExcel(String head_list,PrintWriter out,String head,String area)
           throws Exception
 {
  int start = 0;
  int end = 0;
  int total = 0;//本次生成的数据量
  
  for (int i = 0; i < head_list.length(); i++)
        {  
            //如果等于分隔符,跳过
           if ( head_list.substring(i,i+1).equals(SEPERATE))
            {
             continue;
            }
                           
            start = Integer.parseInt(head_list.substring(i,i+3));
                
            //System.out.println("start::" + start);
            //到当前数值后第三位如果小于整个单元格字符串长度,说明可能还有数据
            //根据后面的字符判断进行不同处理    
            if ((i + 4) < head_list.length())
            {
                //如果等于"-"连接符 
                //即是否200-300这种情形
             if (head_list.substring(i+3,i+4).equals(JOIN))
             {      
              end = Integer.parseInt(head_list.substring(i+4,i+4+3));
              
              //System.out.println("end::" + end);
                     
              for (int j = start; j <= end ; j++)
              {
               //写文件
               //因为号码可能从000-001,010-019,转变成整形后,前面的0丢了,因此要补全
               if ( j >= 0 && j < 10)
               {
                out.write(head + "00" + String.valueOf(j) + "|" + area + "|");
               }
               else if (j >= 10 && j < 100)
               {
                out.write(head + "0" + String.valueOf(j) + "|" + area + "|");
               }
               else
               { 
                out.write(head+String.valueOf(j) + "|" + area + "|");
               }
                
               out.println();            
               total ++;  
              }
              
              i = i + 6;
              
                 }
                 //如果是200 、这种情形(后带一个分隔号)            
                 else if (head_list.substring(i+3,i+4).equals(SEPERATE))
                 {
                  //写文件
                  if (start >= 0 && start < 10)
                  {
                   out.write(head + "00" +String.valueOf(start) + "|" + area + "|");
                  }
              if (start >=10 && start < 100)
              {
               out.write(head+ "0" + String.valueOf(start) + "|" + area + "|");
              }
              else
              {
               out.write(head+String.valueOf(start) + "|" + area + "|");
              }
              
              out.println();
                            
              i = i + 3;
              
              total ++;
             }
             else
             {
              System.out.println("输入文件的数据制作有误!");
              throw new Exception("输入文件的数据制作有误!");           
             }
           }
            else
            {
             //写文件
             if (start >= 0 && start < 10)
                {
                 out.write(head + "00" +String.valueOf(start) + "|" + area + "|");
                }
             if (start >=10 && start < 100)
             {
              out.write(head+ "0" + String.valueOf(start) + "|" + area + "|");
             }
             else
             {
              out.write(head+String.valueOf(start) + "|" + area + "|");
             }
            
             out.println();

            i = i + 3;
             total ++;
  
            }
            out.flush();   
        }
       
        return total;
        
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值