Android 将数据写入到word中

      继前两篇写了关于Android 如何将数据写入到Excel中后,此篇文章咋一起来看下如何将数据写入到Word中,因为在实际开发中公司有可能会提供一个word模板,然后要你将数据写入到模板对应的位置, 以下是我从项目中抽取一部分出来的。

      1、先下载对应的jar,共包含两个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中

       如要关注Android中如何将数据保存到提供模板的Excel中可参考如下地址:

       Android 如何将数据存入模板中的Excel

     


  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值