1、Java操作Excel原帖地址:一POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象。它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。 二HSSF概况 HSSF 是Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”。也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃、正规的API。通过HSSF,你可以用纯
2、 Java代码来读取、写入、修改Excel文件。 HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。前者很好理解,后者比较抽象,但操作效率要高得多。 三开始编码 1 准备工作 要求:JDK 1.4+POI开发包 可以到 http:/www.apache.org/dyn/closer.cgi/jakarta/poi/ 最新的POI工具包 2 EXCEL 结构 HSSFWorkbook excell 文档对象介绍HSSFSheet excell的表单HSSFRow excell的行HSSFCell excell的格子单元HS
3、SFFont excell字体HSSFName 名称HSSFDataFormat 日期格式在 poi1.7中才有以下2项:HSSFHeader sheet头HSSFFooter sheet尾和这个样式HSSFCellStyle cell样式辅助操作包括HSSFDateUtil 日期HSSFPrintSetup 打印HSSFErrorConstants 错误信息表 3 具体用法实例 (采用 usermodel ) 如何读Excel 读取Excel文件时,首先生成一个POIFSFileSystem对象,由POIFSFileSystem对象构造一个 HSSFWorkbook,该HSSFWorkboo
4、k对象就代表了Excel文档。下面代码读取上面生成的Excel文件写入的消息字串: Java代码 POIFSFileSystemfs=newPOIFSFileSystem(newFileInputStream(d:test.xls); HSSFWorkbookwb=newHSSFWorkbook(fs); catch(IOExceptione) e.printStackTrace(); HSSFSheetsheet=wb.getSheetAt(0); HSSFRowrow=sheet.getRow(0); HSSFCellcell=row.getCell(short)0); Stringmsg
5、=cell.getStringCellValue(); 如何写excel, 将excel的第一个表单第一行的第一个单元格的值写成“a test”。 Java代码 POIFSFileSystemfs=newPOIFSFileSystem(newFileInputStream(workbook.xls); HSSFWorkbookwb=newHSSFWorkbook(fs); HSSFSheetsheet=wb.getSheetAt(0); HSSFRowrow=sheet.getRow(0); HSSFCellcell=row.getCell(short)0); cell.setCellValu
6、e(atest); /Writetheoutputtoafile FileOutputStreamfileOut=newFileOutputStream(workbook.xls); wb.write(fileOut); fileOut.close(); 4 可参考文档 POI 主页:http:/jakarta.apache.org/poi/ , 初学者如何快速上手使用POI HSSF http:/jakarta.apache.org/poi/hssf/quick-guide.html 。 代码例子 http:/blog.java- 里面有很多例子代码,可以很方便上手。 POI的中级应用 1、
7、遍历workbookJava代码 /load源文件 POIFSFileSystemfs=newPOIFSFileSystem(newFileInputStream(filePath); HSSFWorkbookwb=newHSSFWorkbook(fs); for(inti=0;iwb.getNumberOfSheets();i+) HSSFSheetsheet=wb.getSheetAt(i); for(inti=sheet.getFirstRowNum();isheet.getLastRowNum();i+) HSSFRowrow=sheet.getRow(i); if(row!=null
8、) 。操作 /目标文件 FileOutputStreamfos=newFileOutputStream(objectPath); /写文件 swb.write(fos); fos.close(); 2、得到列和单元格代码HSSFRow row = sheet.getRow(i); HSSFCell cell = row.getCell(short) j); 3、设置sheet名称和单元格内容为中文代码wb.setSheetName(n, 中文,HSSFCell.ENCODING_UTF_16); cell.setEncoding(short) 1); cell.setCellValue(中文)
9、; 4、单元格内容未公式或数值,可以这样读写代码cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); cell.getNumericCellValue() 5、设置列宽、行高代码sheet.setColumnWidth(short)column,(short)width); row.setHeight(short)height); 6、添加区域,合并单元格代码Region region = new Region(short)rowFrom,(short)columnFrom,(short)rowTo,(short)columnTo); sheet.addM
10、ergedRegion(region); /得到所有区域 sheet.getNumMergedRegions() 7、常用方法根据单元格不同属性返回字符串数值Java代码 publicStringgetCellStringValue(HSSFCellcell) StringcellValue=; switch(cell.getCellType() caseHSSFCell.CELL_TYPE_STRING: cellValue=cell.getStringCellValue(); if(cellValue.trim().equals()|cellValue.trim().length()=0)
11、 cellValue=; break; caseHSSFCell.CELL_TYPE_NUMERIC: cellValue=String.valueOf(cell.getNumericCellValue(); break; caseHSSFCell.CELL_TYPE_FORMULA: cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); cellValue=String.valueOf(cell.getNumericCellValue(); break; caseHSSFCell.CELL_TYPE_BLANK: cellValue=; break; c
12、aseHSSFCell.CELL_TYPE_BOOLEAN: break; caseHSSFCell.CELL_TYPE_ERROR: break; default: break; returncellValue; 8、常用单元格边框格式 虚线HSSFCellStyle.BORDER_DOTTED实线 HSSFCellStyle.BORDER_THIN代码Java代码 publicstaticHSSFCellStylegetCellStyle(shorttype) HSSFWorkbookwb=newHSSFWorkbook(); HSSFCellStylestyle=wb.createCel
13、lStyle(); style.setBorderBottom(type);/下边框 style.setBorderLeft(type);/左边框 style.setBorderRight(type);/右边框 style.setBorderTop(type);/上边框 returnstyle; 9、设置字体和内容位置 Java代码 HSSFFontf=wb.createFont(); f.setFontHeightInPoints(short)11);/字号 f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);/加粗 style.setFont(f); s
14、tyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);/左右居中 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);/上下居中 style.setRotation(shortrotation);/单元格内容的旋转的角度 HSSFDataFormatdf=wb.createDataFormat(); style1.setDataFormat(df.getFormat(0.00%);/设置单元格数据格式 cell.setCellFormula(string);/给单元格设公式 style.set
15、Rotation(shortrotation);/单元格内容的旋转的角度 cell.setCellStyle(style);10、插入图片论坛里看到的 Java代码 /先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray ByteArrayOutputStreambyteArrayOut=newByteArrayOutputStream(); BufferedImagebufferImg=ImageIO.read(newFile(ok.jpg); ImageIO.write(bufferImg,jpg,byteArrayOut); /读进一个exce
16、l模版 FileInputStreamfos=newFileInputStream(filePathName+/stencil.xlt); fs=newPOIFSFileSystem(fos); /创建一个工作薄 HSSFWorkbookwb=newHSSFWorkbook(fs); HSSFSheetsheet=wb.getSheetAt(0); HSSFPatriarchpatriarch=sheet.createDrawingPatriarch(); HSSFClientAnchoranchor=newHSSFClientAnchor(0,0,1023,255,(short)0,0,(s
17、hort)10,10); patriarch.createPicture(anchor,wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG);11、设置列自动换行 HSSFCellStyle cellStyle = workbook.createCellStyle(); cellStyle.setWrapText(true); sheet.setDefaultColumnStyle(short)0, cellStyle); 设置列的宽度 sheet.setColumnWidth(short)0,(sho
18、rt)9000); sheet.setDefaultColumnStyle(short)0, cellStyle); 与 sheet.setDefaultColumnWidth(short)70);冲突 只会换行 不会设置列宽 单元格拷贝示例: Java代码 packagetestpoi; importjava.io.FileInputStream; importjava.io.FileNotFoundException; importjava.io.FileOutputStream; importjava.io.IOException; importorg.apache.poi.hssf.u
19、sermodel.HSSFCell; importorg.apache.poi.hssf.usermodel.HSSFRow; importorg.apache.poi.hssf.usermodel.HSSFSheet; importorg.apache.poi.hssf.usermodel.HSSFWorkbook; importorg.apache.poi.hssf.util.Region; importorg.apache.poi.poifs.filesystem.POIFSFileSystem; /* *将某SHEET页中的某几行复制到某SHEET页的某几行中。抱括被合并了的单元格。
20、*/publicclassRowCopy /* *paramargs *throwsIOException *throwsFileNotFoundException */SuppressWarnings(deprecation) publicstaticvoidmain(Stringargs) try POIFSFileSystemfs=newPOIFSFileSystem(newFileInputStream( d:exlsample.xls); HSSFWorkbookwb=newHSSFWorkbook(fs); /source为源sheet页,target为目标sheet页 copyR
21、ows(wb,source,target,5,6,20); FileOutputStreamfileOut=newFileOutputStream(d:exlsample.xls); wb.write(fileOut); fileOut.flush(); fileOut.close(); System.out.println(Operationfinished); catch(Exceptione) e.printStackTrace(); /* *paramwbHSSFWorkbook *parampSourceSheetName源sheet页名称 *parampTargetSheetNam
22、e目标sheet页名称 *parampStartRow源sheet页中的起始行 *parampEndRow源sheet页中的结束行 *parampPosition目标sheet页中的开始行 */publicstaticvoidcopyRows(HSSFWorkbookwb,StringpSourceSheetName, StringpTargetSheetName,intintStartRow,intintEndRow,intintPosition) /EXECL中的行是从1开始的,而POI中是从0开始的,所以这里要减1. intpStartRow=intStartRow-1; intpEnd
23、Row=intEndRow-1; intpPosition=intPosition-1; HSSFRowsourceRow=null; HSSFRowtargetRow=null; HSSFCellsourceCell=null; HSSFCelltargetCell=null; HSSFSheetsourceSheet=null; HSSFSheettargetSheet=null; Regionregion=null; intcType; inti; intj; inttargetRowFrom; inttargetRowTo; if(pStartRow=-1)|(pEndRow=-1) return; sourceSheet=wb.getSheet(pSourceSheetName); targetSheet=wb.getSheet(pTargetSheetName); System.out.println(sourceSheet.getNumMergedRegions(); /拷贝合并的单元格 for(i=0;i=pStartRow) &(region.getRowTo()=pEndRow) targetRowFrom=region.getRowFrom()-pStartRow+pPosition; targetRo
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1