Android 基于POI库,根据模板导出word文档

这篇具有很好参考价值的文章主要介绍了Android 基于POI库,根据模板导出word文档。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

由于项目需求,需要根据用户提供的word模板,填充动态内容生成新的word,为了记录自己的踩坑日记,记录一下。


一、POI是什么?

Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对文档读和写的功能。

这里给出官网链接-POI官网,同时下载版本也在官网链接中,可进行对应版本下载。

同时在了解POI库的过程中,还了解到poi-ti库,也就是word模板引擎,基于Apache POI,其实也就是在POI库的基础上做了一层API的封装,对应jar包中是包含了poi的,这里给出中文文档有兴趣的可以了解下-poi-ti API文档,源码github链接-poi-ti源码。这个开源库对java做了很好的适配,后台开发如果涉及到操作word,excel等文档读写完全可以使用,使用也很简单,只需要根据中文文档集成即可。

唯一遗憾的是poi-ti该库的作者只对java库做了适配,确不适用Android,我在研究过程中引入jar包确一直无法编译通过。如果大家还想使用poi-ti 大家可以移步另一位博主写的博客,这里给出链接-Android使用poi_ti生成word,这位博主使用低版本的poi-ti在Android 端完成了编译通过,我也有测试使用,但是不符合我项目要求,果断放弃。

本文主要使用poi来完成对word的读写以及excel文档的读写。

二、使用步骤

1.下载对应库并引入

有2种方式,一种直接下载对应版本的jar包,链接这-jar下载链接,另外一种是gradle依赖方式。

注意在这里有一个坑,word分为doc和docx,excel也分为.xls和.xlsx,针对这个poi也做了区分,如下表:

类型 API 对应jar
doc/xls

HWPF

(HWPFDocument-doc格式文件对象

/HSSFWorkbook-xls格式文件对象)

poi-scratchpad
docx/xlsx

XWPF

(XWPFDocument- docx格式文件对象

/XSSFWorkbook-.xlsx格式文件对象)

poi-ooxml

我使用的是docx/xlsx,对应gradle中的依赖如下所示:

Android 基于POI库,根据模板导出word文档,word,android,apache

2.word的读写(docx)

读写word docx文件通过xwpf模块来进行的,核心API为XWPFDocument。一个XWPFDocument代表一个docx文档,其可以用来读docx写文档。本文用到XWPFDocument中有下面这几种对象:

XWPFParagraph 一个段落
XWPFRun 具有相同属性的一段文本
XWPFTable 一个表格
XWPFTableRow 表格的一行
XWPFTableCell 表格对应的一个单元格

介绍完对应API后我们开始通过模板来动态填充模板中的内容以及表格,从而生成新的模板。文中给出我们项目中的word模板,如下:

Android 基于POI库,根据模板导出word文档,word,android,apache

可以看出基本信息一栏是固定的,检测数据下面一栏是动态列表。针对固定的我们可以采取通过poi进行读模板,读取到后将对应标记的{{a}}等等字符串给替换成我们真正需要的值。那针对动态列表的渲染,我们可以通过循环的方式,一直复制当前行,给下面循环插入一行来完成。代码如下:

Android 基于POI库,根据模板导出word文档,word,android,apache

DocxTool类中export封装的方法主要方法是下面这个:由于隐私原因数据就不做展示,我都是从本地Android sqlite中取得,可以根据实际业务来做调整。
HashMap<String, Object> map = new HashMap<>();为文档中标记的{{a}}等等字符串,用来做替换,
List<RowRenderData> labors = new ArrayList<>();为封装的动态渲染表格数据。
XWPFTableRow twoRow = table.getRow(copyRow)以测试模板中第7行固定作为动态表格复制,
XWPFTableRow row = table.insertNewTableRow(goodsStartRow++);然后向下面循环插入,插入后在对每个单元格进行数据赋值。

Android 基于POI库,根据模板导出word文档,word,android,apache

