Android 使用Poi 修改Doc文档

目录

前言

一、Poi是什么?

二、使用步骤

1.引入库

2.创建Poi工具类

3.引用

3.模板样式

总结



前言

 在界面上填写或者选择然把选择填写的内容赋值到word文档里。文档就是模板。

Android 版本不同读取文件要做好适配。


 

一、Poi是什么?

 POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

结构:

HSSF - 提供读写Microsoft Excel格式档案的功能。

XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。

HWPF - 提供读写Microsoft Word格式档案的功能。

HSLF - 提供读写Microsoft PowerPoint格式档案的功能。

HDGF - 提供读写Microsoft Visio格式档案的功能。 

二、使用步骤

1.引入库

  Poi 下载地址

工程引入下面三个jar包,我使用的是3.9版本

 Poi 下载地址

 
  
 

2.创建Poi工具类


object PoiUtil {
    private val TAG = "PoiUtil"

    /**
     * 直接读取asset目录下的模板文件
     * @param context 上下文
     * @param openFileName 模板的文件名称
     * @param savePath 保存得文件路径
     * @param saveName 保存得文件名
     * @param map 需要替换的内容
     *
     * @return
     */
    fun init(
        context: Context,
        openFileName: String,
        savePath: String,
        saveName: String,
        map: HashMap<String, String>
    ) = if (writeToDoc(context.assets.open(openFileName), savePath, saveName, map)) {
        "$savePath$saveName"
    } else {
        null
    }


    /**
     * @param templetDocInStream 模板文件的InputStream
     * @param targetDocPath 保存得文件路径
     * @param targetDocName 保存得文件名
     * @param dataMap 需要替换的内容
     *
     * @return 成功 true 失败 false
     */
    private fun writeToDoc(
        templetDocInStream: InputStream,
        targetDocPath: String,
        targetDocName: String,
        dataMap: Map<String, String>
    ): Boolean {
        var file = File(targetDocPath)
        if (!file.exists()) {
            file.mkdirs()
        }
        file = File(targetDocPath + targetDocName)
        if (!file.exists()) {
            file.createNewFile()
        }

        val doc = HWPFDocument(templetDocInStream) //获取word文本内容,整个文本
        val out = FileOutputStream(file) //把doc输出到输出流中HDoc.write(out);
        try { //得到模板doc文件的HWPFDocument对象
            val range = doc.range //替换文本内容,将自定义的$xxx$替换成实际文本
            dataMap.entries.forEach {
                range.replaceText(it.key, it.value)
            }
            //写到另一个文件中
            doc.write(out)
            Log.e(TAG, "writeToDoc  成功保存路径》》${targetDocPath}$targetDocName")
            out.close()

            templetDocInStream.close()
            return true
        } catch (e: IOException) {
            Log.e(TAG, "writeToDoc IOException: $e")
            e.printStackTrace()
            return false
        } catch (e: Exception) {
            Log.e(TAG, "writeToDoc Exception: $e")
            e.printStackTrace()
            return false
        } finally {
            out.close()
            templetDocInStream.close()
        }

    }

}

3.引用

        val m = HashMap<String, String>()
// %xxxx% 是要和模板定义的标识一致
            m["%add%"] = "青岛"
            m["%preson%"] = "李四"
            m["%idcard%"] = "130109696945655"
            m["%year%"] = "2022" 
            PoiUtil.init(this, "doc/外出请假申请书.doc", "/sdcard/docs/", "外出请假申请书2.doc", m)

3.模板样式

每个人的模板都是不一样的


总结

 Android 版本不同读取文件要做好适配。

我使用的Poi是3.9版本。

猜你喜欢

转载自blog.csdn.net/weixin_41620505/article/details/127088278