Android详细介绍POI进行Word操作(小白可进)

       poi-tl是一个基于Apache POI的Word模板引擎,也是一个免费开源的Java类库,你可以非常方便的加入到你的项目中,并且拥有着让人喜悦的特性。

一、使用poi前准备

1.导入依赖:

亲手测过下面Android导入POI依赖的方法可用

放入这个 jar 包到app工程的 libs 中,点击这里下载

然后在 build.gradle 文件中加入下面代码

dependencies {...implementation('com.deepoove:poi-tl:1.4.2') {//在Android 中 poi-tl 所依赖的库会导致无法编译//所以只使用 poi-tl 的填充功能//然后使用其他作者提供的 poi//下面是过滤掉 poi-tl 的依赖库exclude group: 'org.apache.xmlbeans', module: 'xmlbeans'exclude group: 'org.apache.poi', module: 'poi-ooxml'exclude group: 'org.apache.poi', module: 'poi-ooxml-schemas'exclude group: 'org.apache.poi', module: 'poi'}implementation files('libs/poishadow-all.jar')}
2.使用poi之前记得调用下面方法:
 //可以在 onCreate 前,或者初始化的时候执行它,但必须保证是在使用 poi 前System.setProperty("org.apache.poi.javax.xml.stream.XMLInputFactory", "com.fasterxml.aalto.stax.InputFactoryImpl");System.setProperty("org.apache.poi.javax.xml.stream.XMLOutputFactory", "com.fasterxml.aalto.stax.OutputFactoryImpl");System.setProperty("org.apache.poi.javax.xml.stream.XMLEventFactory", "com.fasterxml.aalto.stax.EventFactoryImpl");

二、使用POI的方法

1.文档XWPFDocument
       (1)创建新的文档
XWPFDocument doc = new XWPFDocument();
       (2)读取已有文档
 //读取已有的docx文件AssetManager assetManager = getAssets();InputStream inputStream = assetManager.open("demo.docx"); // 从Assets目录下获取文件的InputStream
if(inputStream==null){Log.e("xxx","error");
}XWPFDocument doc = new XWPFDocument(inputStream);//记得.docx文档要有内容

接下来我们就可以读取文档内容,包括段落、表格、图片等:

// 段落
List<XWPFParagraph> paragraphs = doc.getParagraphs();
// 表格
List<XWPFTable> tables = doc.getTables();
// 图片
List<XWPFPictureData> allPictures = doc.getAllPictures();
// 页眉
List<XWPFHeader> headerList = doc.getHeaderList();
// 页脚
List<XWPFFooter> footerList = doc.getFooterList();
       (3)输出文档
// 获取应用的私有文件目录File privateDir = getFilesDir();// 路径:/data/user/0/com.example.greendaotest/files/example.docx// 创建一个新的docx文件File docxFile = new File(privateDir, "example.docx");// 将docx文件写入到私有目录下FileOutputStream fos = new FileOutputStream(docxFile);doc.write(fos);fos.flush();if (null != fos) {fos.close();}
    2.段落XWPFParagraph
        (1)创建新段落
XWPFParagraph p1 = doc.createParagraph();
       (2)设置段落格式
// 对齐方式
p1.setAlignment(ParagraphAlignment.CENTER);
// 边框
p1.setBorderBottom(Borders.DOUBLE);
p1.setBorderTop(Borders.DOUBLE);
p1.setBorderRight(Borders.DOUBLE);
p1.setBorderLeft(Borders.DOUBLE);
p1.setBorderBetween(Borders.SINGLE);
 3.段落的基本元素XWPFRun

     创建好段落后,我们就可以通过相关API处理段落内的文本和图片了。XWPFRun是段落的基本组成单元,它可以是一个文本,也可以是一张图片。

  • 读取段落内容
// 获取文字
String text = paragraph.getText();// 获取段落内所有XWPFRun
List<XWPFRun> runs = paragraph.getRuns();
  •  创建XWPFRun文本
// 段落末尾创建XWPFRun
XWPFRun run = paragraph.createRun();
run.setText("为这个段落追加文本");
  • 插入XWPFRun文本
// 段落起始插入XWPFRun
XWPFRun insertNewRun = paragraph.insertNewRun(0);
insertNewRun.setText("在段落起始位置插入这段文本");
  • 修改XWPFRun文本
List<XWPFRun> runs = paragraph.getRuns();
// setText默认为追加文本,参数0表示设置第0个位置的文本,覆盖上一次设置
runs.get(0).setText("追加文本", 0);
runs.get(0).setText("修改文本", 0);
  • 样式:颜色、字体
// 颜色
run.setColor("00ff00");
// 斜体
run.setItalic(true);
// 粗体
run.setBold(true);
// 字体
run.setFontFamily("Courier");
// 下划线
run.setUnderline(UnderlinePatterns.DOT_DOT_DASH);
  • 文本换行
run.addCarriageReturn();
4.段落图片XWPFPicture
(1)提取图片XWPFPicture
List<XWPFPictureData> allPictures = doc.getAllPictures();
XWPFPicture pciture = allPictures.get(0);
byte[] data = pciture.getPictureData().getData();
// 接下来就可以将图片字节数组写入输出流
(2) 创建XWPFRun图片
import org.apache.poi.util.Units;InputStream stream = new FileInputStream("./sayi.png");
XWPFRun run = paragraph.createRun();
run.addPicture(stream, XWPFDocument.PICTURE_TYPE_PNG, "Generated", Units.toEMU(256), Units.toEMU(256));
5. 表格XWPFTable

表格是构成Word文档的另一个重要基本元素。

  (1)创建新表格

创建一个三行三列的表格:

XWPFTable table = doc.createTable(3, 3);
 (2)设置单元格文本

表格是由表格行XWPFRow构成,每行是由单元格XWPFCell构成,每个单元格内部又是由许多XWPFParagraph段落构成。

table.getRow(1).getCell(1).setText("EXAMPLE OF TABLE");

上面这一段代码和下面这一段代码是等价的:

XWPFParagraph p1 = table.getRow(0).getCell(0).addParagraph();
XWPFRun r1 = p1.createRun();
r1.setText("EXAMPLE OF TABLE");
  (3)设置单元格图片

图片操作其实就是获取段落,然后等同操作段落中的图片。

XWPFParagraph p1 = table.getRow(0).getCell(0).addParagraph();
XWPFRun r1 = p1.createRun();
// 同段落图片
 (4)设置单元格样式:背景色、对齐方式
// 背景色浅灰色
cell.setColor("C0C0C0");// 获取单元格段落后设置对齐方式
XWPFParagraph addParagraph = cell.addParagraph();
addParagraph.setAlignment(ParagraphAlignment.CENTER);

三、完整代码


public class MainActivity2 extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);//可以在 onCreate 前,或者初始化的时候执行它,但必须保证是在使用 poi 前System.setProperty("org.apache.poi.javax.xml.stream.XMLInputFactory", "com.fasterxml.aalto.stax.InputFactoryImpl");System.setProperty("org.apache.poi.javax.xml.stream.XMLOutputFactory", "com.fasterxml.aalto.stax.OutputFactoryImpl");System.setProperty("org.apache.poi.javax.xml.stream.XMLEventFactory", "com.fasterxml.aalto.stax.EventFactoryImpl");try {//1.读取已有的docx文件AssetManager assetManager = getAssets();InputStream inputStream = assetManager.open("demo.docx"); // 从Assets目录下获取文件的InputStreamif(inputStream==null){Log.e("xxx","error");}XWPFDocument doc = new XWPFDocument(inputStream);//记得.docx文档要有内容,不然报错//XWPFWordExtractor extractor = new XWPFWordExtractor(doc);//String text = extractor.getText();//获取文档的内容文字//2.创建段落,插入文字XWPFParagraph p1 = doc.createParagraph();// 设置段落的对齐方式p1.setAlignment(ParagraphAlignment.CENTER);// 设置段落的边框p1.setBorderBottom(Borders.DOUBLE);p1.setBorderTop(Borders.DOUBLE);p1.setBorderRight(Borders.DOUBLE);p1.setBorderLeft(Borders.DOUBLE);p1.setBorderBetween(Borders.SINGLE);
//            // 获取文字
//            String text = p1.getText();
//            Log.e("xxx",text);//获取段落的基本元素// 获取段落p1内所有XWPFRun,XWPFRun是段落的基本组成单元,它可以是一个文本,也可以是一张图片。List<XWPFRun> runs = p1.getRuns();// 段落末尾创建XWPFRunXWPFRun run = p1.createRun();run.setText("为这个段落追加文本");//设置样式,颜色字体// 颜色run.setColor("00ff00");// 斜体run.setItalic(true);// 粗体run.setBold(true);// 字体run.setFontFamily("Courier");// 下划线run.setUnderline(UnderlinePatterns.DOT_DOT_DASH);// 段落起始插入XWPFRunXWPFRun insertNewRun = p1.insertNewRun(0);insertNewRun.setText("在起始位置插入这段文本");//  List<XWPFRun> runs = p1.getRuns();// setText默认为追加文本,参数0表示设置第0个位置的文本,覆盖上一次设置runs.get(0).setText("追加文本", 0);runs.get(0).setText("修改文本", 0);// 获取文字String text = p1.getText();Log.e("xxx","段落p1"+text);//文本换行run.addCarriageReturn();//3.创建段落2,插入图片XWPFParagraph p2 = doc.createParagraph();
//            // 对齐方式
//            p2.setAlignment(ParagraphAlignment.CENTER);
//            // 边框
//            p2.setBorderBottom(Borders.DOUBLE);
//            p2.setBorderTop(Borders.DOUBLE);
//            p2.setBorderRight(Borders.DOUBLE);
//            p2.setBorderLeft(Borders.DOUBLE);
//            p2.setBorderBetween(Borders.SINGLE);//创建XWPFRun图片// 获取资源图片名称String resName = "img";// 通过资源名称获取 InputStreamResources resources = getResources();int resId = resources.getIdentifier(resName, "drawable", getPackageName());InputStream stream = resources.openRawResource(resId);//创建XWPFRun图片XWPFRun run2 = p2.createRun();run2.addPicture(stream, XWPFDocument.PICTURE_TYPE_PNG, "Generated", Units.toEMU(30), Units.toEMU(30));//提取图片XWPFPictureList<XWPFPictureData> allPictures = doc.getAllPictures();XWPFPictureData pciture = allPictures.get(0);byte[] data = pciture.getData();// 将图片字节数组转换为 Bitmap,显示图片Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);ImageView imageView=findViewById(R.id.image);imageView.setImageBitmap(bitmap);// 4.创建一个三行三列的表格XWPFTable table = doc.createTable(3, 3);//设置单元格文本//表格是由表格行XWPFRow构成,每行是由单元格XWPFCell构成,每个单元格内部又是由许多XWPFParagraph段落构成。table.getRow(1).getCell(1).setText("EXAMPLE OF TABLE");//上面这一段代码和下面这一段代码是等价的:
//            XWPFParagraph tablep = table.getRow(0).getCell(0).addParagraph();
//            XWPFRun r1 = tablep.createRun();
//            r1.setText("EXAMPLE OF TABLE");//  设置单元格图片// 图片操作其实就是获取段落,然后等同操作段落中的图片。XWPFParagraph tablep1 = table.getRow(0).getCell(0).addParagraph();XWPFRun r1 = tablep1.createRun();// 添加图片// 获取资源图片名称String imageName = "img_1";// 通过资源名称获取 InputStreamint Id = resources.getIdentifier(imageName, "drawable", getPackageName());InputStream imagestream = getResources().openRawResource(Id);r1.addPicture(imagestream, XWPFDocument.PICTURE_TYPE_PNG, "mm", Units.toEMU(30), Units.toEMU(30));// (io流)imagestream不可以是之前被用过的,否则图像不显示// 设置单元格样式:背景色、对齐方式// 背景色// 创建一个新的单元格
//            XWPFTableCell cell = table.getRow(1).getCell(1);
//         //   XWPFTableCellProperties cellStyle = cell.getCTTc().isSetTcPr() ? cell.getCTTc().getTcPr() : cell.getCTTc().addNewTcPr();
//            cell.setColor(cellStyle.getBackgroundColor());
//
//            // 获取单元格段落后设置对齐方式
//            XWPFParagraph addParagraph = cell.addParagraph();
//            addParagraph.setAlignment(ParagraphAlignment.CENTER);// 写入数据  (path:导出的文件路径)// 获取应用的私有文件目录File privateDir = getFilesDir();// 路径:/data/user/0/com.example.greendaotest/files/example.docx// 创建一个新的docx文件File docxFile = new File(privateDir, "example.docx");// 将docx文件写入到私有目录下FileOutputStream fos = new FileOutputStream(docxFile);doc.write(fos);fos.flush();Log.d("xxx", docxFile.getAbsolutePath());if (null != fos) {fos.close();}if (null != inputStream) {inputStream.close();}} catch (Exception e) {throw new RuntimeException(e);}}}

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/300580.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSPF实例是什么?

OSPF实例是什么&#xff1f; **OSPF实例指的是一个OSPF路由进程&#xff0c;它是在一个设备上运行的单独的OSPF路由协议实体**。 在详细解释这个概念之前&#xff0c;需要了解OSPF&#xff08;Open Shortest Path First&#xff09;是一种内部网关协议&#xff08;IGP&#x…

hive图形化客户端工具

hive准备 创建测试数据 以root用户登录&#xff0c;使用hive命令启动hive。 创建库 create database testhivedb; 创建表 create table testhivedb.testhivetable( id int ,name string ); 插入数据 insert into testhivedb.testhivetable values (1,cc); insert into…

Vscode连接WSL2当中的jupyter

主要解决办法参考自这篇博客 1. 在WSL当中安装jupyter 这个随便找一篇博客即可&#xff0c;比如这篇&#xff0c;也可以根据现有的环境参考其它博客内容 2. 使用jupyter创建一个虚拟环境 首先激活想要添加的虚拟环境后&#xff0c;输入命令安装库: pip install ipykernel …

HarmonyOS实战开发-如何实现分布式帐号相关的功能。

介绍 本示例主要展示了分布式帐号相关的功能&#xff0c;使用ohos.account.distributedAccount、ohos.account.osAccount等接口&#xff0c;实现了绑定分布式帐号、解绑分布式帐号、更新分布式帐号信息和管理分布式帐号的功能&#xff1b; 效果预览 使用说明 1.首次进入应用会…

Text-Driven Object Detection 关于结合文本的目标检测

1、简单介绍 首先说明&#xff0c;本文目的主要是水一篇CSDN博客&#xff0c;顺便说一下和标题相关的认识。 近几年&#xff0c;在目标检测领域关于多模态的目标检测工作已成了主流&#xff0c;趋势仍在延续&#xff0c;未来仍有很大挖掘空间。这里说的多模态不是简单的多源数…

element-ui使用记录

element-ui的组件名就是类名 样式穿透&#xff08;用来修改没有类名的子组件样式&#xff09; 例如修改头部具名插槽的样式&#xff08;但是无法定位该元素&#xff09; 查看最后生成的html结构中对应的结构&#xff08;这里的头部有类名&#xff0c;可以直接对该类名进行样…

【CicadaPlayer】demuxer_service的简单理解

G:\CDN\all_players\CicadaPlayer-github-0.44\mediaPlayer\SMPMessageControllerListener.cppplayer的demuxer服务类 std::unique_ptr<demuxer_service> mDemuxerService{nullptr};根据option (Cicada::options),可以决定音视频的不同操作,通过 hander可以获得具体使…

SpringCloud Alibaba Sentinel 创建流控规则

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅&#xff0c;从传统的模块之间调用&#xff0c;一步步的升级为 SpringCloud 模块之间的调用&#xff0c;此篇文章为第十四篇&#xff0c;即介绍 SpringCloud Alibaba Sentinel 创建流控规则。 二、基本介绍 我们在 senti…

UltraScale 架构 SelectIO 资源之IODELAY与IOSERDES仿真与使用

平台&#xff1a;vivado2018.3 具体内容见ug571-ultrascale-selectio IDELAYE3 在调试超高速信号的时候&#xff0c;需要使用iodelayiserdes来调试校准输入信号。例如外部某ADC采样率为5GHZ&#xff0c;外部ADC使用2.5GHZ的时钟去采集输入信号。为了实现采集&#xff0c;adc芯…

90天玩转Python—05—基础知识篇:Python基础知识扫盲,使用方法与注意事项

90天玩转Python系列文章目录 90天玩转Python—01—基础知识篇:C站最全Python标准库总结 90天玩转Python--02--基础知识篇:初识Python与PyCharm 90天玩转Python—03—基础知识篇:Python和PyCharm(语言特点、学习方法、工具安装) 90天玩转Python—04—基础知识篇:Pytho…

如何搭建APP分发平台分发平台搭建教程

搭建一个APP分发平台可以帮助开发者更好地分发和管理他们的应用程序。下面是一个简要的教程&#xff0c;介绍如何搭建一个APP分发平台。 1.确定需求和功能&#xff1a;首先&#xff0c;确定你的APP分发平台的需求和功能。考虑以下几个方面&#xff1a; 用户注册和登录&#xff…

Stable Diffusion扩散模型推导公式的基础知识

文章目录 1、独立事件的条件概率2、贝叶斯公式、先验概率、后验概率、似然、证据3、马尔可夫链4、正态分布 / 高斯分布5、重参数化技巧6、期望7、KL散度 、高斯分布的KL散度8、极大似然估计9、ELBO :Evidence Lower Bound10、一元二次方程 1、独立事件的条件概率 A 和 B 是两个…

Vue项目打包成exe文件(electron)

1.将写好的vue项目打包 1.1运行vue ui命令 输出目标文件 如果打开index.html是空白的&#xff0c;而且控制台报错获取xxx资源失败的问题&#xff0c;你需要在vue.config.js 上加一个命令&#xff0c;如果没有你需要创建一个。 2.下载electron官方示例 git clone https://gith…

zdpdjango_argonadmin Django后台管理系统中的常见功能开发

效果预览 首先&#xff0c;看一下这个项目最开始的样子&#xff1a; 左侧优化 将左侧优化为下面的样子&#xff1a; 代码位置&#xff1a; 代码如下&#xff1a; {% load i18n static admin_argon %}<aside class"sidenav bg-white navbar navbar-vertical na…

Python---Numpy线性代数

1.数组和矩阵操作&#xff1a; 创建数组和矩阵&#xff1a;np.array, np.matrix 基本的数组操作&#xff1a;形状修改、大小调整、转置等 import numpy as np# 创建一个 2x3 的数组 A np.array([[1, 2, 3], [4, 5, 6]]) print("数组 A:\n", A)# 将数组 A 转换为矩阵…

趣学前端 | 综合一波CSS选择器的用法

背景 最近睡前习惯翻会书&#xff0c;重温了《HTML5与CSS 3权威指南》。这本书&#xff0c;分上下两册&#xff0c;之前读完了上册&#xff0c;下册基本没翻过。为了对得起花过的每一分钱&#xff0c;决定拾起来近期读一读。 CSS 选择器 在CSS3中&#xff0c;提倡使用选择器…

git bash上传文件至github仓库

Linux运维工具-ywtool 目录 一.访问github二.新建仓库1.点击自己头像2.选择"your repositories"3.点击"New"4.创建新仓库 三.通过git bash软件上传文件1.提示2.打开git bash软件3.切换到本地仓库目录4.配置github的用户名和邮箱信息5.生成SSH Key6.github添…

如何理解图像处理领域的病态问题(ill-posed problem)

ill-posed problem&#xff0c;我们可以理解为病态问题或者不适定问题。在本文中&#xff0c;统一成为不适定问题。 在讨论不适定问题&#xff08;ill-posed problem&#xff09;之前&#xff0c;我们先来看一下什么叫适定性问题&#xff08;well-posed problem&#xff09;。…

MVCC(解决MySql中的并发事务的隔离性)

MVCC 如何保证事务的隔离性&#xff1f; 1.排他锁&#xff1a;如一个事务获取了一个数据行的排他锁&#xff0c;其他事务就不能再获取改行的其他锁。 2.MVCC&#xff1a;多版本并发控制。 MVCC&#xff1a; 1.隐藏字段 1.DB_TRX_ID&#xff1a;最近修改事务的id。默认值从0开…

前端:SVG绘制流程图

效果 代码 html代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>SVG流程图示例</title><style>/* CSS 样式 */</style><script src"js/index.js"></script…