DocxTool类中searchAndReplace封装的方法则是替换并导出,主要方法如下:
    public static void searchAndReplace(Activity activity, String Name, XWPFDocument document, HashMap<String, Object> map) {

        try {
            /**
             * 替换表格中的指定文字
             */
            //获取文档中所有的表格,每个表格是一个元素
            Iterator<XWPFTable> itTable = document.getTablesIterator();
            while (itTable.hasNext()) {
                XWPFTable table = (XWPFTable) itTable.next();   //获取表格内容
                int count = table.getNumberOfRows();    //表格的行数
                //遍历表格行的对象
                for (int i = 0; i < count; i++) {
                    XWPFTableRow row = table.getRow(i);    //表格每行的内容
                    List<XWPFTableCell> cells = row.getTableCells();   //每个单元格的内容
                    //遍历表格的每行单元格对象
                    for (int j = 0; j < cells.size(); j++) {
                        XWPFTableCell cell = cells.get(j);    //获取每个单元格的内容
                        List<XWPFParagraph> paragraphs = cell.getParagraphs();      //获取单元格里所有的段落
                        for (XWPFParagraph paragraph : paragraphs) {
                            //获取段落的内容
                            List<XWPFRun> run = paragraph.getRuns();
                            // 遍历段落文字对象
                            for (int o = 0; o < run.size(); o++) {
                                // 获取段落对象
                                if (run.get(o) == null || run.get(o).equals("")) {
                                    continue;
                                }
                                String sectionItem = run.get(o).getText(run.get(o).getTextPosition());    //获取段落内容
                                if (sectionItem == null || sectionItem.equals("")) {    //段落为空跳过
                                    continue;
                                }
                                //遍历自定义表单关键字,替换Word文档中表格单元格的内容
                                for (String key : map.keySet()) {
                                    // 替换内容
                                    sectionItem = sectionItem.replace(key, String.valueOf(map.get(key)));
                                    run.get(o).setText(sectionItem, 0);
                                }
                            }
                        }
                    }
                }
            }
            //创建生成的文件
            String ps = context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS).getPath();
            File path = new File(ps, "docx-export");
            if (!path.exists()) {
                path.mkdir();
            }
            String date = Utils.getCurTimeString().replace("-", "").replace(" ", "").replace(":", "");
            String dirName = date + ".docx";
            File File = new File(path, dirName);
            if (File.exists()) {
                File.delete();
            }

            FileOutputStream outputStream = new FileOutputStream(File);
            document.write(outputStream);
            document.close();
            outputStream.flush();
            outputStream.close();


            new Handler(Looper.getMainLooper()).post(() -> {

                ExprotWordDialog wordDialog = new ExprotWordDialog(activity, s -> {
                    Uri photoURI = null;
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    try {
                        if (Build.VERSION.SDK_INT >= 24) {
                            photoURI = FileProvider.getUriForFile(activity,
                                    "自己的包名" + ".file.provider",
                                    new File(File.getPath()));
                            intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);//给目标文件临时授权
                        } else {
                            photoURI = Uri.fromFile(new File(File.getPath()));
                        }
                        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        intent.setDataAndType(photoURI, "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
                        activity.startActivity(intent);
                    } catch (Exception e) {
                        Log.e("=", e.toString());
                        Toast.makeText(activity, "查看文档出错", Toast.LENGTH_SHORT).show();
                    }


                });
                wordDialog.show();
                wordDialog.setFilename("文件名:" + dirName);
                wordDialog.setPath("本地存储路径:" + path.getPath());


            });

        } catch (Exception e) {
            Log.e("==", e.toString() + "替换docx出错");
            e.printStackTrace();
        }
    }

到此,模板数据填充以及动态列表渲染就结束了。

3.excel的读写(xlxs)

arraylist为封装得动态数据

Android 基于POI库,根据模板导出word文档,word,android,apache


总结

记录下来,也是为了记录自己的踩坑日记。文章来源地址https://www.toymoban.com/news/detail-800561.html

