Apache POI工具包可用来出来microsoft office办公套件中的Word文档,excel文档,ppt文档以及visio文档等,直接使用maven导入jar包即可使用。
目录
1.处理excel文件
2.处理Word文档
测试类
创建一个普通对象类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 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 personList=new ArrayList<>();
try(Workbook wb=new HSSFWorkbook(new FileInputStream(File.separator+"data"+ File.separator+"person.xls"))){
for (Sheet sheet :
wb) {
Iterator 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形式输出,查看输出结果:
Word2007(包括)之后都是docx,遵循XML路线,文档格式公开;Word2007之前的格式是doc,文档格式不公开
处理一下docx格式对象,涉及文字样式,word中的表格,图片,公式
涉及word文档处理的主要类:
• XWPFDocument 整个文档对象
• XWPFParagraph 段落
• XWPFRun 一个片段(字体样式相同的一段)
• XWPFPicture 图片
• XWPFTable 表格
操作docx文档还需要一些额外的jar包
org.apache.poi
poi
4.1.0
org.apache.poi
poi-ooxml
4.1.0
org.apache.poi
poi-ooxml-schemas
4.1.0
测试写入文本到word文档,用了一首歌词(歌词来自网易云音乐:https://music.163.com/#/song?id=1297750769&market=baiduqk)
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