POI组件操作Excel-制作报表(一).doc_第1页
POI组件操作Excel-制作报表(一).doc_第2页
POI组件操作Excel-制作报表(一).doc_第3页
POI组件操作Excel-制作报表(一).doc_第4页
POI组件操作Excel-制作报表(一).doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Apache POI组件操作Excel,制作报表(一)ExcelApacheOfficeBeanJ# Apache的POI组件是Java操作Microsoft Office办公套件的强大API,其中对Word,Excel和PowperPoint都有支持,当然使用较多的还是Excel,因为Word和PowerPoint用程序动态操作的应用较少。那么本文就结合POI来介绍一下操作Excel的方法。 Office 2007的文件结构完全不同于2003,所以对于两个版本的Office组件,POI有不同的处理API,分开使用即可。首先来说几个Excel的基本概念。对于一个Excel文件,这称为一个工作簿(Workbook),打开Excel之后,在下方会有sheet1/2/3这样的选项卡,点击可以切换到不同的sheet中,这个sheet称作工作表。每个工作表就是我们编辑的区域,这是一张二维表,阿拉伯数字控制行数,从1开始,而程序中还是0,类似数组和集合。字母控制列数,从A开始,Z以后是两个字母控制。对于每一行,我们称为Row,列就是Column,行列可以确定唯一的一个元素,那么就是单元格,称为Cell。 POI组件可以方便的操纵这些元素,但初次接触POI可能会有畏惧心理,因为要对每个单元格进行设置,那么不管是用数组还是集合,从工作簿,工作表,行下来的代码量都不会小,这是不能避免的,但是按照这个处理顺序走,就一定可以得到结果。 有了这些基础的概念之后,我们就可以操作Excel了。先来看一下所需的依赖,因为涉及到2007,就要额外加一些依赖。 下面从读取Excel开始,首先建立一个Excel 2003以下版本的xls文件。设定几列来看。来存储学生信息的Excel表如下: 这里的姓名,性别和班级是文本值,而年龄和成绩是数字值,这在设计对象和处理时要注意区分。那么可以如下设计这个对象:Java代码1. packageorg.ourpioneer.excel.bean;2. /*3. *学生信息4. *5. *authorNanlei6. *7. */8. publicclassStudent9. privateStringname;10. privateStringgender;11. privateintage;12. privateStringsclass;13. privateintscore;14. publicStudent()15. super();16. 17. publicStudent(Stringname,Stringgender,intage,Stringsclass,intscore)18. super();19. =name;20. this.gender=gender;21. this.age=age;22. this.sclass=sclass;23. this.score=score;24. 25. /省略了getter和setter方法26. Override27. publicStringtoString()28. returnStudentage=+age+,gender=+gender+,name=+name29. +,sclass=+sclass+,score=+score+;30. 31. 提供一个有参数的构造方法,用于生成对象写入Excel文档。这个对象就能刻画Excel文件中的数据了,下面就是写程序将Excel文件加载并处理,然后将内容读出,读取顺序是工作簿-工作表-行-单元格。这样一分析就很简单了。我们定义两个Excel文件,内容相同,只是版本不同,分2003和2007来处理。 创建工作簿时可以接收一个输入流对象,那么输入流对象可以从文件对象来生成,这样就可以继续进行了。取出工作表,取出行,遍历单元格,数据就拿到了。代码如下:Java代码1. packageorg.ourpioneer.excel;2. importjava.io.File;3. importjava.io.FileInputStream;4. importjava.io.IOException;5. importjava.io.InputStream;6. importjava.util.ArrayList;7. importjava.util.List;8. importorg.apache.poi.hssf.usermodel.HSSFCell;9. importorg.apache.poi.hssf.usermodel.HSSFRow;10. importorg.apache.poi.hssf.usermodel.HSSFSheet;11. importorg.apache.poi.hssf.usermodel.HSSFWorkbook;12. importorg.ourpioneer.excel.bean.Student;13. /*14. *POI读取Excel示例,分2003和200715. *16. *authorNanlei17. *18. */19. publicclassReadExcel20. privatestaticStringxls2003=C:student.xls;21. privatestaticStringxlsx2007=C:student.xlsx;22. /*23. *读取Excel2003的示例方法24. *25. *paramfilePath26. *return27. */28. privatestaticListreadFromXLS2003(StringfilePath)29. FileexcelFile=null;/Excel文件对象30. InputStreamis=null;/输入流对象31. StringcellStr=null;/单元格,最终按字符串处理32. ListstudentList=newArrayList();/返回封装数据的List33. Studentstudent=null;/每一个学生信息对象34. try35. excelFile=newFile(filePath);36. is=newFileInputStream(excelFile);/获取文件输入流37. HSSFWorkbookworkbook2003=newHSSFWorkbook(is);/创建Excel2003文件对象38. HSSFSheetsheet=workbook2003.getSheetAt(0);/取出第一个工作表,索引是039. /开始循环遍历行,表头不处理,从1开始40. for(inti=1;i=sheet.getLastRowNum();i+)41. student=newStudent();/实例化Student对象42. HSSFRowrow=sheet.getRow(i);/获取行对象43. if(row=null)/如果为空,不处理44. continue;45. 46. /循环遍历单元格47. for(intj=0;jrow.getLastCellNum();j+)48. HSSFCellcell=row.getCell(j);/获取单元格对象49. if(cell=null)/单元格为空设置cellStr为空串50. cellStr=;51. elseif(cell.getCellType()=HSSFCell.CELL_TYPE_BOOLEAN)/对布尔值的处理52. cellStr=String.valueOf(cell.getBooleanCellValue();53. elseif(cell.getCellType()=HSSFCell.CELL_TYPE_NUMERIC)/对数字值的处理54. cellStr=cell.getNumericCellValue()+;55. else/其余按照字符串处理56. cellStr=cell.getStringCellValue();57. 58. /下面按照数据出现位置封装到bean中59. if(j=0)60. student.setName(cellStr);61. elseif(j=1)62. student.setGender(cellStr);63. elseif(j=2)64. student.setAge(newDouble(cellStr).intValue();65. elseif(j=3)66. student.setSclass(cellStr);67. else68. student.setScore(newDouble(cellStr).intValue();69. 70. 71. studentList.add(student);/数据装入List72. 73. catch(IOExceptione)74. e.printStackTrace();75. finally/关闭文件流76. if(is!=null)77. try78. is.close();79. catch(IOExceptione)80. e.printStackTrace();81. 82. 83. 84. returnstudentList;85. 86. /*87. *主函数88. *89. *paramargs90. */91. publicstaticvoidmain(Stringargs)92. longstart=System.currentTimeMillis();93. Listlist=readFromXLS2003(xls2003);94. for(Studentstudent:list)95. System.out.println(student);96. 97. longend=System.currentTimeMillis();98. System.out.println(end-start)+msdone!);99. 100. 做几点说明,如果不处理表头,那么就从准备处理的行开始,而整个sheet对行的索引是从0开始的,而Excel中是1,这点和数组/集合类似。对于单元格中的数字,默认按double类型处理,所以只能字符串转double,再取出int值。最后执行主函数,得到如下内容: 这样就拿到对象的List了,之后要持久到数据库或者直接做业务逻辑就随心所欲了。下面来看2007的处理,处理流程和2003是类似的,区别就是使用的对象,2003中对象是HSSF*格式的,而2007是XSSF*格式的。方法如下:Java代码1. publicstaticListreadFromXLSX2007(StringfilePath)2. FileexcelFile=null;/Excel文件对象3. InputStreamis=null;/输入流对象4. StringcellStr=null;/单元格,最终按字符串处理5. ListstudentList=newArrayList();/返回封装数据的List6. Studentstudent=null;/每一个学生信息对象7. try8. excelFile=newFile(filePath);9. is=newFileInputStream(excelFile);/获取文件输入流10. XSSFWorkbookworkbook2007=newXSSFWorkbook(is);/创建Excel2003文件对象11. XSSFSheetsheet=workbook2007.getSheetAt(0);/取出第一个工作表,索引是012. /开始循环遍历行,表头不处理,从1开始13. for(inti=1;i=sheet.getLastRowNum();i+)14. student=newStudent();/实例化Student对象15. XSSFRowrow=sheet.getRow(i);/获取行对象16. if(row=null)/如果为空,不处理17. continue;18. 19. /循环遍历单元格20. for(intj=0;jrow.getLastCellNum();j+)21. XSSFCellcell=row.getCell(j);/获取单元格对象22. if(cell=null)/单元格为空设置cellStr为空串23. cellStr=;24. elseif(cell.getCellType()=HSSFCell.CELL_TYPE_BOOLEAN)/对布尔值的处理25. cellStr=String.valueOf(cell.getBooleanCellValue();26. elseif(cell.getCellType()=HSSFCell.CELL_TYPE_NUMERIC)/对数字值的处理27. cellStr=cell.getNumericCellValue()+;28. else/其余按照字符串处理29. cellStr=cell.getStringCellValue();30. 31. /下面按照数据出现位置封装到bean中32. if(j=0)33. student.setName(cellStr);34. elseif(j=1)35. student.setGender(cellStr);36. elseif(j=2)37. student.setAge(newDouble(cellStr).intValue();38. elseif(j=3)39. student.setSclass(cellStr);40. else41. student.setScore(newDouble(cellStr).intValue();42. 43. 44. studentList.add(student);/数据装入List45. 46. catch(IOExceptione)47. e.printStackTrace();48. finally/关闭文件流49. if(is!=null)50. try51. is.close();52. catch(IOExceptione)53. e.printStackTrace();54. 55. 56. 57. returnstudentList;58. 再次运行主函数,我们得到如下输出: 可以看出,对2007的处理时间明显增长,还是2003版本效率更好,不过在使用Office组件时2007更便捷,而处理2003的程序效率更好。如何使用二者?根据程序业务来综合决定,看看牺牲掉哪部分。 下面来做简单的文件写入,也就是准备输入写入Excel文件,为了演示,直接创建对象,而实际应用中数据可以是来自数据库的。写入文件就是文件解析的逆过程。但POI的组件不是从单元格开始创建文件的,还是从工作簿开始创建,进而创建工作表,行和单元格,最终将整个工作簿写入文件,完成操作。我们来看具体写法。Java代码1. packageorg.ourpioneer.excel;2. importjava.io.File;3. importjava.io.FileOutputStream;4. importjava.util.ArrayList;5. importjava.util.Arrays;6. importjava.util.List;7. importorg.apache.poi.hssf.usermodel.HSSFCell;8. importorg.apache.poi.hssf.usermodel.HSSFRow;9. importorg.apache.poi.hssf.usermodel.HSSFSheet;10. importorg.apache.poi.hssf.usermodel.HSSFWorkbook;11. importorg.ourpioneer.excel.bean.Student;12. /*13. *生成Excel示例,2003和200714. *15. *authorNanlei16. *17. */18. publicclassGenerateExcel19. privatestaticStringxls2003=C:student.xls;20. privatestaticStringxlsx2007=C:student.xlsx;21. privatestaticListstudentList=null;22. privatestaticStudentstudents=newStudent4;23. /*24. *静态块初始化数据25. */26. static27. studentList=newArrayList();28. students0=newStudent(张三,男,23,一班,94);29. students1=newStudent(李四,女,20,一班,92);30. students2=newStudent(王五,男,21,一班,87);31. students3=newStudent(赵六,女,22,一班,83);32. studentList.addAll(Arrays.asList(students);33. 34. /*35. *创建2003文件的方法36. *37. *paramfilePath38. */39. publicstaticvoidgenerateExcel2003(StringfilePath)40. /先创建工作簿对象41. HSSFWorkbookworkbook2003=newHSSFWorkbook();42. /创建工作表对象并命名43. HSSFSheetsheet=workbook2003.createSheet(学生信息统计表);44. /遍历集合对象创建行和单元格45. for(inti=0;istudentList.size();i+)46. /取出Student对象47. Studentstudent=studentList.get(i);48. /创建行49. HSSFRowrow=sheet.createRow(i);50. /开始创建单元格并赋值51. HSSFCellnameCell=row.createCell(0);52. nameCell.setCellValue(student.getName();53. HSSFCellgenderCell=row.createCell(1);54. genderCell.setCellValue(student.getGender();5

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论