java实现在同一Excel文件上写数据
2016-09-05 20:00
411 查看
最近分析Facebook登陆请求,为了找出请求体中表单里的参数的规律,我打算做一个统计分析,把每次登陆hook到的数据都记录在excel里。
网上已经有了许多教程,但实际按他们的步骤,还是遇到了许多蛋疼的问题。
这里,我只是研究了如何去在已用文件的基础上,添加新内容而已,至于怎么读,我就不写那么全了。
那么,问题就来了:写内容不是很简单吗?确实很简单,但达不到我的预期而已。
首先,第一个问题,如何在原有数据的excel文件上写入?官网对于在原有数据上添加数据是这么处理的:
他们并没有提供openWorkbook这样的操作,而是只有createWorkbook,也就是新建,而且是要在已有工作簿的情况下,将旧的工作薄内容复制到新的文件去。
我也不明白为什么要这么弄,若按上面的方法,基本的写法如下:
那么,我就是不想新建一个文件,在原来的文件上添加能不?答案是可以的~
很简单,就是把新旧文件都指向同一个文件就可以了,比如,我的excel在桌面上:
想法很好,但实际运行起来,另外一个问题又出来了。
因为我是直接在桌面上新建一个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文件:
以上三点细节真的耗了我不少时间,丫的~~
下面贴出一个Demo吧:
运行结果:
网上已经有了许多教程,但实际按他们的步骤,还是遇到了许多蛋疼的问题。
这里,我只是研究了如何去在已用文件的基础上,添加新内容而已,至于怎么读,我就不写那么全了。
那么,问题就来了:写内容不是很简单吗?确实很简单,但达不到我的预期而已。
首先,第一个问题,如何在原有数据的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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 使用Python生成Excel格式的图片
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序