Apache POI工具包可用来出来microsoft office办公套件中的Word文档,excel文档,ppt文档以及visio文档等,直接使用maven导入jar包即可使用。
目录
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文档,用了一首歌词(歌词来自网易云音乐: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
转载:https://blog.csdn.net/u011174699/article/details/105891479
查看评论