java实现在同一Excel文件上写数据

原创 2016年09月05日 20:00:14

最近分析Facebook登陆请求,为了找出请求体中表单里的参数的规律,我打算做一个统计分析,把每次登陆hook到的数据都记录在excel里。

网上已经有了许多教程,但实际按他们的步骤,还是遇到了许多蛋疼的问题。

这里,我只是研究了如何去在已用文件的基础上,添加新内容而已,至于怎么读,我就不写那么全了。

那么,问题就来了:写内容不是很简单吗?确实很简单,但达不到我的预期而已。


首先,第一个问题,如何在原有数据的excel文件上写入?官网对于在原有数据上添加数据是这么处理的:


他们并没有提供openWorkbook这样的操作,而是只有createWorkbook,也就是新建,而且是要在已有工作簿的情况下,将旧的工作薄内容复制到新的文件去。

我也不明白为什么要这么弄,若按上面的方法,基本的写法如下:

WritableWorkbook wwb=Workbook.createWorkbook(new File("new"), Workbook.getWorkbook(new File("old")));  
也就是说,我弄个新文件,去承接旧文件的东西。。。。

那么,我就是不想新建一个文件,在原来的文件上添加能不?答案是可以的~

很简单,就是把新旧文件都指向同一个文件就可以了,比如,我的excel在桌面上:

            File file=new File("C:\\Users\\Administrator\\Desktop\\facebook.xls");
            WritableWorkbook wwb=Workbook.createWorkbook(file, Workbook.getWorkbook(file)); 


想法很好,但实际运行起来,另外一个问题又出来了。

因为我是直接在桌面上新建一个TXT文档,然后重命名为facebook.xls的,所以抛出找不到文件的异常。


这是由于新建的TXT文件,手动更改后缀名.xls,虽然显示是excel的图标,但文件实际格式却不是excel格式的。


那么,如果是这样的话,电脑不是装有excel吗?对,我们可以在桌面上右键“新建文件-->新建office excel”,或者直接进入Excel,新建一个空白文件,然后保存到桌面即可。

BUT...问题又来了,还是抛出了异常:


这个问题其实就是Excel版本的问题了,我这里的jxl.jar包只是支持Excel2003的,但电脑的是Excel2007的,jxl的接口并不支持2007的操作。

其实2007的文件新建后,其后缀名为 .xlsx,即使你把“x”去掉变成“xls”,但其实里面的格式还是2007的,所以jxl接口还是无法识别。

那么,我不想换成Excel2003,但又不想用POI包(Apache POI包,支持Excel2007的操作)有没有办法?可以有!利用代码创建一个2003的xls文件:

        	//导出到桌面,若是Android系统,路径可以写成“/sdcard/facebook.xls”
            File file=new File("C:\\Users\\Administrator\\Desktop\\facebook.xls");
            if(!file.exists()){
            	//file.createNewFile();
            	//判断是否存在xls文件,若没有则新建,并创建一个默认表单sheet1,不要用上面的creatNewFile()
            	wwb=Workbook.createWorkbook(new FileOutputStream(file));
            	wwb.createSheet("sheet", 0);
            	wwb.write();
            	wwb.close();
            }
这里注意两点,一是不要用File的createNewFile(),这和手动创建TXT,改后缀为.xls没分别,是没用的,二是需在里面创建一个默认表单sheet,不然会报错。


以上三点细节真的耗了我不少时间,丫的~~

下面贴出一个Demo吧:

public class ExcelExport {

