android操作excel

        最近一直在考虑要做的那个Android的项目中的数据用什么存储,导师给的意见是直接用excel,因为简单;傻博给的意见是用数据库,因为以后如果要改动的话,excel改起来,累死人。综合考虑了下,决定两个都做,不过数据库的还没完全弄好,所以先写一个操作excel的方案吧,其实就是一些我写的函数,用来实现对excel的基本操作,因为这里面重点是操作,所以,界面显示上,我就没有追求什么了。

       首先说下要实现的功能吧。

1.在sdcard的目录上创建一个excel表格,这个路径和表格名字都可以自己设定。

2.写两个自定义函数,一个写,一个读。

3.写函数,要先判断指定位置是否文件已存在;存在就做修改操作,不存在就创建新的表格,然后写操作。

4.读函数,判断指定位置是否文件存在;不存在,提醒文件不存在,存在就读取指定位置的内容。


       要想能在android上直接操作excel,官方是没有给出可用的库的,但是我们可以先下载一个jxl.jar这个包,然后把它放到你的工程的libs文件夹下,然后再在工程的properties里面设置添加这个额外的库,这样就可以使用这个库里面的类了。

       有了这个库之后,我们就可以来创建一个excel了,我们在sdcard的根目录下创建一个叫chz.xls的表格,你也可以设置别的路径。

String fileName = "mnt/sdcard/chz.xls";
WritableWorkbook wwb = null;
    	        try
    	        {
    	           //创建一个可写入的工作薄(Workbook)对象
    	            wwb = Workbook.createWorkbook(new File(fileName));
    	        } catch (IOException e)
    	        {
    	            e.printStackTrace();
    	        }

       因为创建很简单,所以我是把他直接写入到我的写函数里面。不过这样的话,写函数就要注意了,第一步一定是判断指定位置是否该文件已经存在,如果存在就执行修改操作,也就是执行getWorkbook();如果不存在就执行创建操作,也就是执行createWorkbook()。所以从这里也可以看出来,待会儿的读取也是执行第一个函数。

       这就引出一个问题,怎么判断该位置是否文件已存在。其实这个很好解决,直接用一个简单的判断就可以了。

//判断filename文件是否存在
    	try{
            File f=new File(fileName);
            if(!f.exists()){
            	Toast.makeText(MainActivity.this, "文件不存在,请先创建!", Toast.LENGTH_SHORT).show();
            }
    	}catch (Exception e) {
            // TODO: handle exception
            //return false;
    	}

       文件不存在的话,就会显示出我要打印的内容;如果存在就不会执行这个try。

       既然这个问题也解决了,就只剩下怎么写的问题了。因为这是一个自定义的函数每个写的人可能都有不同的想法,所以定义也不一样,所以,我介绍我的思路。写入表格无非两类数据,一个字符串,一个数字型(我定义为double)。所以我想法是重构这个函数,最后一位参数是要写入的内容,这个重构就是,传字符串的函数的参数是String,传数字的话,参数的类型就是double。那我们再想一下,我们还要那些参数呢?首先我们要写到哪里,也就是文件是什么,这肯定要,我定义为String fileName。其次,我们要写到这个表格的哪里,也就是单元格的具体行列值,所以还要两个参数 int column和int row。

       参数我们确定了,接下来就要看怎么写到这个单元格了。这里首先要确定一个关系,就是文件名也可以说是我们的工作簿workbook,在这个工作簿上我们可以创建很多个表sheet,我前面都是把这两个混在一起说的,但是这里要区分,因为你不能直接向workbook里写入数据,除非是给sheet取名字,你写的时候要定义好那个sheet要写入。(你这时就要说,刚才的参数要多一个sheet,其实的确需要,但是我这里默认只有一张表,为了少一个参数,参数太多,给人感觉很累赘)。

// 第一个参数是工作表的名称,第二个是工作表在工作薄中的位置
    	            WritableSheet ws = wwb.createSheet("sheet1", 0);
    	            // 在指定单元格插入数据
    	            jxl.write.Number num = new jxl.write.Number(column, row, number);
    	            try
    	            {
    	                ws.addCell(num);
    	            } catch (RowsExceededException e1)
    	            {
    	                e1.printStackTrace();
    	            } catch (WriteException e1)
    	            {
    	                e1.printStackTrace();
    	            }
    	            try
    	            {
    	                // 从内存中写入文件中
    	                wwb.write();
    	                wwb.close();
    	            } catch (IOException e)
    	            {
    	                e.printStackTrace();
    	            } catch (WriteException e)
    	            {
    	                e.printStackTrace();
    	            }

       这是写入数字,从Number这个方法的英语单词含义就可以看出来,那我要写入的是字符串用什么呢?

jxl.write.Label lbl = new jxl.write.Label(column, row, str); 
    		try
            {
    			mWritableSheet.addCell(lbl);
            } catch (RowsExceededException e1)
            {
                e1.printStackTrace();
            } catch (WriteException e1)
            {
                e1.printStackTrace();
            }

       用Label这个方法就是操作的是字符串。其实,我这里额外提一句,因为这样写的代码很长,很多部分都是重复的,有木有简单的方法呢?有的,其实不就是把数字当成字符串处理么,String.ValueOf(double)这个函数貌似就可以,不过我没有测试,因为这样还要在里面加判断,也很复杂的样子。

       完整的写函数其实就是这样,我这里只展示写入字符串的吧,写入数字也是一样的,略加修改就可以。

