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表; 自己回来研究了一下,参考别人代码,写了一个小demoimport com.bdqn.demo.model.entity.User; im...
  • EndisenChen
  • EndisenChen
  • 2017年04月25日 20:25
  • 6971

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

所需要的poi的jar包   [java] view plain copy import java.io.FileInputStream;  ...
  • wangsy0202
  • wangsy0202
  • 2016年11月19日 21:04
  • 411

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

所需要的poi的jar包   import java.io.FileInputStream; import java.io.FileOutputStream; import org...
  • goodleiwei
  • goodleiwei
  • 2012年02月10日 08:54
  • 25957

java使用Workbook进行excel读取和创建

public static void main(String[] args) throws Exception { //输入流。a.xls为要读取的excel文件名,不可为xlsx后缀...
  • u012012240
  • u012012240
  • 2016年12月29日 16:05
  • 5063

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

写值到Excel:import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; i...
  • u013068377
  • u013068377
  • 2016年08月09日 17:19
  • 14330

Java实现对Excel数据的读和写

用Java实现对Excel中的数据读取和写入
  • sinat_38167943
  • sinat_38167943
  • 2017年05月19日 17:03
  • 330

java 创建EXCEL文件,并向EXCEL中写入数据

  • 2014年05月13日 16:14
  • 639KB
  • 下载

java中怎样从Excel中读写数据

java向excel读写数据的步骤: 首先,需要jxl.jar包。 读excel文件: public class Test2 {     public static void main...
  • u014600432
  • u014600432
  • 2014年10月20日 20:28
  • 773

使用JAVA读取和写入EXCEL文件

首先要下载 poi包和jxl包 读取部分: import java.io.BufferedInputStream; import java.io.File; import java.io.File...
  • u010634066
  • u010634066
  • 2014年12月26日 12:38
  • 7358

java实现赋值Excel模板并写入后导出

遇到复杂的表头excel导出,我们该怎么办呢?            package com.at21.gpd.action; import java.io.BufferedInputStream;...
  • u012788601
  • u012788601
  • 2016年10月02日 22:02
  • 7967
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java实现在同一Excel文件上写数据
举报原因:
原因补充:

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