1.下载poi相关jar包,导入工程,配置build.gradle文件
dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'
api fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.6'
}
2.创建空文档,文档内注入标签:$content$
3.创建PoiUtils 类,并实现
/**
* 生成一个doc文件
* @param templetDocPath 模板文件的完整路径
* @param targetDocPath 生成的目标文件的完整路径
* @param dataMap 替换的数据*/
public static void writeToDoc(String templetDocPath, String targetDocPath, Map<String,String> dataMap){
try
{
//得到模板doc文件的HWPFDocument对象
InputStream in = new FileInputStream(templetDocPath);
writeToDoc(in,targetDocPath,dataMap);
}
catch(IOException e)
{
e.printStackTrace();
}
}
/**
* 生成一个doc文件,主要用于直接读取asset目录下的模板文件,不用先复制到sd卡中
* @param templetDocInStream 模板文件的InputStream
* @param targetDocPath 生成的目标文件的完整路径
* @param dataMap 替换的数据*/
public static void writeToDoc(InputStream templetDocInStream, String targetDocPath, Map<String,String> dataMap){
try
{
//得到模板doc文件的HWPFDocument对象
HWPFDocument HDoc = new HWPFDocument(templetDocInStream);
// 获取word文本内容,整个文本
Range range = HDoc.getRange();
// 替换文本内容,将自定义的$xxx$替换成实际文本
for(Map.Entry<String, String> entry : dataMap.entrySet())
{
range.replaceText(entry.getKey(), entry.getValue());
}
//写到另一个文件中
FileOutputStream out = new FileOutputStream(targetDocPath, true);
//把doc输出到输出流中
HDoc.write(out);
out.close();
templetDocInStream.close();
}
catch(IOException e)
{
e.printStackTrace();
}
catch(Exception e)
{
e.printStackTrace();
}
}
4.创建桥文件,并在需要调用的地方调用:
private void create(MethodChannel.Result result,Map<String,String> argument) {
try {
InputStream templetDocStream = activity.getAssets().open("empty.doc");
String targetDocPath = activity.getExternalFilesDir("docTest").getPath() + File.separator + argument.get("name") + ".doc";//这个目录,不需要申请存储权限
Map<String, String> dataMap = new HashMap<String, String>();
dataMap.put("$content$", argument.get("content"));
PoiUtils.writeToDoc(templetDocStream,targetDocPath,dataMap);
result.success(targetDocPath);
} catch (IOException e) {
e.printStackTrace();
result.success("errorEnd");
}
}