目录
前言
在界面上填写或者选择然把选择填写的内容赋值到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.引入库
工程引入下面三个jar包,我使用的是3.9版本
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版本。