




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
java的POI操作Excel文件(2)现在我要做的东西基本完成啦,我把这段时间使用POI的一些心得总结出来,希望能对和我遇到相同问题的朋友有所帮助,至于POI基本的使用方法,自己去看文档吧。1、设置分页符的bugPOI里的HSSFSheet类提供了setRowBreak方法可以设置Sheet的分页符。Bug:如果你要设置分页符的Sheet是本来就有的,并且你没有在里面插入过分页符,那么调用setRowBreak时POI会抛出空指针的异常。解决方法:在Excel里给这个sheet插入一个分页符,用POI打开后再把它删掉,然后你就可以随意插入分页符了。如果sheet是由POI生成的则没有这个问题。我跟踪了setRowBreak的源代码,发现是Sheet.Java下的PageBreakRecord rowBreaks这个变量在搞鬼,如果Sheet里原来没有分页符,开发这个模块的那位兄台忘了为这个对象new实例,所以只能我们先手工给Excel插入一个分页符来触发POI为rowBreaks创建实例。2、如何拷贝行我在的POI用户论坛翻遍了每个相关的帖子,找遍了api,也没看到一个拷贝行的方法,没办法,只能自己写:/注:this.fWorkbook是一个HSSHWorkbook,请自行在外部new public 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; 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; targetRowTo = 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.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.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这个Class,发现这个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 ) logger.log(POILogger.WARN,drawImage() not supported); return true; 所以我强烈建议大家,以后使用第三方开发包一定尽量下载它的源代码,这样你在碰到问题时,看看它的的内部是怎么实现的,很多时候就可以不必重蹈我的覆辙了。既然POI不能写入图片,那我们只能把目光投向JXL,我用JXL写入图片功能是实现了,付出的代价是now()和today()这些函数丢失掉了,鱼与熊掌不能兼得吧。=jsp操作=response.setHeader(Content-disposition,inline; filename=test1.xls); /以上这行设定传送到前端浏览器时的档名为test1.xls /就是靠这一行,让前端浏览器以为接收到一个excel档下面正常显示要转化的表-介绍:Jakarta_POI 使用Java读写Excel(97-2002)文件,可以满足大部分的需要。因为刚好有一个项目使用到了这个工具,花了点时间顺便翻译了一下POI本身带的一个Guide.有一些节减和修改,希望给使用这个项目的人一些入门帮助。POI 下面有几个自项目:HSSF用来实现Excel 的读写.以下是HSSF的主页/poi/hssf/index.html下面的介绍是基于以下地址的翻译:/poi/hssf/quick-guide.html目前的版本为1.51应该是很长时间之内的一个稳定版,但HSSF提供的Sample不是基于1.51所写,所以使用的时候需要适当的注意.其实POI下面的几个子项目侧重不同读写 Word 的HDF正在开发当中.XML下的FOP(/fop/index.html)可以输出pdf文件,也是比较好的一个工具目录:创建一个workbook创建一个sheet创建cells创建日期cells设定单元格格式说明:以下可能需要使用到如下的类import org.apache.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.usermodel.HSSFWorkbook;import org.apache.poi.hssf.util.HSSFColor;创建workbookHSSFWorkbook wb = new HSSFWorkbook();/使用默认的构造方法创建workbookFileOutputStream fileOut = new FileOutputStream(workbook.xls);/指定文件名wb.write(fileOut);/输出到文件fileOut.close();创建一个sheetHSSFWorkbook wb = new HSSFWorkbook();HSSFSheet sheet1 = wb.createSheet(new sheet);/workbook创建sheetHSSFSheet sheet2 = wb.createSheet(second sheet);/workbook创建另外的sheetFileOutputStream fileOut = new FileOutputStream(workbook.xls);wb.write(fileOut);fileOut.close();创建cellsHSSFWorkbook wb = new HSSFWorkbook();HSSFSheet sheet = wb.createSheet(new sheet);/注意以下的代码很多方法的参数是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.createCell(short)3).setCellValue(true);/ Write the output to a fileFileOutputStream fileOut = new FileOutputStream(workbook.xls);wb.write(fileOut);fileOut.close();-文章出处:/course/3_program/java/javajs/2008910/141622_2.html创建日期cellsHSSFWorkbook wb = new HSSFWorkbook();HSSFSheet sheet = wb.createSheet(new sheet);HSSFRow row = sheet.createRow(short)0);HSSFCell cell = 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 fileOut = new FileOutputStream(workbook.xls);wb.write(fileOut);fileOut.close();设定单元格格式单元格格式的设定有很多形式包括单元格的对齐方式,内容的字体设置,单元格的背景色等,因为形式比较多,只举一些例子.以下的例子在POI1.5中可能会有所改变具体查看API./ Aqua backgroundHSSFCellStyle style = wb.createCellStyle();/创建一个样式style.setFillBackgroundColor(HSSFCellStyle.AQUA);/设定此样式的的背景颜色填充style.setFillPattern(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);/设置单元格显示颜色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.setContentType(Application/msexcel); response.setHeader(Content-disposition,attachment; filename=book.xls );然后提交给它的时候会时候会提示下载,下载的就是生成的EXCEL文件。book.xls的存放路径应该是哪里?-使用poi的hssf生成一个excel文件以后有一个主类Workbook(相当于一个excel文件)的方法Workbook.write(OutputStream)可以写到response.getOutputStream()里面如果事先设置response的contentType为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();其中expertExcel无非是从数据库或者其他地方获取数据创建excel即可.-response.setHeader(Content-disposition,attachment; filename=book.xls );原来加上attachment浏览器就会提示保存或者打开,是我想要的。Thanks all.-1.用poi生成Excel文件,和WORD文档都可以,是个不错的方法,参见poi网站,楼上的朋友描述的很清楚了,此方法适用于生成,读取,解析xls文件2.另外一种更简单的方法:只适用于显示用的EXCEL文件格式,生成常规的html文件格式,后缀命名方式为.xls即可.3.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); 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); cell = row.createCell(short)0); cell.setCellValue(new Date(); 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文件时,其中写入的中文全都是乱码!如何解决?-源代码: HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(new 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).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.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强,这样写得xls,在JXL或者POI中都是不认的。加一句,用POI写Excel有点问题,当反复读写一个excel文件的时候,读的速度会越来越慢。我的一个生成excel的就是,到了几千条记录的时候慢得就不能接受了,最后只好先生成cvs的文本,再将文本导成
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建设部建筑设计协议书
- 可爱的小鸟150字(12篇)
- 名著导读:高一语文阅读理解教案
- 时间像小马车节奏课件
- 人教版四年级上册第二单元《公顷和平方千米》单元检测卷(含答案)
- 纪检业务知识培训课件前言
- 早教课程示范课完整课件
- 农民专业合作社种植联产合同
- 2025年日语J.TEST考试A-D级模拟试卷
- 初识化学实验探究课教案
- 烧山谅解协议书
- 城市地下管网施工质量、安全、进度和文明施工保证措施
- 全工程咨询管理办法
- 2025-2030中国重水市场运行态势与未来竞争力剖析报告
- 企业职工感恩教育
- 2025至2030全球及中国计算流体动力学(CFD)模拟工具行业发展趋势分析与未来投资战略咨询研究报告
- GB 17051-2025二次供水设施卫生规范
- 山西线上红娘培训课件
- 临沧市市级机关遴选真题2024
- 【物化生 高考西北卷】2025年高考招生考试真题物理+化学+生物试卷(适用陕西、山西、青海、宁夏四省)
- 2025年普通高等学校招生全国统一考试数学试题(天津卷)含答案
评论
0/150
提交评论