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

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

目录

1.处理excel文件

2.处理Word文档


1.处理excel文件

测试类

创建一个普通对象类Person

package com.xiaomifeng1010.beanutils.bean;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author xiaomifeng1010
 * @version 1.0
 * @date: 2020/4/30 16:31
 */

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person {
    private Integer age;
    private String name;
    private String gender;

}

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

import com.xiaomifeng1010.beanutils.bean.Person;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.junit.Test;

import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @author xiaomifeng1010
 * @version 1.0
 * @date: 2020/5/2 16:12
 */

public class ApachePOIHandleExcleTest {
    /**
     * 将person对象存储到excel文件中
     */
    @Test
    public void saveAsExcelTest(){
        List<Person> persons=new ArrayList<>();
        persons.add(new Person(12,"Albert","male"));
        persons.add(new Person(15,"Johnson","male"));
        persons.add(new Person(22,"Larry","female"));

//        创建工作簿对象,excel格式有.xls和.xlsx,xlsx是office 2007以后excel文件默认的扩展名
//        Workbook是一个接口,有两个主要的类HSSFWorkbook和XSSFWorkbook,前者对应.xls格式,后者对应xlsx格式
//        保存在项目对应磁盘下的data目录下
        try(Workbook wb=new HSSFWorkbook(); OutputStream out=new FileOutputStream(File.separator+"data"+ File.separator+"person.xls",false)){
//            Sheet是工作簿中的工作表,工作簿创建工作表(一个工作簿可以创建多张工作表)
            Sheet sheet = wb.createSheet();
            int rowNum=0;
//            Row表示工作表中的一行,从索引0开始创建行,对应excel表格中第一行
            Row row=sheet.createRow(rowNum);
//            让第一行存放表头(即各属性名称)
//            创建Cell(单元格)对象,存放属性值,单元格的索引也是从0,对应行中第一个单元格
            row.createCell(0).setCellValue("年龄");
            row.createCell(1).setCellValue("姓名");
            row.createCell(2).setCellValue("性别");

//            遍历persons集合,将属性存到excel表格中
            for (int i=0;i<persons.size(); i++){
                Person person=persons.get(i);
                row=sheet.createRow(++rowNum);
                row.createCell(0).setCellValue(person.getAge());
                row.createCell(1).setCellValue(person.getName());
                row.createCell(2).setCellValue(person.getGender());
            }
//            将内容写出
            wb.write(out);
            System.out.println("写入文件成功!");

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
     * 读取excel文件,存放到list中
     */
    @Test
    public void readExcelFileTest(){
        List<Person> personList=new ArrayList<>();
        try(Workbook wb=new HSSFWorkbook(new FileInputStream(File.separator+"data"+ File.separator+"person.xls"))){
            for (Sheet sheet :
                    wb) {
                Iterator<Row> it = sheet.iterator();
                while (it.hasNext()) {
                    Row row=it.next();
//                    不获取第一行表头(即每列的标题),因为第一行的列标题(每列标题都是文本型)和表格内容每列的数据类型不同
                    if (row.getRowNum()==0){
                        continue;
                    }
                    int age= (int) row.getCell(0).getNumericCellValue();
                    String name=row.getCell(1).getStringCellValue();
                    String gender=row.getCell(2).getStringCellValue();
                    personList.add(new Person(age,name,gender));
                }
            }
            System.out.println("读取文件到列表list:"+ personList);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

写入到excel:

在data目录下:

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

2.处理Word文档

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

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

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

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

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

<dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>4.1.0</version>
    </dependency>
    <!--处理word文档需要的额外的jar包-->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>4.1.0</version>
    </dependency>
    <!--处理word文档需要的额外的jar包-->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml-schemas</artifactId>
      <version>4.1.0</version>
    </dependency>

测试写入文本到word文档,用了一首歌词(歌词来自网易云音乐:网易云音乐

import org.apache.poi.POIDocument;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.junit.Test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author xiaomifeng1010
 * @version 1.0
 * @date: 2020/5/2 17:27
 */

public class ApachePOIHandleWordTest {
    /**
     * 测试写入文本到word文档
     */
    @Test
    public void writeTextToWordFile(){
//        创建文档对象
        XWPFDocument document = new XWPFDocument();
//        文档写入到哪个文件(项目所在磁盘下的data目录下)
        try(FileOutputStream fos=new FileOutputStream(File.separator +"data"+File.separator +"test.docx",false)) {
//            添加段落(第一个段落,作为标题)
            XWPFParagraph titleParagraph=document.createParagraph();
//            设置段落格式居中
            titleParagraph.setAlignment(ParagraphAlignment.CENTER);
//            生成一个片段(XWPFRun对象定义具有公共属性集的文本区域)
            XWPFRun titleParagraphRun=titleParagraph.createRun();
//            设置字体
            titleParagraphRun.setFontFamily("仿宋GB2312", XWPFRun.FontCharRange.eastAsia);
//            设置字体加粗
            titleParagraphRun.setBold(true);
//            设置字体颜色(黑色)
            titleParagraphRun.setColor("000000");
            titleParagraphRun.setFontSize(24);
//            写入文本
            titleParagraphRun.setText("有人");
//            换行(line feed):使光标下移一行;注意换行要用这个方法,
//            不能使用\n,\n在Word中不起效,并不能换行,只是在ide控制台可以看到换行效果
            titleParagraphRun.addBreak();
//            回车(carriage return):使光标到行首,对应转义字符\r
//            回车符在word会占据word中的一行,所以不用加上回车符
//            titleParagraphRun.addCarriageReturn();
            titleParagraphRun.setText("歌手:赵珂");
//            换行
            titleParagraphRun.addBreak();

//            段落(第一段)
            XWPFParagraph firstParagraph=document.createParagraph();
//            段落设置左对齐
//            firstParagraph.setAlignment(ParagraphAlignment.LEFT);
//            设置居中对齐(歌词)
            firstParagraph.setAlignment(ParagraphAlignment.CENTER);
//            段落文本区域
            XWPFRun firstParagraphRun=firstParagraph.createRun();
            firstParagraphRun.setFontFamily("宋体");
//            第一段文本字体设置为斜体
            firstParagraphRun.setItalic(true);
//             设置第一段字体颜色(黑色)
            firstParagraphRun.setColor("000000");
            firstParagraphRun.setFontSize(15);
            firstParagraphRun.setTextPosition(2);
            String content="有人浪迹江湖,有人寒窗苦读;" +
                    "有人阿谀奉承,有人早已麻木;" +
                    "有人嫌贫爱富,有人唯利是图;" +
                    "有人精打细算,有人满不在乎;" +
                    "他们,竖起了耳朵猜喜怒,咧开了笑脸躲城府;" +
                    "不过想在平凡世界里找宝物,才会哭着笑着装糊涂;" +
                    "有人家财万贯却还失声痛哭;" +
                    "有人身无分文却也活的舒服;" +
                    "有人入不敷出半杯酒便再无贪图;" +
                    "有人换了张脸企图脱颖而出;" +
                    "有人躲躲藏藏不想引人注目;" +
                    "有人狰狞面目却还装得衣冠楚楚;" +
                    "" +
                    "有人爱的盲目,有人有眼无珠;" +
                    "有人付之全部,有人一文不出;" +
                    "有人强求幸福,有人庆幸孤独;" +
                    "有人撞破头颅,有人原地踟蹰;" +
                    "我们,瞪大了眼睛猜世故,磨尖了牙齿学谈吐;" +
                    "不过想在平凡世界里找宝物,才会哭着笑着装糊涂;" +
                    "有人家财万贯却还失声痛哭;" +
                    "有人身无分文却也活的舒服;" +
                    "有人入不敷出半杯酒便再无贪图;" +
                    "有人换了张脸企图脱颖而出;" +
                    "有人躲躲藏藏不想引人注目;" +
                    "有人狰狞面目却还装的衣冠楚楚;" +
                    "有人爬上高楼大厦一跃而死;" +
                    "" +
                    "只为让亏欠他的人吃场人命官司;" +
                    "落下时才看见楼里多少难以启齿;" +
                    "有人白天笑脸迎人附炎趋势;" +
                    "只为半夜酒后含泪说的雄心壮志;" +
                    "醒来时再继续对着生活咬牙切齿,日复一日,却不自知;" +
                    "多年后老人看着来时路;" +
                    "有人悔不当初,有人难得糊涂;" +
                    "有人感慨万千,说你我,不过一把土.";
//            去掉多余的空格,并将中文逗号,替换成英文逗号
            String contentFormat=content.replace(" ","").replace(",",",");
//            按照分号分割字符
            String[] seperateContent=contentFormat.split(";");
            for (String finalContent:seperateContent
                 ) {
//                一句一句写入
                firstParagraphRun.setText(finalContent);
//                每写一句,换行
                firstParagraphRun.addBreak();
            }
//            System.out.println(contentFormat);
//                 文档内容写入到文件
            document.write(fos);
            System.out.println("写入文件成功!");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}

运行测试,输出:

生成文档:

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

测试读取word文档内容


    /**
     * 读取word文件内容
     */
    @Test
    public void readWordFileConetent() throws IOException, OpenXML4JException, XmlException {
        String wordFilePaht="E:\\data\\test.docx";
        OPCPackage opcPackage = POIXMLDocument.openPackage(wordFilePaht);
        XWPFWordExtractor xwpfWordExtractor=new XWPFWordExtractor(opcPackage);
        String wordContentText = xwpfWordExtractor.getText();
        System.out.println(wordContentText);
    }
控制台打印内容:

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值