java對execl的簡單操作

         因爲工作經常面對大量數據製作,數據製作又佔用了很多時間,所以往往編寫腳本或程序來處理。

        這個是移動手機號段與區號的對應關係數據,從局方獲得原始數據文件,execl文件,然後根據原始數據文件製作成shell腳本處理的數據文件,從後臺倒入數據。

原始數據如下,第一行爲手機號前四位,第一列爲區號,交叉的是手機號第五位到7位,要把它們拼起來,形成7位的號首,區號對應全國的,很多,號段一般10個20個不等:

城市區號 1890 1891 1892 1893
20 220-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;
        
 }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章