//写入字符型
    public void writeExcel(String fileName,int column,int row,String str)
    {
    	//判断filename文件是否存在
    	try{
            File f=new File(fileName);
            if(!f.exists()){
                // return false;
        	    //filename文件不存在
    	        WritableWorkbook wwb = null;
    	        try
    	        {
    	           //创建一个可写入的工作薄(Workbook)对象
    	            wwb = Workbook.createWorkbook(new File(fileName));
    	        } catch (IOException e)
    	        {
    	            e.printStackTrace();
    	        }
    	        if (wwb != null)
    	        {
    	            // 第一个参数是工作表的名称,第二个是工作表在工作薄中的位置
    	            WritableSheet ws = wwb.createSheet("sheet1", 0);
    	            // 在指定单元格插入数据
    	            jxl.write.Label lbl = new jxl.write.Label(column, row, str);
    	            try
    	            {
    	                ws.addCell(lbl);
    	            } catch (RowsExceededException e1)
    	            {
    	                e1.printStackTrace();
    	            } catch (WriteException e1)
    	            {
    	                e1.printStackTrace();
    	            }
    	            try
    	            {
    	                // 从内存中写入文件中
    	                wwb.write();
    	                wwb.close();
    	            } catch (IOException e)
    	            {
    	                e.printStackTrace();
    	            } catch (WriteException e)
    	            {
    	                e.printStackTrace();
    	            }
    	        }
        	  }
            
		    }catch (Exception e) {
		            // TODO: handle exception
		            //return false;
		    }
		    	
		    //return true;
		    //filename文件已经存在
    	try {             
    		jxl.Workbook mWorkbook = jxl.Workbook.getWorkbook(new File(fileName));            
    		jxl.write.WritableWorkbook mWritableWorkbook = jxl.Workbook.createWorkbook(new File(fileName),mWorkbook);
    		jxl.write.WritableSheet mWritableSheet = mWritableWorkbook.getSheet(0);             
    		jxl.write.Label lbl = new jxl.write.Label(column, row, str); 
    		try
            {
    			mWritableSheet.addCell(lbl);
            } catch (RowsExceededException e1)
            {
                e1.printStackTrace();
            } catch (WriteException e1)
            {
                e1.printStackTrace();
            }
    		mWritableWorkbook.write();             
    		mWritableWorkbook.close();             
    		mWorkbook.close(); 
    	} catch (BiffException e) {             
    		// TODO Auto-generated catch block             
    		e.printStackTrace();         
    	} catch (IOException e) {             
    		// TODO Auto-generated catch block             
    		e.printStackTrace();         
    	} catch (WriteException e) {             
    		// TODO Auto-generated catch block             
    		e.printStackTrace();         
    		} 
    	
    	
    }

      接着说读函数了,第一步肯定是判断文件存在与否,不多说了。然后是读取已存在的表,用第一个函数,也不说了。要得到具体单元格内容,可以直接用getrow(column)[row],但是这个返回值是一个Cell型的,要转化为String型的,所以就是下面这样的操作。

String cellStr = sheet.getRow(column)[row].getContents();

       具体的读函数代码:

public String readExcel(String fileName, int column, int row)
    {
    	//判断filename文件是否存在
    	try{
            File f=new File(fileName);
            if(!f.exists()){
            	Toast.makeText(MainActivity.this, "文件不存在,请先创建!", Toast.LENGTH_SHORT).show();
            }
    	}catch (Exception e) {
            // TODO: handle exception
            //return false;
    	}
    	
        String content = "";
        try
        {
            Workbook book = Workbook.getWorkbook(new File(fileName));
            Sheet sheet = book.getSheet(0);
            //得到x行y列所在单元格的内容
            String cellStr = sheet.getRow(row)[column].getContents();
            content = cellStr;
        } catch (BiffException e)
        {
            content = "";
            e.printStackTrace();
        } catch (IOException e)
        {
            content = "";
            e.printStackTrace();
        } 
        return content;    
    }

       哦,貌似忘记分析参数了,不过你看了我的设计写函数思路,读函数,你一看就懂了,不过区别就是这个readExcel函数是有返回值的,返回的就是读到的单元格内容,这点很重要,别的我就不说了。
       哦,主函数忘记说了,就是调运这两个函数,然后把读到的要显示出来就可以了。


       测试是在cmd中进行的,过程不复杂,就是一些简单的命令,比方说进入虚拟机,先要到指定路径下,然后adb shell就可以进入虚拟机了。然后跳转到sdcard这个目录下,就cd /sdcard就可以了,看这个目录下文件ls。要看这个chz.xls表格怎么办呢?把他移到电脑的d盘根目录下,这样再用电脑打开看就可以了。用adb pull /sdcard/chz.xls d:/这个命令就可以了。下面展示几张图,不多说。









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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值