小言_互联网的博客

文档处理工具库——Apache POI的使用

340人阅读  评论(0)

Apache POI工具包可用来出来microsoft office办公套件中的Word文档,excel文档,ppt文档以及visio文档等,直接使用maven导入jar包即可使用。

目录

1.处理excel文件

2.处理Word文档


 

1.处理excel文件

测试类

创建一个普通对象类Person


  
  1. package com.xiaomifeng1010.beanutils.bean;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Data;
  4. import lombok.NoArgsConstructor;
  5. /**
  6. * @author xiaomifeng1010
  7. * @version 1.0
  8. * @date: 2020/4/30 16:31
  9. */
  10. @Data
  11. @AllArgsConstructor
  12. @NoArgsConstructor
  13. public class Person {
  14. private Integer age;
  15. private String name;
  16. private String gender;
  17. }

测试类,将person对象存放到excel表格中,然后再读取出来


  
  1. import com.xiaomifeng1010.beanutils.bean.Person;
  2. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  3. import org.apache.poi.ss.usermodel.Row;
  4. import org.apache.poi.ss.usermodel.Sheet;
  5. import org.apache.poi.ss.usermodel.Workbook;
  6. import org.junit.Test;
  7. import java.io.*;
  8. import java.util.ArrayList;
  9. import java.util.Iterator;
  10. import java.util.List;
  11. /**
  12. * @author xiaomifeng1010
  13. * @version 1.0
  14. * @date: 2020/5/2 16:12
  15. */
  16. public class ApachePOIHandleExcleTest {
  17. /**
  18. * 将person对象存储到excel文件中
  19. */
  20. @Test
  21. public void saveAsExcelTest(){
  22. List<Person> persons= new ArrayList<>();
  23. persons.add( new Person( 12, "Albert", "male"));
  24. persons.add( new Person( 15, "Johnson", "male"));
  25. persons.add( new Person( 22, "Larry", "female"));
  26. // 创建工作簿对象,excel格式有.xls和.xlsx,xlsx是office 2007以后excel文件默认的扩展名
  27. // Workbook是一个接口,有两个主要的类HSSFWorkbook和XSSFWorkbook,前者对应.xls格式,后者对应xlsx格式
  28. // 保存在项目对应磁盘下的data目录下
  29. try(Workbook wb= new HSSFWorkbook(); OutputStream out= new FileOutputStream(File.separator+ "data"+ File.separator+ "person.xls", false)){
  30. // Sheet是工作簿中的工作表,工作簿创建工作表(一个工作簿可以创建多张工作表)
  31. Sheet sheet = wb.createSheet();
  32. int rowNum= 0;
  33. // Row表示工作表中的一行,从索引0开始创建行,对应excel表格中第一行
  34. Row row=sheet.createRow(rowNum);
  35. // 让第一行存放表头(即各属性名称)
  36. // 创建Cell(单元格)对象,存放属性值,单元格的索引也是从0,对应行中第一个单元格
  37. row.createCell( 0).setCellValue( "年龄");
  38. row.createCell( 1).setCellValue( "姓名");
  39. row.createCell( 2).setCellValue( "性别");
  40. // 遍历persons集合,将属性存到excel表格中
  41. for ( int i= 0;i<persons.size(); i++){
  42. Person person=persons.get(i);
  43. row=sheet.createRow(++rowNum);
  44. row.createCell( 0).setCellValue(person.getAge());
  45. row.createCell( 1).setCellValue(person.getName());
  46. row.createCell( 2).setCellValue(person.getGender());
  47. }
  48. // 将内容写出
  49. wb.write(out);
  50. System.out.println( "写入文件成功!");
  51. } catch (FileNotFoundException e) {
  52. e.printStackTrace();
  53. } catch (IOException e) {
  54. e.printStackTrace();
  55. }
  56. }
  57. /**
  58. * 读取excel文件,存放到list中
  59. */
  60. @Test
  61. public void readExcelFileTest(){
  62. List<Person> personList= new ArrayList<>();
  63. try(Workbook wb= new HSSFWorkbook( new FileInputStream(File.separator+ "data"+ File.separator+ "person.xls"))){
  64. for (Sheet sheet :
  65. wb) {
  66. Iterator<Row> it = sheet.iterator();
  67. while (it.hasNext()) {
  68. Row row=it.next();
  69. // 不获取第一行表头(即每列的标题),因为第一行的列标题(每列标题都是文本型)和表格内容每列的数据类型不同
  70. if (row.getRowNum()== 0){
  71. continue;
  72. }
  73. int age= ( int) row.getCell( 0).getNumericCellValue();
  74. String name=row.getCell( 1).getStringCellValue();
  75. String gender=row.getCell( 2).getStringCellValue();
  76. personList.add( new Person(age,name,gender));
  77. }
  78. }
  79. System.out.println( "读取文件到列表list:"+ personList);
  80. } catch (FileNotFoundException e) {
  81. e.printStackTrace();
  82. } catch (IOException e) {
  83. e.printStackTrace();
  84. }
  85. }
  86. }

