继前两篇写了关于Android 如何将数据写入到Excel中后,此篇文章咋一起来看下如何将数据写入到Word中,因为在实际开发中公司有可能会提供一个word模板,然后要你将数据写入到模板对应的位置, 以下是我从项目中抽取一部分出来的。
1、先下载对应的jar,共包含两个jar包
2、在开发之前需要对word模板进行一些编辑,在需要写入数据的地方加入 $变量名$,效果图如下
3、在清单文件中加入对应的权限,同时也要注意在Android 6.0 时要动态申请sd卡的读写权限问题
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},
MY_PERMISSIONS_REQUEST);
} else {
printer();
}
注意回调的函数
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == MY_PERMISSIONS_REQUEST) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
printer();
} else {
// Permission Denied
Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();
}
return;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
4、将word模板放入到raw或者assets
5、在sd卡中新建一个文件夹,并将word文档保存到sd卡
/**
* 将文件复制到SD卡,并返回该文件对应的对象
*
* @return
* @throws IOException
*/
public void saveFile(String fileName, Context context, int rawid) throws IOException {
// 首先判断该目录下的文件夹是否存在
File dir = new File(Environment.getExternalStorageDirectory() + "/inspection/");
if (!dir.exists()) {
// 文件夹不存在 , 则创建文件夹
dir.mkdirs();
}
// 判断目标文件是否存在
File file1 = new File(dir, fileName);
if (!file1.exists()) {
file1.createNewFile(); // 创建文件
}
InputStream input = context.getResources().openRawResource(rawid); // 获取资源文件raw
try {
FileOutputStream out = new FileOutputStream(file1); // 文件输出流、用于将文件写到SD卡中
byte[] buffer = new byte[1024];
int len = 0;
while ((len = (input.read(buffer))) != -1) { // 读取文件,-- 进到内存
out.write(buffer, 0, len);
}
input.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
6、获取UI中对应的值,并通过map进行存值,最后将其写入到word文档中,具体代码如下
/**
* 为了保证模板的可用,最好在现有的模板上复制后修改
*/
private void printer() {
try {
saveFile("demo.doc", MainActivity.this, R.raw.demo);//文件目录res/raw
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//现场检查记录
String aafileurl = Environment.getExternalStorageDirectory() + "/inspection/demo.doc";
final String bbfileurl = Environment.getExternalStorageDirectory() + "/inspection/demo_printer.doc";
//获取模板文件
File demoFile = new File(aafileurl);
//创建生成的文件
File newFile = new File(bbfileurl);
if (newFile.exists()) {
newFile.delete();
}
Map<String, String> map = new HashMap<String, String>();
map.put("$companyName$", a1.getText().toString().trim());
map.put("$companyAddress$", a2.getText().toString().trim());
map.put("$companyPic$", a3.getText().toString().trim());
map.put("$companyWork$", a4.getText().toString().trim());
map.put("$companyPhone$", a5.getText().toString().trim());
map.put("$CheckAddress$", a6.getText().toString().trim());
map.put("$userName$", a7.getText().toString().trim());
map.put("$userNum$", a8.getText().toString().trim());
map.put("$content$", a9.getText().toString().trim());
writeDoc(demoFile, newFile, map);
}
/**
* demoFile 模板文件
* newFile 生成文件
* map 要填充的数据
*/
public boolean writeDoc(File demoFile, File newFile, Map<String, String> map) {
try {
FileInputStream in = new FileInputStream(demoFile);
HWPFDocument hdt = new HWPFDocument(in);
// 读取word文本内容
Range range = hdt.getRange();
// 替换文本内容
for (Map.Entry<String, String> entry : map.entrySet()) {
range.replaceText(entry.getKey(), entry.getValue());
}
ByteArrayOutputStream ostream = new ByteArrayOutputStream();
FileOutputStream out = new FileOutputStream(newFile, true);
hdt.write(ostream);
// 输出字节流
out.write(ostream.toByteArray());
out.close();
ostream.close();
Toast.makeText(this,"保存成功",Toast.LENGTH_SHORT).show();
return true;
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
7、好了,接下来可以运行项目了,但是运行的时候大家会发现提示错误
解决办法,在build文件里添加如下代码:
packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/dependencies.txt'
exclude 'META-INF/LGPL2.1'
}
8、最终的效果图如下
需要的同志们可以下载源码:
注意项目中没有对应的jar,所以jar包 的下载地址在文章的开始地方,下载完成后放入lib文件下即可
如要关注Android中如何将数据保存到新建的Excel表中可参考如下地址:
如要关注Android中如何将数据保存到提供模板的Excel中可参考如下地址: