安卓生成word文档(使用了Spire.Doc.Android)

最近产品提了一个新需求,让移动端生成word文件,不是那种表格型的,正常排版的数据,翻来翻去都没有找到合适的,最后发现了一个成熟的三方spire 跟大家分享一下,使用了免费版,有瑕疵,特此记录一下。 后端同事推荐还有一种poi也可以实现,这里只做简单的分享,大家可以自行去查阅poi相关的东西,都不难。

效果:

 首先:导入jar包,链接:https://pan.baidu.com/s/1tssXG67Etp1HfUTLNCE1Jg 
提取码:1024

然后直接上代码:

String namePaths = "";//生成的word文件路径
btn_output_word.setOnClickListener(new View.OnClickListener() {//导出word
    @Override
    public void onClick(View v) {
        //因为导出word中有图片,时间会稍微较长,为了体验加一个加载的loading,你们也可以忽略
        dialog1 = new LoadProgressDialog(MainActivity.this, "正在导出word...");
        dialog1.show();

         //需要文件读写权限
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED) {
                //数据源
            final List<ProblemTitleBean> list = new ArrayList<>();
            list.clear();
            list.addAll(beanList0);
            list.addAll(beanList1);
            list.addAll(beanList2);
            list.addAll(beanList3);
            if (list.size() < 1) {
                return;
            }
                //开启一个线程去做生成操作
            new Thread(new Runnable() {
                @Override
                public void run() {
                        // district_name:是我的word文件名开头
                    namePaths = outWordPaths(district_name, list);
                }
            }).start();
        }
    }
});

//关键方法

 private String outWordPaths(String distline_name, List<ProblemTitleBean> list) {
        //创建Word文档
        Document document = new Document();
        //添加一个section
        Section section = document.addSection();
        //添加三个段落至section
        Paragraph para1 = section.addParagraph();

        para1.appendText(distline_name + "台区现场排查异常问题报告");//标题



        for (int i = 0; i < list.size(); i++) {

            Paragraph para2 = section.addParagraph();
            para2.appendText((i + 1) + " 设备名称:" +         list.get(i).getProblem_name());
            Paragraph para3 = section.addParagraph();
            para3.appendText("问题描述:" + list.get(i).getProblem_text());
            //添加第二个段落
            Paragraph paragraph4 = section.addParagraph();
            //添加图片到段落(我这个是本地图片路径)
            if (list.get(i).getProblem_pic_path()!=null && list.get(i).getProblem_pic_path()!="") {
//添加图片的方法
                DocPicture picture = paragraph4.appendPicture(list.get(i).getProblem_pic_path());
                //设置图片宽度
                picture.setWidth(200f);
                //设置图片高度
                picture.setHeight(150f);
            }

            //设置其余两个段落的格式,因为没用到给注释了
//            ParagraphStyle style2 = new ParagraphStyle(document);
//            style2.setName("paraStyle");
//            style2.getCharacterFormat().setFontName("宋体");
//            style2.getCharacterFormat().setFontSize(11f);
//            document.getStyles().add(style2);
//            para2.applyStyle("paraStyle");
//            para3.applyStyle("paraStyle");

            //设置第二段和第三段的段首缩进
            para2.getFormat().setFirstLineIndent(25f);
            para3.getFormat().setFirstLineIndent(25f);
            paragraph4.getFormat().setFirstLineIndent(25f);

            //设置第一段和第二段的段后间距
            para2.getFormat().setAfterSpacing(10f);
            para3.getFormat().setAfterSpacing(10f);
            paragraph4.getFormat().setAfterSpacing(10f);
        }
        para1.getFormat().setAfterSpacing(15f);
        //将第一段作为标题,设置标题格式
        ParagraphStyle style1 = new ParagraphStyle(document);
        style1.setName("titleStyle");
        style1.getCharacterFormat().setBold(true);
        style1.getCharacterFormat().setTextColor(Color.BLUE);
        style1.getCharacterFormat().setFontName("宋体");
        style1.getCharacterFormat().setFontSize(12f);
        document.getStyles().add(style1);
        para1.applyStyle("titleStyle");

        //设置第一个段落的对齐方式
        para1.getFormat().setHorizontalAlignment(HorizontalAlignment.Center);

        //保存文档
        String path = Environment.getExternalStorageDirectory().getPath();
        //这里换成你们自己路径
        File file = new File(path + "/dfsoft/hippo/word");
        if (!file.exists()) {
            file.mkdirs();
        }
        String fileName = "";
        fileName = distline_name + "台区现场排查异常问题报告"+ ".docx";//文档格式docx

        String fileWordPath = file.getPath() + "/" + fileName;
        document.saveToFile(fileWordPath, FileFormat.Docx);
        mHandler.sendEmptyMessage(1);//这里是我开的线程,用来关闭dialog,不用的可以忽略
        return fileWordPath;
    }

最后 你就可以在创建的文件夹看到生成的文件;

我们需求是直接分享出去,

if (namePaths != null && !"".equals(namePaths)) {
    Intent email = tool.email(namePaths);
    startActivity(Intent.createChooser(email, "请选择邮件发送软件!"));
} else {
    Toast.makeText(MainActivity.this, "发送失败!", Toast.LENGTH_SHORT).show();
}

仅供大家参考,ps:因为是免费版所以生成的word首行会有个他们的水印,参考了两种方案,第一种就是自己手动删除(当然这太lowL);第二种我看网上说可以使用别的word操作框架去操作删除参考poi,不过这样会导致项目很大,感觉暂时没有好的处理方式,希望大家有好方法的可以知会我,一起分享进步~

完结,撒花

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值