写入到excel:

在data目录下:

第2个测试方法,读取excel文件内容,以List形式输出,查看输出结果:

2.处理Word文档

Word2007(包括)之后都是docx,遵循XML路线,文档格式公开;Word2007之前的格式是doc,文档格式不公开

处理一下docx格式对象,涉及文字样式,word中的表格,图片,公式

涉及word文档处理的主要类:

• XWPFDocument 整个文档对象
• XWPFParagraph 段落
• XWPFRun 一个片段(字体样式相同的一段)
• XWPFPicture 图片
• XWPFTable 表格

操作docx文档还需要一些额外的jar包


  
  1. <dependency>
  2. <groupId>org.apache.poi </groupId>
  3. <artifactId>poi </artifactId>
  4. <version>4.1.0 </version>
  5. </dependency>
  6. <!--处理word文档需要的额外的jar包-->
  7. <dependency>
  8. <groupId>org.apache.poi </groupId>
  9. <artifactId>poi-ooxml </artifactId>
  10. <version>4.1.0 </version>
  11. </dependency>
  12. <!--处理word文档需要的额外的jar包-->
  13. <dependency>
  14. <groupId>org.apache.poi </groupId>
  15. <artifactId>poi-ooxml-schemas </artifactId>
  16. <version>4.1.0 </version>
  17. </dependency>

