您的位置:首页 > 编程语言 > Java开发

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

2016-09-05 20:00 411 查看
最近分析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