到了这里,关于Android 基于POI库,根据模板导出word文档的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【导出Word】如何使用Java+Freemarker模板引擎,根据XML模板文件生成Word文档(只含文本内容的模板)

    这篇文章,主要介绍如何使用Java+Freemarker模板引擎,根据XML模板文件生成Word文档。 目录 一、导出Word文档 1.1、基础知识 1.2、制作模板文件 1.3、代码实现 (1)引入依赖 (2)创建Freemarker工具类 (3)测试案例代码 (4)运行效果 Word文件有两种后缀格式,分别是:doc和docx,

    2024年02月13日
    浏览(43)
  • easyexcel poi根据模板导出Excel

    参考:https://blog.csdn.net/weixin_45742032/article/details/119593288?spm=1001.2101.3001.6650.1utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-119593288-blog-86538258.235%5Ev38%5Epc_relevant_anti_t3_basedepth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-1-11959328

    2024年02月10日
    浏览(34)
  • 根据模板动态生成word(三)使用poi-tl生成word

    @ 目录 一、前言 1、什么是poi-tl 2、官方信息 2.1 源码仓库 2.2 中文文档 2.3 开源协议 3、poi-tl的优势 3.1 poi-tl和其他模板引擎的对比 3.2 poi-tl Word模板引擎支持的功能 二、基本的使用配置 1、引入依赖 1.1 Maven 1.2 Gradle 2、配置 2.1 新建配置 2.2 标签前后缀替换 2.3 加载模板 2.4 填充数

    2024年02月13日
    浏览(36)
  • java根据模板导出word

    日常开发中,常常会遇到各种各样的表格进行导出,比较好的办法就是提前弄好word模版,再通过遍历的方式进行导出文档 模版编写 内容替换 目标下面模版进行多页展示 将word转换成xml 将xml格式化 再将xml改成ftl xml格式化地址 list找到起始位置和结束位置 起始位置插入#list

    2024年02月15日
    浏览(77)
  • Java POI导出富文本的内容到word文档

    当创建使用富文本编辑器,操作完的数据,传输到后台都是带有html标签的。 如:h1标题头/h1h2第二个标题/h2a href=\\\"www.baidu.com\\\"百度搜索/a 我们想把富文本数据转换为Word内容。 Word是完全支持html标签的,但是我们获取到的富文本内容并不是完整的html代码,所有我们需要先补全

    2024年02月09日
    浏览(38)
  • Java POI导出Word、Excel、Pdf文档(可在线预览PDF)

    1、导入依赖Pom.xml        dependency             groupIdorg.apache.poi/groupId             artifactIdpoi/artifactId             version3.14/version         /dependency 2、Controller   3、Service a、pdfService b、wordService c、excelService  4、Utils 5、模板截图   6、前端

    2024年02月08日
    浏览(34)
  • Java根据word模板生成word文档并转成PDF文件

    定义完我们的模板之后,我们要将文档保存为xml的格式 生成的xml格式看起来比较乱,没有层次感, 所以需要格式化一下 格式化 基础信息的定义 基础信息的定义只要保证我们转化成的xml文件中的${name}等格式没错误即可 表格的定义 遍历实现,表格的数据填充 在xml文件中我们的

    2024年02月09日
    浏览(40)
  • java利用模板导出word文档

    1.依赖: 1.普通数据 2.表格 3.1编辑模板:选中区域,按ctrl+F9,右键编辑域,选择邮件合并,输入参数 参数后面加“!”可以避免参数为null而报错,  3.2.代码:  3.3展示 1.数据类型 布尔型:等价于java的Boolean类型,不同的是不能直接输出,可转化为字符串输出 日期型:等价于

    2024年02月04日
    浏览(36)
  • (Java)word转pdf(aspose),pdf加水印(itextpdf),并支持POI模板(包括checkbox)导出

    目录 1、引入jar包 2、pdf处理工具类 3、poi模板导出工具类 4、测试类 5、模板 6、最终效果  1、引入jar包   2、pdf处理工具类  3、poi模板导出工具类  4、测试类 5、模板 6、最终效果 

    2024年02月06日
    浏览(60)
  • ExcelExportUtil基于模板导出excel&POI导出excel

    第一步,导入依赖没啥好说的; 第二步,查询数据库或es数据组装成list对象; 第三步,填充MapString, Object excelMap = new HashMap(); 数据key和excel模板对应,如果一次导出多个,可以用index区分; 第一步,导入依赖 第二步,上图哈哈 就是这么简单 没了

    2024年02月12日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包