	//URL格式的数据,直接从HttpEntity上面获取到的原始数据,格式为key=value&key=value,,,
	public static String data="name=Elizabeth&gender=female&email=143941234@qq.com&password=123456&birthday=1993-02-01";
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		exportExcel(data);
	}

    public static void exportExcel(String dataString){
        WritableWorkbook wwb=null;
        try{
        	//导出到桌面,若是Android系统,路径可以写成“/sdcard/facebook.xls”
            File file=new File("C:\\Users\\Administrator\\Desktop\\facebook.xls");
            if(!file.exists()){
            	//file.createNewFile();
            	//判断是否存在xls文件,若没有则新建,并创建一个默认表单sheet1,不要用上面的creatNewFile()
            	wwb=Workbook.createWorkbook(new FileOutputStream(file));
            	wwb.createSheet("sheet", 0);
            	wwb.write();
            	wwb.close();
            }
            
            //为了实现覆盖写入,即可以在原有数据上叠加,需要用到以下方法实例化WritableWorkbook
            wwb=Workbook.createWorkbook(file, Workbook.getWorkbook(file));           
            
            if(wwb==null) return;
	        
        	//获取名为“data" 的表单
            WritableSheet sheet=wwb.getSheet("data");
            //若是第一次运行,则表单为null,需要初始化,即在表格第一行设置好数据data的标题
            if(sheet==null){
            	//若表单不存在,则新建名字为“data”的表单,参数“0”是索引,表示第一个
                sheet=wwb.createSheet("data", 0);
                
                //创建Label,一个Label相当于一个单元格,参数1:列索引; 参数2:行索引; 参数3:内容。
                Label name=new Label(0, 0, "name");               
                Label gender=new Label(1, 0, "gender");
                Label email=new Label(2, 0, "email");
                Label password=new Label(3, 0, "password");
                Label birthday=new Label(4, 0, "birthday");
                
                sheet.addCell(name);
                sheet.addCell(gender);
                sheet.addCell(email);
                sheet.addCell(password);
                sheet.addCell(birthday);
            }

            //获取当前的表单已用行数,然后在下一行进行写数据,避免覆盖
            int currentRow=sheet.getRows();
            //将URL格式的数据,利用split函数分割成单个数据,并填写到表单上
            String[] datas=createRegisterRequestDatas(dataString);
            for(int i=0; i<datas.length; i++){
                Label cell=new Label(i, currentRow, datas[i]);
                sheet.addCell(cell);
            }
            //调用write函数,将数据写到workbook上
            wwb.write();        	
	        
        }catch(Exception e){
        	e.printStackTrace();
        }finally {
        	try {
        		//最后需要把workbook关掉,避免浪费资源
				wwb.close();
			} catch (WriteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

    }

    //将URL格式的参数分割成一个个单元数据
    public static String[] createRegisterRequestDatas(String dataString){
        String[] keyValuePairs=dataString.split("&");
        String[] datas=new String[keyValuePairs.length];
        for(int i=0; i<keyValuePairs.length; i++){
            if(keyValuePairs[i].split("=").length==2){
                datas[i]=keyValuePairs[i].split("=")[1];
            }else{
                datas[i]="";
            }
        }
        return datas;
    }
}

运行结果:













版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java操作Excel编程接口

利用java操作Excel,有个开源的东东-jxl.jar,可以到http://sourceforge.net/project/showfiles.php?group_id=79926下载。 下面列...

Java操作Excel编程接口

利用java操作Excel,有个开源的东东-jxl.jar,可以到http://sourceforge.net/project/showfiles.php?group_id=79926下载。 下面列...

Java写入Excel

package com.bossy.base; import java.io.File; import java.io.FileInputStream; import java.io.FileO...

java 向已存在的excel中追加数据

所需要的poi的jar包   import java.io.FileInputStream; import java.io.FileOutputStream; import org...

Java读取、写入、处理Excel文件中的数据

原文链接 在日常工作中,我们常常会进行文件读写操作,除去我们最常用的纯文本文件读写,更多时候我们需要对Excel中的数据进行读取操作,本文将介绍Excel读写的常用方法,希望对大家学习Jav...

java实现邮件发送, 抄送及多附件发送

所需的jar包 mailapi.jar和stmp.jar 或 javax-mail-xxx.jar(如javax.mail-1.5.6.jar) http://www.oracle.com/t...

使用JAVA读取和写入EXCEL文件

首先要下载 poi包和jxl包 读取部分: import java.io.BufferedInputStream; import java.io.File; import java.io.File...

Java实现对Excel数据的读和写

用Java实现对Excel中的数据读取和写入

java poi技术操作excel之写Excel(向Excel中写入值)

写值到Excel:import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; i...

Java数据导出(写)Excel文件 解析

1.添加jar文件     java导入导出Excel文件要引入jxl.jar包,最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Ex...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)