《java的POI操作Excel文件.pdf》由会员分享,可在线阅读,更多相关《java的POI操作Excel文件.pdf(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、java 的 POI 操作 Excel 文件(2)现在我要做的东西基本完成啦,我把这段时间使用POI 的一些心得总结出来,希望能对和我遇到相同问题的朋友有所帮助,至于POI 基本的使用方法,自己去看文档吧。1、设置分页符的bug POI 里的 HSSFSheet 类提供了 setRowBreak 方法可以设置Sheet的分页符。Bug:如果你要设置分页符的Sheet 是本来就有的,并且你没有在里面插入过分页符,那么调用 setRowBreak 时 POI 会抛出空指针的异常。解决方法:在Excel 里给这个sheet插入一个分页符,用POI 打开后再把它删掉,然后你就可以随意插入分页符了。如果
2、sheet 是由POI 生成的则没有这个问题。我跟踪了setRowBreak 的源代码,发现是Sheet.Java下的 PageBreakRecord rowBreaks 这个变量在搞鬼,如果 Sheet里原来没有分页符,开发这个模块的那位兄台忘了为这个对象new 实例,所以只能我们先手工给Excel 插入一个分页符来触发POI 为 rowBreaks 创建实例。2、如何拷贝行我在 gmane.org 的 POI 用户论坛翻遍了每个相关的帖子,找遍了api,也没看到一个拷贝行的方法,没办法,只能自己写:/注:this.fWorkbook 是一个 HSSHWorkbook,请自行在外部new p
3、ublic void copyRows(String pSourceSheetName,String pTargetSheetName,int pStartRow,int pEndRow,int pPosition)HSSFRow sourceRow=null;HSSFRow targetRow=null;HSSFCell sourceCell=null;HSSFCell targetCell=null;HSSFSheet sourceSheet=null;HSSFSheet targetSheet=null;Region region=null;int cType;int i;short j
4、;int targetRowFrom;int targetRowTo;if(pStartRow=-1)|(pEndRow=-1)return;sourceSheet=this.fWorkbook.getSheet(pSourceSheetName);targetSheet=this.fWorkbook.getSheet(pTargetSheetName);/拷贝合并的单元格for(i=0;i=pStartRow)&(region.getRowTo()=pEndRow)targetRowFrom=region.getRowFrom()-pStartRow+pPosition;targetRowT
5、o=region.getRowTo()-pStartRow+pPosition;region.setRowFrom(targetRowFrom);region.setRowTo(targetRowTo);targetSheet.addMergedRegion(region);/设置列宽for(i=pStartRow;i=pEndRow;i+)sourceRow=sourceSheet.getRow(i);if(sourceRow!=null)for(j=sourceRow.getFirstCellNum();j sourceRow.getLastCellNum();j+)targetSheet
6、.setColumnWidth(j,sourceSheet.getColumnWidth(j);break;/拷贝行并填充数据for(;i=pEndRow;i+)sourceRow=sourceSheet.getRow(i);if(sourceRow=null)continue;targetRow=targetSheet.createRow(i-pStartRow+pPosition);targetRow.setHeight(sourceRow.getHeight();for(j=sourceRow.getFirstCellNum();j=0)result.append(pPOIFormula
7、.substring(0,index);result.append(pPOIFormula.substring(index+cstReplaceString.length();else result.append(pPOIFormula);return result.toString();至于为什么会出现ATTR(semiVolatile),还需要大家的探索精神!4、向 Excel 写入图片的问题。我上 POI 论坛查相关帖子,得到两种结论:1、不支持写入图片;2、支持写入图片,通过EscherGraphics2d 这个 Class 实现。于是我就去查EscherGraphics2d这个 Cl
8、ass,发现这个Class 提供了 N 个 drawImage 方法,喜出望外的我开始写代码,结果调了一天,一直看不到效果,黔驴技穷的我在万般无奈下只好跟踪进drawImage 这个函数内部,经过 N 个函数调用后在最底层函数发现了最终答案:public boolean drawImage(Image image,int dx1,int dy1,int dx2,int dy2,int sx1,int sy1,int sx2,int sy2,Color bgColor,ImageObserver imageobserver)if(logger.check(POILogger.WARN)logge
9、r.log(POILogger.WARN,drawImage()not supported);return true;所以我强烈建议大家,以后使用第三方开发包一定尽量下载它的源代码,这样你在碰到问题时,看看它的的内部是怎么实现的,很多时候就可以不必重蹈我的覆辙了。既然POI 不能写入图片,那我们只能把目光投向JXL,我用JXL 写入图片功能是实现了,付出的代价是now()和 today()这些函数丢失掉了,鱼与熊掌不能兼得吧。=jsp操作=response.setHeader(Content-disposition,inline;filename=test1.xls);/以上这行设定传送到前端
10、浏览器时的档名为test1.xls/就是靠这一行,让前端浏览器以为接收到一个excel 档下面正常显示要转化的表-介绍:Jakarta_POI 使用 Java读写 Excel(97-2002)文件,可以满足大部分的需要。因为刚好有一个项目使用到了这个工具,花了点时间顺便翻译了一下POI 本身带的一个 Guide.有一些节减和修改,希望给使用这个项目的人一些入门帮助。POI 下面有几个自项目:HSSF 用来实现Excel 的读写.以下是 HSSF 的主页http:/jakarta.apache.org/poi/hssf/index.html 下面的介绍是基于以下地址的翻译:http:/jakar
11、ta.apache.org/poi/hssf/quick-guide.html 目前的版本为1.51 应该是很长时间之内的一个稳定版,但HSSF 提供的 Sample 不是基于1.51 所写,所以使用的时候需要适当的注意.其实 POI 下面的几个子项目侧重不同读写Word 的 HDF 正在开发当中.XML 下的 FOP(http:/xml.apache.org/fop/index.html)可以输出pdf 文件,也是比较好的一个工具目录:创建一个workbook 创建一个sheet 创建 cells 创建日期cells 设定单元格格式说明:以下可能需要使用到如下的类import org.apa
12、che.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFCellStyle;import org.apache.poi.hssf.usermodel.HSSFDataFormat;import org.apache.poi.hssf.usermodel.HSSFFont;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.
13、usermodel.HSSFWorkbook;import org.apache.poi.hssf.util.HSSFColor;创建 workbook HSSFWorkbook wb=new HSSFWorkbook();/使用默认的构造方法创建workbook FileOutputStream fileOut=new FileOutputStream(workbook.xls);/指定文件名wb.write(fileOut);/输出到文件fileOut.close();创建一个sheet HSSFWorkbook wb=new HSSFWorkbook();HSSFSheet sheet1
14、=wb.createSheet(new sheet);/workbook 创建 sheet HSSFSheet sheet2=wb.createSheet(second sheet);/workbook 创建另外的sheet FileOutputStream fileOut=new FileOutputStream(workbook.xls);wb.write(fileOut);fileOut.close();创建 cells HSSFWorkbook wb=new HSSFWorkbook();HSSFSheet sheet=wb.createSheet(new sheet);/注意以下的代
15、码很多方法的参数是short 而不是 int 所以需要做一次类型转换HSSFRow row=sheet.createRow(short)0);/sheet 创建一行HSSFCell cell=row.createCell(short)0);/行创建一个单元格cell.setCellValue(1);/设定单元格的值/值的类型参数有多中double,String,boolean,row.createCell(short)1).setCellValue(1.2);row.createCell(short)2).setCellValue(This is a string);row.createCel
16、l(short)3).setCellValue(true);/Write the output to a file FileOutputStream fileOut=new FileOutputStream(workbook.xls);wb.write(fileOut);fileOut.close();-文章出处:http:/ 创建日期cells HSSFWorkbook wb=new HSSFWorkbook();HSSFSheet sheet=wb.createSheet(new sheet);HSSFRow row=sheet.createRow(short)0);HSSFCell ce
17、ll=row.createCell(short)0);/设定值为日期cell.setCellValue(new Date();HSSFCellStyle cellStyle=wb.createCellStyle();/指定日期显示格式cellStyle.setDataFormat(HSSFDataFormat.getFormat(m/d/yy h:mm);cell=row.createCell(short)1);cell.setCellValue(new Date();/设定单元格日期显示格式cell.setCellStyle(cellStyle);FileOutputStream fileO
18、ut=new FileOutputStream(workbook.xls);wb.write(fileOut);fileOut.close();设定单元格格式单元格格式的设定有很多形式包括单元格的对齐方式,内容的字体设置,单元格的背景色等,因为形式比较多,只举一些例子.以下的例子在POI1.5 中可能会有所改变具体查看API./Aqua background HSSFCellStyle style=wb.createCellStyle();/创建一个样式style.setFillBackgroundColor(HSSFCellStyle.AQUA);/设定此样式的的背景颜色填充style.se
19、tFillPattern(HSSFCellStyle.BIG_SPOTS);/样式的填充类型。/有多种式样如:/HSSFCellStyle.BIG_SPOTS/HSSFCellStyle.FINE_DOTS/HSSFCellStyle.SPARSE_DOTS 等style.setAlignment(HSSFCellStyle.ALIGN_CENTER);/居中对齐style.setFillBackgroundColor(HSSFColor.GREEN.index);/设定单元个背景颜色style.setFillForegroundColor(HSSFColor.RED.index);/设置单元
20、格显示颜色HSSFCell cell=row.createCell(short)1);cell.setCellValue(X);cell.setCellStyle(style);-加上 response.setContentType(Application/msexcel);response.setHeader(Content-disposition,attachment;filename=book.xls);然后提交给它的时候会时候会提示下载,下载的就是生成的EXCEL 文件。-有趣的是,对一个html 文件(数据在表格中),当把后缀改为xls 后,打开文件即是。-加上 response.s
21、etContentType(Application/msexcel);response.setHeader(Content-disposition,attachment;filename=book.xls);然后提交给它的时候会时候会提示下载,下载的就是生成的EXCEL 文件。book.xls 的存放路径应该是哪里?-使用 poi 的 hssf 生成一个excel 文件以后有一个主类Workbook(相当于一个excel 文件)的方法Workbook.write(OutputStream)可以写到response.getOutputStream()里面如果事先设置response的 conte
22、ntType 为 excel 和下载的附件名称就可下载excel HSSFWorkbook book=_proxy.expertExcel(_formBean,_login);if(book!=null)response.setContentType(application/ms-excel);response.setHeader(Content-Disposition,attachment;filename=+new String(导出Excel.xls.getBytes(),iso-8859-1);book.write(response.getOutputStream();其中 exper
23、tExcel 无非是从数据库或者其他地方获取数据创建excel 即可.-response.setHeader(Content-disposition,attachment;filename=book.xls);原来加上attachment 浏览器就会提示保存或者打开,是我想要的。Thanks all.-1.用 poi 生成 Excel 文件,和 WORD 文档都可以,是个不错的方法,参见 poi 网站,楼上的朋友描述的很清楚了,此方法适用于生成,读取,解析 xls 文件2.另外一种更简单的方法:只适用于显示用的EXCEL 文件格式,生成常规的html 文件格式,后缀命名方式为.xls 即可.3
24、.espreadsheet适用于网上即时的excel 文件交互操作,生成,解析,保存修改,但需要购买-生成一个rtf 文件,然后扩展名写.doc,OK-用这个组件向excel 写数据时,总是出现中文乱码情况,请问怎样解决?源代码:HSSFWorkbook wb=new HSSFWorkbook();HSSFSheet sheet=wb.createSheet(new sheet);HSSFHeader header=sheet.getHeader();header.setCenter(Center Header);HSSFRow row=sheet.createRow(short)0);HSS
25、FCell cell=row.createCell(short)0);cell.setCellValue(1);row.createCell(short)1).setCellValue(1.2123654);row.createCell(short)2).setCellValue(This is a string);row.createCell(short)3).setCellValue(true);row=sheet.createRow(short)1);cell=row.createCell(short)0);cell.setCellValue(new Date();row.createC
26、ell(short)1).setCellValue(str);row.createCell(short)2).setCellValue(This我是一个好人string);FileOutputStream fileOut=new FileOutputStream(d:/filename.xls);wb.write(fileOut);fileOut.close();当我打开这个 d:/filename.xls 文件时,其中写入的中文全都是乱码!如何解决?-源代码:HSSFWorkbook wb=new HSSFWorkbook();HSSFSheet sheet=wb.createSheet(n
27、ew sheet);HSSFHeader header=sheet.getHeader();header.setCenter(Center Header);HSSFRow row=sheet.createRow(short)0);HSSFCell cell=row.createCell(short)0);cell.setCellValue(1);row.createCell(short)1).setCellValue(1.2123654);row.createCell(short)2).setCellValue(This is a string);row.createCell(short)3)
28、.setCellValue(true);row=sheet.createRow(short)1);cell=row.createCell(short)0);cell.setCellValue(new Date();String str=new String(我是一个好人!);row.createCell(short)1).setCellValue(str);row.createCell(short)2).setCellValue(This我是一个好人string);FileOutputStream fileOut=new FileOutputStream(d:/filename.xls);wb
29、.write(fileOut);fileOut.close();当我打开“d:/filename.xls”文件察看时,里面的中文字符全部是乱码!请问如何解决?-response.setHeader(Content-disposition,inline;filename=*.xls);就可以了,要是想要word 就 response.setHeader(Content-disposition,inline;filename=test1.xls);-引用pengruihua 说:有趣的是,对一个html 文件(数据在表格中),当把后缀改为xls 后,打开文件即是。这个只能说明excel 强,这样写
30、得xls,在 JXL 或者 POI 中都是不认的。加一句,用POI 写 Excel 有点问题,当反复读写一个excel 文件的时候,读的速度会越来越慢。我的一个生成excel 的就是,到了几千条记录的时候慢得就不能接受了,最后只好先生成cvs的文本,再将文本导成xls 文件-引用java_century 说:源代码:HSSFWorkbook wb=new HSSFWorkbook();HSSFSheet sheet=wb.createSheet(new sheet);HSSFHeader header=sheet.getHeader();header.setCenter(Center Head
31、er);HSSFRow row=sheet.createRow(short)0);HSSFCell cell=row.createCell(short)0);cell.setCellValue(1);row.createCell(short)1).setCellValue(1.2123654);row.createCell(short)2).setCellValue(This is a string);row.createCell(short)3).setCellValue(true);row=sheet.createRow(short)1)-文章出处:http:/ Date();String
32、 str=new String(我是一个好人!);row.createCell(short)1).setCellValue(str);row.createCell(short)2).setCellValue(This我是一个好人string);FileOutputStream fileOut=new FileOutputStream(d:/filename.xls);wb.write(fileOut);fileOut.close();当我打开“d:/filename.xls”文件察看时,里面的中文字符全部是乱码!请问如何解决?使用 POI 这样处理中文HSSFCell cell=row.createCell(short)1);cell.setEncoding(HSSFCell.ENCODING_UTF_16);cell.setCellValue(中文);