JXL开发Excel文档中文教程

作为办公文档,势必要涉及到的电
【菜科解读】
作为办公文档,势必要涉及到的电子文档的交换,Excel是一种在企业中非常通用的文件格式,打印和管理也比较方便。
在一个Java应用中,将一部分数据生成Excel格式,是与其他系统无缝连接的重要手段。
1.2 Excel开发常用开源工具在开源世界中,有两套比较有影响的API可供使用,一个是POI,一个是jExcelAPI。
1.3 比较开源工具的优缺点1.3.1 Jxl优缺点Jxl特征有如下描述: ● 支持Excel 95-2000的所有版本 ● 生成Excel 2000标准格式 ● 支持字体、数字、日期操作 ● 能够修饰单元格属性 ● 支持图像和图表 应该说以上功能已经能够大致满足我们的需要。
最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件。
另外需要说明的是,这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。
1.3.2 Poi优缺点Jakarta 的 POI Project 与 Java Excel API 在开源世界中可以说是并驾齐驱,但是也各有优劣,poi在某些细节有些小Bug并且不支持写入图片(poi其实可以写入图片,不过没有jxl来的方便,比较麻烦),其他方面都挺不错的;而JXL提供了对图片的支持(但是仅仅支持png格式的图片),问题就是对公式支持不是很好,但还是提供了简单的公式读取支持。
因此你的项目中要选用什么样的第三方插件为完全由你的应用来决定。
如果你的软件是跟财务有相当的关系的话,建议采用 POI Project,就我所在目前的项目来说由于用不到计算公式,而且很可能需要导出图片,因此,我的选择是 JXL 。
1.4 性能比较以及最终选择1.4.1 内存消耗:(来自网络)谈下JVM虚拟机内存消耗的情况.数据量3000条数据,每条60列.JVM虚拟机内存大小64M.使用POI:运行到2800条左右就报内存溢出.使用JXL:3000条全部出来,并且内存还有21M的空间.可想而知,在对内存的消耗方面差距还是挺大的.也许是由于JXL在对资源回收利用方面做的还挺不错的。
1.4.2 速度效率(读取excel数据)(来自网络)文件 POI加载耗时 POI总耗时 JXL加载耗时 Jxl总耗时 文件大小57KB 1172 ms 1172 ms 1265 ms 2250 ms 文件大小652KB 2297 ms 2313 ms 4406 ms 9750 ms 文件大小2.24M 3109ms 3140ms 16313ms 37453ms1.4.3 写excel速度效率jxl插入数据比poi速度要快1.4.4 功能对比相比提供的功能的话,JXL相对弱了点.所以如果要实现的功能比较复杂的情况下可以考虑使用POI,但如果只想生成一些大数据量可以考虑使用JXL,或者CSV也是一个不错的选择,不过CSV并不是真正的excel,然而jxl插入数据比poi速度要快。
2 Jxl开发指南2.1 介绍jxl操作excel包括对象Workbook,Sheet ,Cell。
一个excel就对应一个Workbook对象,一个Workbook可以有多个Sheet对象一个Sheet对象可以有多个Cell对象2.2 读取excel操作通过Workbook,Sheet ,Cell这三个对象我们就可以实现Excel文件的读取工作。
我们先想想一下读取步骤,不管是什么样的Excel操作框架必定都要经历1、 选取Excel文件得到工作薄2、 选择工作表3、 选择Cell4、 读取信息2.2.1 读取工作薄选取Excel文件得到工作薄WorkbookWorkbook workbook = Workbook.getWorkbook(new File("myfile.xls"));2.2.2 读取工作表通过Workbook的getSheet方法选择第一个工作表(从0开始)Sheet sheet = workbook.getSheet(0);也可以通过工作的名称来得到Sheet2.2.3 读取单元格通过Sheet的getCell方法选择位置为C2的单元格(两个参数都从0开始)Cell c2 = sheet.getCell(2,1);2.2.3.1 读取单元格的值2.2.3.2 通过Cell的getContents方法把单元格中的信息以字符的形式读取出来String stringc2 = c2.getContents();2.2.3.3 Cell提供了一个getType方法能够返回单元格的类型信息,同时JXL提供了一个CellType类用来预设Excel中的类型信息,而且JXL提供了一些Cell类的子类用来分别用来表示各种类型的单元格,如LabelCell,NumberCell,DateCell分别表示字符、数值、日期类型的单元格if (c2.getType() == CellType. LABEL) { LabelCell nc = (LabelCell) c2; String number b2 = nc. getString();}if (c2.getType() == CellType. DATE) { DateCell nc = (DateCell) c2; Date number b2 = nc. getDate();}if (c2.getType() == CellType.NUMBER) { NumberCell nc = (NumberCell) c2; double number b2 = nc.getValue();}API提供了以下基本类型,与Excel的数据格式相对应,如下图所示2.2.4 以释放资源:workbook.close()当你完成对Excel电子表格数据的处理后,一定要使用close()方法来关闭先前创建的对象,以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要最后不要忘记关闭workbook以释放资源:workbook.close();2.3 写excel操作通过WritableWorkbook,WritableSheet,Label这三个对象我们就可以实现Excel文件的插入工作。
我们先想想一下插入,不管是什么样的Excel操作框架必定都要经历1、 创建Exce工作薄2、 创建工作表3、 创建单元格2.3.1 创建工作薄API提供了两种方式来处理可写入的输出流,一种是直接生成本地文件,如果文件名不带全路径的话,缺省的文件会定位在当前目录,如果文件名带有全路径的话,则生成的Excel文件则会定位在相应的目录;另外一种是将Excel对象直接写入到输出流,例如:用户通过浏览器来访问web服务器,如果HTTP头设置正确的话,浏览器自动调用客户端的Excel应用程序,来显示动态生成的Excel电子表格。
2.3.1.1 创建可写入的Excel工作薄WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));2.3.1.2 将WritableWorkbook直接写入到输出流OutputStream os = new FileOutputStream(targetfile);WritableWorkbook wwb = Workbook.createWorkbook(os);2.3.2 创建工作表WritableSheet ws = wwb.createSheet("通讯录", 0);//创建sheet2.3.3 创建单元格2.3.3.1 添加文本类单元格Label labelC = new Label(0, 0, "This is a Label cell");2.3.3.2 添加带有字型Formatting的对象WritableFont wf = new WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);WritableCellFormat wcfF = new WritableCellFormat(wf);labelCF = new Label(1, 0, "This is a Label Cell", wcfF);ws.addCell(labelCF);2.3.3.3 添加带有字体颜色Formatting的对象WritableFont wfc = new WritableFont(WritableFont.ARIAL,10,WritableFont.NO_BOLD, false,UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);WritableCellFormat wcfFC = new WritableCellFormat(wfc);Label labelCFC = new Label(1, 0, "This is a Label Cell", wcfFC);ws.addCell(labelCF);2.3.3.4 添加Number对象Number labelN = new jxl.write.Number(0, 1, 3.1415926);ws.addCell(labelN);2.3.3.5 添加带有formatting的Number对象NumberFormat nf = new NumberFormat("#.##");WritableCellFormat wcfN = new WritableCellFormat(nf);Number labelNF = new Number(1, 1, 3.1415926, wcfN);ws.addCell(labelNF);2.3.3.6 添加Boolean对象Boolean labelB = new jxl.write.Boolean(0, 2, false);ws.addCell(labelB);2.3.3.7 添加DateTime对象DateTime labelDT = new DateTime(0, 3, new java.util.Date());ws.addCell(labelDT);2.3.3.8 添加带有formatting的DateFormat对象DateFormat df = new DateFormat("dd MM yyyy hh:mm:ss");WritableCellFormat wcfDF = new WritableCellFormat(df);DateTime labelDTF = new DateTime(1, 3, new Date(), wcfDF);ws.addCell(labelDTF);2.3.3.9 添加公式单元格Fornual formual = new Formual(0,11,”Sum(A1:A9)”);wrb.addCell(formual);2.3.3.10 添加图像WritableImage wrimage=new WritableImage(1,5,10,10,new File(imageFilepath));wrb.addImage(wrimage); 注意,API中注明只支持png文件。
2.3.4 合并单元格通过writablesheet.mergeCells(int x,int y,int m,int n);来实现的。
表示将从第x+1列,y+1行到m+1列,n+1行合并 (四个点定义了两个坐标,左上角和右下角)结果是合并了m-x+1行,n-y+1列,两者乘积就是合并的单元格数量。
sheet.mergeCells(0, 6, 3, 8);label = new Label(0, 6, "合并了12个单元格");sheet.addCell(label);2.3.5 添加单元格样式主要是改变单元格背景、字体、颜色等等。
WritableCellFormat wc = new WritableCellFormat();wc.setAlignment(Alignment.CENTRE); // 设置居中wc.setBorder(Border.ALL, BorderLineStyle.THIN); // 设置边框线wc.setBackground(jxl.format.Colour.RED); // 设置单元格的背景颜色label = new Label(1, 5, "字体", wc);sheet.addCell(label);2.3.6 设置单元格字体WritableFont wfont = new WritableFont(WritableFont.createFont("楷书"), 20);WritableCellFormat font = new WritableCellFormat(wfont);label = new Label(2, 6, "楷书", font);sheet.addCell(label);2.3.7 写入到文件wwb.write();// 写入数据wwb.close();// 关闭文件2.4 拷贝、更新Excel工作薄//创建只读的Excel工作薄的对象jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(sourcefile));//创建可写入的Excel工作薄对象WritableWorkbook wwb=Workbook.createWorkbook(new File(targetfile), rw);//读取第一张工作表jxl.write.WritableSheet ws = wwb.getSheet(0);//获得第一个单元格对象jxl.write.WritableCell wc = ws.getWritableCell(0, 0);//判断单元格的类型, 做出相应的转化if(wc.getType() == CellType.LABEL){Label l = (Label)wc;l.setString("The value has been modified.");}//写入Excel对象wwb.write();//关闭可写入的Excel对象wwb.close();//关闭只读的Excel对象rw.close();为了提高性能,在读取工作表时,与数据相关的一些输出信息,所有的格式信息,如:字体、颜色等等,是不被处理的,因为我们的目的是获得行数据的值,既使没有了修饰,也不会对行数据的值产生什么影响。
唯一的不利之处就是,在内存中会同时保存两个同样的工作表,这样当工作表体积比较大时,会占用相当大的内存,但现在好像内存的大小并不是什么关键因素了。
一旦获得了可写入的工作表对象,我们就可以对单元格对象进行更新的操作了,在这里我们不必调用API提供的add()方法,因为单元格已经于工作表当中,所以我们只需要调用相应的setXXX()方法,就可以完成更新的操作了。
尽单元格原有的格式化修饰是不能去掉的,我们还是可以将新的单元格修饰加上去,以使单元格的内容以不同的形式表现。
新生成的工作表对象是可写入的,我们除了更新原有的单元格外,还可以添加新的单元格到工作表中。
最后,不要忘记调用write()方法,将更新的内容写入到文件中,然后关闭工作薄对象,这里有两个工作薄对象要关闭,一个是只读的,另外一个是可写入的。
3 JXL读写excel文件的例子 (来自网络)3.1 实例一 import java.io.FileOutputStream; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import jxl.*; import jxl.format.Alignment; import jxl.format.Border; import jxl.format.BorderLineStyle; import jxl.format.CellFormat; import jxl.write.Boolean; import jxl.write.Label; import jxl.write.Number; import jxl.write.WritableCellFormat; import jxl.write.WritableFont; import jxl.write.WritableSheet; import jxl.write.WritableWorkbook; public class JXLExample { /** * * @author smart * */ public static void main(String[] args) { // 准备设置excel工作表的标题 String[] title = {"编号","产品名称","产品价格","产品数量","生产日期","产地","是否出口"}; try { // 获得开始时间 long start = System.currentTimeMillis(); // 输出的excel的路径 String filePath = "c:\\test.xls"; // 创建Excel工作薄 WritableWorkbook wwb; // 新建立一个jxl文件,即在C盘下生成test.xls OutputStream os = new FileOutputStream(filePath); wwb=Workbook.createWorkbook(os); // 添加第一个工作表并设置第一个Sheet的名字 WritableSheet sheet = wwb.createSheet("产品清单", 0); Label label; for(int i=0;i JXL,开发,Excel,文档,中文,教程,Excel,开发
ASp.NET开发之IsPostback的原理
秒杀的原理和开发思路?软件架构
发现性能的瓶颈更好的调优。
还会说说高阶的优化。
主要分享给大家针对互联网分布式的高并发项目怎么去调优,快速定位,快速解决。
主要说思路,明白了思路,如何去快速定位,快速解决。
常用的调优方案。
秒杀系统介绍 其实大家都经常在网上购物的,秒杀应该都知道套路吧。
所谓“秒杀”,就是网络卖家发布一些超低价格的商品,所有买家在同一时间网上抢购的一种销售方式。
特点-低价,少量库存,疯抢。
吸引大家来抢购,也不至于自己亏的太多。
博眼球。
高并发,大流量。
念得出名字的互联网公司基本都是高并发,大流量。
双十一秒杀系统实现介绍。
1.通过原有的下单增加三个变量完成,是否秒杀,开始时间,结束时间。
2.是否秒杀,是为了商品的展示。
如果是秒杀商品的特殊判断。
3.进入页面之前先进入controller获取一个当前的后台时间传递到前台,方便读秒。
4.前端js判断时间到达后进行下单,下单时传递时间跟后端时间进行对比,防止被高手修改时间强行下单。
5.对于库存是通过下单的时间来判断的,必须按照秒杀开始后的时间来进行判断,每次下单库存都需要进行判断,防止超卖。
sql上边的判断: update t_product set 库存=库存-1 and 商品id="ID号" and 库存>0;数据库防止绝对超卖。
6.忘了说了,必须判断登录,防止某个账号恶意刷接口。
压测 我砖都搬完了,自己点点没问题了,还压测个毛线啊,压测都是测试人员的事情,我开发任务都堆成山了。
1.老铁啊,老铁,压测其实很有必要,jmeter分分钟就压测了接口。
2.压测可以让自己不被坑,压测还可以发现bug。
3.压测可以让你的代码更健壮。
4.压测可以找到业务和功能的bug。
如果测试出来你的bug,可能罚钱,影响钱的问题。
了解几个技术点1.tps。
t代表英文的事务。
2.qps。
q代表查询。
QPS Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
TPS TransactionsPerSecond的缩写,也就是事务数/秒。
它是软件测试结果的测量单位。
一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。
客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。
PS:熟悉秒杀的原理,秒杀的开发思路,最好会用jmeter可以自己做做简单的压测。