测试写入文本到word文档,用了一首歌词(歌词来自网易云音乐:https://music.163.com/#/song?id=1297750769&market=baiduqk


  
  1. import org.apache.poi.POIDocument;
  2. import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
  3. import org.apache.poi.xwpf.usermodel.XWPFDocument;
  4. import org.apache.poi.xwpf.usermodel.XWPFParagraph;
  5. import org.apache.poi.xwpf.usermodel.XWPFRun;
  6. import org.junit.Test;
  7. import java.io.File;
  8. import java.io.FileNotFoundException;
  9. import java.io.FileOutputStream;
  10. import java.io.IOException;
  11. /**
  12. * @author xiaomifeng1010
  13. * @version 1.0
  14. * @date: 2020/5/2 17:27
  15. */
  16. public class ApachePOIHandleWordTest {
  17. /**
  18. * 测试写入文本到word文档
  19. */
  20. @Test
  21. public void writeTextToWordFile(){
  22. // 创建文档对象
  23. XWPFDocument document = new XWPFDocument();
  24. // 文档写入到哪个文件(项目所在磁盘下的data目录下)
  25. try(FileOutputStream fos= new FileOutputStream(File.separator + "data"+File.separator + "test.docx", false)) {
  26. // 添加段落(第一个段落,作为标题)
  27. XWPFParagraph titleParagraph=document.createParagraph();
  28. // 设置段落格式居中
  29. titleParagraph.setAlignment(ParagraphAlignment.CENTER);
  30. // 生成一个片段(XWPFRun对象定义具有公共属性集的文本区域)
  31. XWPFRun titleParagraphRun=titleParagraph.createRun();
  32. // 设置字体
  33. titleParagraphRun.setFontFamily( "仿宋GB2312", XWPFRun.FontCharRange.eastAsia);
  34. // 设置字体加粗
  35. titleParagraphRun.setBold( true);
  36. // 设置字体颜色(黑色)
  37. titleParagraphRun.setColor( "000000");
  38. titleParagraphRun.setFontSize( 24);
  39. // 写入文本
  40. titleParagraphRun.setText( "有人");
  41. // 换行(line feed):使光标下移一行;注意换行要用这个方法,
  42. // 不能使用\n,\n在Word中不起效,并不能换行,只是在ide控制台可以看到换行效果
  43. titleParagraphRun.addBreak();
  44. // 回车(carriage return):使光标到行首,对应转义字符\r
  45. // 回车符在word会占据word中的一行,所以不用加上回车符
  46. // titleParagraphRun.addCarriageReturn();
  47. titleParagraphRun.setText( "歌手:赵珂");
  48. // 换行
  49. titleParagraphRun.addBreak();
  50. // 段落(第一段)
  51. XWPFParagraph firstParagraph=document.createParagraph();
  52. // 段落设置左对齐
  53. // firstParagraph.setAlignment(ParagraphAlignment.LEFT);
  54. // 设置居中对齐(歌词)
  55. firstParagraph.setAlignment(ParagraphAlignment.CENTER);
  56. // 段落文本区域
  57. XWPFRun firstParagraphRun=firstParagraph.createRun();
  58. firstParagraphRun.setFontFamily( "宋体");
  59. // 第一段文本字体设置为斜体
  60. firstParagraphRun.setItalic( true);
  61. // 设置第一段字体颜色(黑色)
  62. firstParagraphRun.setColor( "000000");
  63. firstParagraphRun.setFontSize( 15);
  64. firstParagraphRun.setTextPosition( 2);
  65. String content= "有人浪迹江湖,有人寒窗苦读;" +
  66. "有人阿谀奉承,有人早已麻木;" +
  67. "有人嫌贫爱富,有人唯利是图;" +
  68. "有人精打细算,有人满不在乎;" +
  69. "他们,竖起了耳朵猜喜怒,咧开了笑脸躲城府;" +
  70. "不过想在平凡世界里找宝物,才会哭着笑着装糊涂;" +
  71. "有人家财万贯却还失声痛哭;" +
  72. "有人身无分文却也活的舒服;" +
  73. "有人入不敷出半杯酒便再无贪图;" +
  74. "有人换了张脸企图脱颖而出;" +
  75. "有人躲躲藏藏不想引人注目;" +
  76. "有人狰狞面目却还装得衣冠楚楚;" +
  77. "" +
  78. "有人爱的盲目,有人有眼无珠;" +
  79. "有人付之全部,有人一文不出;" +
  80. "有人强求幸福,有人庆幸孤独;" +
  81. "有人撞破头颅,有人原地踟蹰;" +
  82. "我们,瞪大了眼睛猜世故,磨尖了牙齿学谈吐;" +
  83. "不过想在平凡世界里找宝物,才会哭着笑着装糊涂;" +
  84. "有人家财万贯却还失声痛哭;" +
  85. "有人身无分文却也活的舒服;" +
  86. "有人入不敷出半杯酒便再无贪图;" +
  87. "有人换了张脸企图脱颖而出;" +
  88. "有人躲躲藏藏不想引人注目;" +
  89. "有人狰狞面目却还装的衣冠楚楚;" +
  90. "有人爬上高楼大厦一跃而死;" +
  91. "" +
  92. "只为让亏欠他的人吃场人命官司;" +
  93. "落下时才看见楼里多少难以启齿;" +
  94. "有人白天笑脸迎人附炎趋势;" +
  95. "只为半夜酒后含泪说的雄心壮志;" +
  96. "醒来时再继续对着生活咬牙切齿,日复一日,却不自知;" +
  97. "多年后老人看着来时路;" +
  98. "有人悔不当初,有人难得糊涂;" +
  99. "有人感慨万千,说你我,不过一把土.";
  100. // 去掉多余的空格,并将中文逗号,替换成英文逗号
  101. String contentFormat=content.replace( " ", "").replace( ",", ",");
  102. // 按照分号分割字符
  103. String[] seperateContent=contentFormat.split( ";");
  104. for (String finalContent:seperateContent
  105. ) {
  106. // 一句一句写入
  107. firstParagraphRun.setText(finalContent);
  108. // 每写一句,换行
  109. firstParagraphRun.addBreak();
  110. }
  111. // System.out.println(contentFormat);
  112. // 文档内容写入到文件
  113. document.write(fos);
  114. System.out.println( "写入文件成功!");
  115. } catch (FileNotFoundException e) {
  116. e.printStackTrace();
  117. } catch (IOException e) {
  118. e.printStackTrace();
  119. }
  120. }
  121. }

运行测试,输出:

生成文档:

 打开文档看一下,标题是加粗的,字体是仿宋GB2312

 

 

转载:https://blog.csdn.net/u011174699/article/details/105891479
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场